一、函数的数值导数
本期对函数的求导运算同样适用于多项式,各位可以自行对比。
首先我们来思考导数运算规则
上面是y的差值,下面是x的差值。
我们介绍差分函数diff()
给出一列数,对其做diff()运算
A = [1,2,5,2,1];
diff(A)
结果如下:
ans =
1 3 -3 -1
可以看到diff()函数其实是差分运算,即用第k个数-第k-1个数,这样的话便可以得到n-1个差值。
那么我们用两个差分函数进行相除,不就可以得到函数在该点的导数了吗?
1.1求函数在某点处的导数
例1、给定函数
x0 = pi/2; h=0.1;
x = [x0,x0+h];
y = [sin(x0),sin(x0+h)];
m = diff(y)./diff(x) %注意这里是点除
结果如下:
m =
-0.0500
于是点
我们稍微思考一下就知道了,当h的取值越接近0,结果就越准确。这里希望各位同学可以尝试不同的h值(如0.1,0.01,0.001)代入来分析。
1.2 求函数在某段区间处的导数
与求某点处的导数类似,比如求x=[0,2π]
例2、画出sinx在[0,2π]的一阶导数图像
h = 0.5; x = 0:h:2*pi;
y = sin(x); m = diff(y)./diff(x);
plot(x,y,x(1:end-1),m,'ro--') %因为求过差值后,x的个数比原来少一个,所以用1:end-1表示
1.3 高阶求导
其实很简单,对求导过的数再进行一次求导。
例3、对于函数
x = -2:0.005:2; y = x.^3;
m = diff(y)./diff(x);
m2 = diff(m)./diff(x(1:end-1));
plot(x,y,x(1:end-1),m,x(1:end-2),m2);
xlabel('x','Fontsize',18);
ylabel('y','FontSize',18);
legend('f(x)=x^3','f''(x)','f''''(x)');
set(gca,'Fontsize',18);
二、函数定积分
首先介绍一下积分原理(不想了解可以直接跳到2.4)
2.1 矩形逼近
积分有多种方式,我们首先考虑一下这种,用矩形逼近的。原理如下图
举一个栗子:
例4、
h = 0.05; x = 0:h:2;
midpoint = (x(1:end-1)+x(2:end))./2; %相当于矩形的底
y = 4*midpoint.^3; %相当于矩形的高
s = sum(h*y) %底乘高为小矩形的面积,相加即可得到近似的解
结果如下:
s =
15.9950
误差0.005,可见还是很接近的,如果h取的足够小的话,可以控制误差在允许范围内。
2.2 梯形逼近
梯形逼近一般是要优于矩形逼近的,对于上题我们用矩形逼近来做。
h = 0.05; x = 0:h:2;
y = 4*x.^3;
s = h*trapz(y) %matlab自带矩形逼近的函数trapz(),我们直接用就行了
结果如下:
s =
16.0100
误差0.01,比矩形的误差还大,hhh。所以这告诉我们,梯形逼近不一定就优于矩形逼近。
*2.3 simpson逼近
对比一下矩形逼近和梯形逼近,我们可以发现,梯形其实是用中间一个点来进行逼近,而矩形则是用两边两个点进行逼近。还有一种方法是simpson方法,是取了三个点,其精度更高。我们这里不详细介绍,只给出一张图来进行对比
h = 0.05; x = 0:h:2;
y = 4*x.^3;
s = h/3*(y(1)+2*sum(y(3:2:end-2))+4*sum(y(2:2:end))+y(end))
结果如下:
s =
16
可以看到误差为0(只是因为本题较为简单,所以误差很小为0,其他则不一定),所以我们得出一个道理,其实就是把面积分得越细,得到的结果就越准确。
2.4 积分函数integral()
如果前面没有理解,没有关系。接下来介绍integral(),我们平常积分用的函数。integral其实和前面的算法是一样的,只不过划分区域更细了。具体用法如下:
integral(y,a,b)函数y在区间[a,b]的积分
例5、
y = @(x) 1./(x.^3-2*x-5); %要创建积分的函数
integral(y,0,2)
结果如下:
ans =
-0.4605
2.5 高次积分
matlab提供二次积分integral2() 和三次积分integral3()
例6、
f = @(x,y) y.*sin(x)+x.*cos(y);
integral2(f,pi,2*pi,0,pi)
结果如下:
ans =
-9.8696
例7、
f = @(x,y,z) y.*sin(x)+z.*cos(y);
integral3(f,0,pi,0,1,-1,1)
结果如下:
ans =
2.0000
三、函数直接求导与不定积分
在前面的内容,我们讲了求导与定积分运算,用两个diff()
函数做除法运算,那么我们来试试对于这种不给具体数值的运算是怎么做的。
例8、求该函数的导数
syms x
y = 4*x^5
diff(y) %对于这种符号方程,直接使用就可以,不用除以步长(因为步长无限小,也没法给一个准确的值)
方程的不定积分
int()
:求方程的不定积分(不带常数C)
例9、 求下列函数
其中:z(0)=0
syms x
y = x^2*exp(x);
z = int(y)
结果:
z =
exp(x)*(x^2 - 2*x + 2)
要注意int(y)
只是求出了y的不定积分,但是不带常数C。因此我们要求该常数C。根据已知条件z(0)=0。那么令X=0求出来的Z的积分,与实际结果0相比,做差即可得到。
这里直接用一个subs()
函数 ,即将x=0代入z的表达式求出的值,那么z-sub()
-0就是实际函数了
z = z-subs(z,x,0)
z =
exp(x)*(x^2 - 2*x + 2) - 2
总结:
本节我们学习了函数的求导以及积分运算,求导主要利用diff()函数,而定积分主要用到integral()函数,不定积分用到int()
函数。
作业:
请各位同学尝试求解
操千曲而后晓声,观千剑而后识器