已知函数 y = a e x a + x 2 y=\frac{ae^x}{\sqrt{a+x^2}} y=a+x2aex,求解该函数在以下情形对应点x处的二阶导数值.
(1) a = 2, x = 3a = 6.
(2) a = 3, x = 2a =6.
编写本问题的函数文件第一行格式如下(函数名、文件名自己设定):
function r=myfun
%变量r存储导数值
解:
定义符号计算函数来求解,程序如下:
function r = myfun
syms y(a,x) %定义符号变量
y = a*exp(x)/sqrt(a+x^2); %计算y符号表达式
d2 = diff(y,x,2); %求y对x二阶导函数
r1 = double(subs(d2,[a,x],[2,6])); %代入具体数值
r2 = double(subs(d2,[a,x],[3,6]));
r = [r1,r2]; %组成返回结果
运行结果:
编写程序用符号工具箱函数求定积分 ∫ 0 π e 2 c o s x c o s x d x \int_0^\pi{e^{2cosx}cosx}\,dx ∫0πe2cosxcosxdx
解:
代码:
function I = myfun
syms y x
y = exp(2*cos(x))*cos(x);
I = double(int(y,x,0,pi));
运行结果:
用dsolve求解下列微分方程,并绘制解函数曲线
y ′ ′ + 2 y ′ + y = 1 , y ( 0 ) = 3 , y ′ ( 0 ) = 0 y^{''}+2y^{'}+y=1,y(0)=3,y^{'}(0)=0 y′′+2y′+y=1,y(0)=3,y′(0)=0
代码:
syms y(x) %定义函数
d1 = diff(y,1); %定义一阶导函数
d2 = diff(y,2); %定义二阶导函数
s = dsolve(d2+2*d1+y==1,y(0)==3,d1(0)==0,x) %求解微分方程
x0 = -20:0.01:20; %选定绘图区间
y = double(subs(s,x,x0)); %计算函数在区间上函数值
plot(x0,y) %绘图
运行结果:
寻找拐点的问题
如果我们已经知道连续函数的解析表达式,则可以利用拐点的定义寻找出该函数的拐点.根据拐点定义及判别方法可知:如果函数在一个点两侧二阶导数异号,则该点对应曲线上的点即为拐点.
现实问题中,往往没有这种已知条件较为充足、理想的情况.例如,如果知道一个函数的某些离散节点的函数值,能否找出函数的拐点.
问题(寻找拐点问题) 已知函数 y = y ( x ) y=y(x) y=y(x)在若干个点的函数值,具体数据如表1所示.请找出函数在[0,12]区间上的所有可能的拐点.
提示:可以用离散点函数值近似估算二阶导数值。
表1 函数在若干节点的函数值
k | x k x_k xk | y k y_k yk |
---|---|---|
1 | 0.0 | 2.4051 |
2 | 0.2 | 2.8759 |
3 | 0.4 | 3.4072 |
4 | 0.6 | 3.9690 |
5 | 0.8 | 4.5147 |
6 | 1.0 | 4.9844 |
7 | 1.2 | 5.3149 |
8 | 1.4 | 5.4541 |
9 | 1.6 | 5.3752 |
10 | 1.8 | 5.0849 |
11 | 2.0 | 4.6224 |
12 | 2.2 | 4.0482 |
13 | 2.4 | 3.4297 |
14 | 2.6 | 2.8260 |
15 | 2.8 | 2.2793 |
16 | 3.0 | 1.8125 |
17 | 3.2 | 1.4322 |
18 | 3.4 | 1.1336 |
19 | 3.6 | 0.9059 |
20 | 3.8 | 0.7364 |
21 | 4.0 | 0.6131 |
22 | 4.2 | 0.5258 |
23 | 4.4 | 0.4668 |
24 | 4.6 | 0.4302 |
25 | 4.8 | 0.4125 |
26 | 5.0 | 0.4114 |
27 | 5.2 | 0.4263 |
28 | 5.4 | 0.4575 |
29 | 5.6 | 0.5064 |
30 | 5.8 | 0.5748 |
31 | 6.0 | 0.6648 |
32 | 6.2 | 0.7776 |
33 | 6.4 | 0.9129 |
34 | 6.6 | 1.0671 |
35 | 6.8 | 1.2324 |
36 | 7.0 | 1.3961 |
37 | 7.2 | 1.5416 |
38 | 7.4 | 1.6501 |
39 | 7.6 | 1.7052 |
40 | 7.8 | 1.6966 |
41 | 8.0 | 1.6234 |
42 | 8.2 | 1.4945 |
43 | 8.4 | 1.3263 |
44 | 8.6 | 1.1387 |
45 | 8.8 | 0.9503 |
46 | 9.0 | 0.7756 |
47 | 9.2 | 0.6233 |
48 | 9.4 | 0.4971 |
49 | 9.6 | 0.3965 |
50 | 9.8 | 0.3188 |
51 | 10.0 | 0.2605 |
52 | 10.2 | 0.2178 |
53 | 10.4 | 0.1875 |
54 | 10.6 | 0.1670 |
55 | 10.8 | 0.1546 |
56 | 11.0 | 0.1490 |
57 | 11.2 | 0.1496 |
58 | 11.4 | 0.1565 |
59 | 11.6 | 0.1701 |
60 | 11.8 | 0.1913 |
任务1:先给出找拐点算法思想、步骤;
任务2:编写程序,输出可能的拐点.
熟悉拐点的概念;
理解导数、二阶导数的近似计算方法;
任务1:实验思路
先估算出各点的二阶导数
根据二阶泰勒多项式,得到
f ( a + h ) = f ( a ) + h f ′ ( a ) + h 2 2 f ′ ′ ( a ) + O ( h 2 ) f(a+h)=f(a)+hf^{'}(a)+\frac{h^2}{2}f^{''}(a)+O(h^2) f(a+h)=f(a)+hf′(a)+2h2f′′(a)+O(h2) ①
f ( a − h ) = f ( a ) − h f ′ ( a ) + h 2 2 f ′ ′ ( a ) + O ( h 2 ) f(a-h)=f(a)-hf^{'}(a)+\frac{h^2}{2}f^{''}(a)+O(h^2) f(a−h)=f(a)−hf′(a)+2h2f′′(a)+O(h2) ②
联立①②可得
f ′ ′ ( a ) = f ( a + h ) + f ( a − h ) − 2 f ( a ) h 2 + O ( h 2 ) f^{''}(a)=\frac{f(a+h)+f(a-h)-2f(a)}{h^2}+O(h^2) f′′(a)=h2f(a+h)+f(a−h)−2f(a)+O(h2)
本函数的节点的步长为0.2,所以h=0.2,除去最小节点和最大节点,可计算出其他节点的二阶导数,接着找到两侧二阶导数异号的节点即为拐点。
具体数据可复制到excel中然后调用MATLANB中xlsread函数来实现快速读取。
任务二:
将“表1 函数在若干节点的函数值”保存在同一文件夹下的data.xls文件中,如下图所示(截取部分):
代码:
% 读取Excel文件
filename = 'data.xlsx';
sheet = 1; % 工作表编号
range = 'B3:C62'; % 范围
[num, txt, raw] = xlsread(filename, sheet, range);
%读取x和y
x = num(:,1);
y = num(:,2);
%计算除端点外的点的二阶导函数并存储到D2中
h = 0.2; %规定步长
D2=[];
for i = 2:59
d2 = (y(i-1)+y(i+1)-2*y(i))/h^2;
D2 = [D2,d2];
end
%找到两端异号的点的横坐标和纵坐标并存储到x1和y1中
x1 = [];
y1 = [];
for i = 1:57
if D2(i)*D2(i+1)<0
x1 = [x1,(x(i+1)+x(i+2))/2];
y1 = [y1,(y(i+1)+y(i+2))/2];
end
end
%输出拐点横纵坐标
disp(x1);
disp(y1);
%绘制图像便于直观观察
plot(x,y,'-b.')
set(gcf,'color','w')
set(gca,'fontsize',14)
hold on
plot(x1,y1,'r+','markersize',15);
运行结果:
第一行为拐点横坐标,第二行为纵坐标,上下一一对应。从运行结果可知,一共找到了四个可能的拐点,绘制图像如下:
其中红色十字标注位置即为拐点.
在本次实验中, 我较好地完成了实验任务, 得到预期结果, 达到实验目标.以后仍然需要巩固数学基础知识, 为实验课程提供坚实的理论基础和保障.
在本次实验中,我体会最深的就是使用泰勒公式求解离散型函数二阶导数的方法,在微积分理论课程学习中,研究的都是连续型函数,也没有修读离散数学,所以初次见到题目便不知所措,在老师的指点下,用泰勒公式成功完成本次实验。
通过本次实验,我更加真切的体会到理论与实践结合的学习方法的高效性,以后将继续保持这个良好习惯。