![薛定宇教授大讲堂(卷Ⅱ):MATLAB微积分运算](https://wfqqreader-1252317822.image.myqcloud.com/cover/148/29977148/b_29977148.jpg)
4.1 函数的导数和高阶导数
本节先从导数的定义入手,介绍已知函数导数的求解方法,然后将介绍基于MATLAB的一阶导数与高阶导数计算,并引入数学归纳法及其MATLAB实现,更严格地得出某些函数的任意阶导数计算方法。
4.1.1 函数的导数与微分
前面两个例子在数学上是等效的,由此可以给出函数导数的定义。其实,有了MATLAB这样的工具,可以很容易地由定义直接计算给出的函数导数。当然在后续的内容中将给出更容易、更简洁的导数计算方法。
定义4-1 函数y=f(x)对自变量x的一阶导数定义为
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P62_23489.jpg?sign=1739236165-hPQy0dasuTGuCDSbDQgbx2lNRgqmVdpV-0-b888e7f74bf47e2eae121352362b01d0)
由定义看,曲线切线斜率就是已知曲线函数的导数函数,质点瞬时速度也是位移函数的导数函数。更进一步地,如果对瞬时速度再求一阶导数,可以得出质点的瞬时加速度;再继续求解则将得出函数的高阶导数。
定义4-2 如果∆x→0,则对自变量x而言,dx是其微分,而dy是函数y(x)的微分。
一个给定函数的导数可以通过求极限的方法直接得出,而求极限的方法前面一章已经充分叙述了,可以由limit()函数直接求解。这里将直接用例子演示求导的方法。
例4-3 给定函数,试由定义求出该函数的一阶导数。
解 利用第3章介绍的极限计算方法,根据定义就可以直接计算出一阶导函数。
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P62_23498.jpg?sign=1739236165-HqAAxdQhTCA6DKuxChYUYczELCaSOvQL-0-1f9a35480a90f2eb91b4faf72f1e8ede)
得出如下的结果:
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P62_23493.jpg?sign=1739236165-OeX7TUNgXofmCJkorOQ3MzVzMcBwGL9T-0-766591a01f0065edf66ad764288e54f6)
由fplot()函数可以直接绘制出原函数与一阶导数函数的曲线,如图4-1所示。
>> fplot([f,F],[0,5]); %将两个函数句柄放在一起绘制函数曲线
4.1.2 函数导数与高阶导数
f(x)函数对x的二阶导数就是f′(x)对x的导数,简记作f′′(x),三阶导数简记为f′′′(x),类似地,还可以定义出函数的n阶导数dnf(x)/dxn,简记作f(n)(x)。
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P63_23499.jpg?sign=1739236165-Jqsd7Wjv1JW9UCyrRmCtRhP00HzxJ4ZR-0-5b2a415084977aa7fa9bdded625291cd)
图4-1 函数及其一阶导数
如果函数和自变量都已知,且均为符号变量,则可以用diff()函数解出给定函数的各阶导数。diff()函数的调用格式为f1=diff(f,x,n),其中f为给定函数,x为自变量,这两个变量均应该为符号型的,n为导数的阶次,应该为具体的整数值,若省略n则将自动求取一阶导数;如果f表达式中只有一个符号变量,还可以省略变量x。
例4-4 给定函数,试求出
。
解 若想求取函数的导数,需要完成下面三个步骤的内容:
(1)申明x为符号变量;
(2)用MATLAB语句描述原函数;
(3)调用diff()函数直接得出函数的导数。
下面的语句可以完成这三个步骤,求出函数的一阶导数。得出的结果与例4-3中由导数定义求出的完全一致。
>> syms x; f(x)=sin(x)/(x^2+4*x+3); f1=diff(f)
原函数的四阶导数可以直接由下面的语句求出。
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P63_23507.jpg?sign=1739236165-I8XkeJNd8UufRMV7mvIr8JGLqCtneWae-0-11002245c0092544c0dd423c26cbe92c)
得出的结果比较冗长,由可以显示出更好的效果如下:
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P63_23509.jpg?sign=1739236165-lltDgkXFnvqFZpvZsaxtzTd3RRn0b9Om-0-db605f0b018a9fbc5d4da0d80b4c78c4)
从化简的结果看,单纯采用simplify()函数得出的化简结果不一定是令人满意的最简结果,需要再根据具体问题选择合适的化简方法。仔细分析上述结果可以发现,若按照sin x或cos x单独进行处理,则可能得出最简的结果。例如给出命令
>> simplify(collect(simplify(f4),cos(x)))
则可以得出下面给出的更简洁的结果。
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P64_23513.jpg?sign=1739236165-iqktFPhH5mqZZrRUL5qfsnSBjO5YATsW-0-7fb743fad05bc9774b5bd961ce2e68ca)
其中
f1(x)=8x7+112x6+552x5+1040x4−296x3−4080x2−5640x−2448
f2(x)=x8+16x7+72x6−32x5−1094x4−3120x3−3120x2+192x+1581
MATLAB现成的diff()函数还适合于求解给定函数更高阶的导数。例如,下面给出的命令一般可以在4s内获得该函数的100阶导函数(以Maple为符号运算引擎的MATLAB R2008a及早期版本所需时间不到1s)。
>> tic, diff(f,x,100); toc %求该函数的100阶导数并测耗时
例4-5 试求函数y(x)=(ax+b)/(cx+d)的n阶导数。
解 这里给出的f(x)不能用diff()函数求出n阶导数,n必须取作有限的正整数。可以尝试几个阶次。
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P64_23520.jpg?sign=1739236165-m1rioGVE4gdfDBo736I6spRFwp9qTkZp-0-cb69e37ee539ecf453ddffce16c51b7d)
由这些命令可以立即得出如下结论:
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P64_23522.jpg?sign=1739236165-iID8UKdUUuFfEGhmNvOxatmYJtg5nBQW-0-04164aff5e57f30d58729eb68e4f476c)
根据这些结果可以归纳出结论
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P64_23524.jpg?sign=1739236165-fZTAyYMG9yrS7HedqkldVpMiQ4u7wcx4-0-842cffd14ef734668d87ec892d05e0e5)
不过,这种凭几个公式直接归纳出来的结论往往不是严格的数学结论,这些结论需要进一步的严格数学证明,例如采用数学归纳法。
定义4-3 最简单且最常用的数学归纳法是假设n等于任意自然数时某命题成立。证明分为两个步骤:(1)先证明k=1时命题成立;(2)假设k=n时命题成立,由此推导出k=n+1时命题也成立。
例4-6 试用数学归纳法证明对任意自然数n,式(4-1-2)成立。
解 显然,前面已经证明了k=1时式(4-1-2)成立。假设k=n时式(4-1-2)成立,则对其右面再求一次导数就是(ax+b)/(cx+d)的n+1阶导数了。
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P65_23525.jpg?sign=1739236165-yspxM2qi4sUyeRUl9wuFs5y1kHQfTSs5-0-a9545868ce030de2b0e2b99d32ae8bf9)
这样,可以直接得出结果为(−1)ncnn!(ad−bc)(n+1)/(d+cx)n+2。由于(−1)n=(−1)n+2,n!(n+1)=(n+1)!,所以可见,k=n+1时式(4-1-2)也成立,从而由数学归纳法可以证明给出的命题。
定理4-1 (莱布尼茨公式)如果已知函数u(x)、v(x),则
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P65_23527.jpg?sign=1739236165-nSO3WUcCKl4TKFqqxToDZvgp8rebjoUk-0-48e2166e6265341e3623fe50df5c946a)
其中二项式系数
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P65_23528.jpg?sign=1739236165-xS9cBPqpkA82Pxri85EPU8DwLIPMiRbQ-0-ef66d06f9e748a7e1e29b4a06e2dbc85)
例4-7 试对较小的n验证定理4-1。
解 利用MATLAB并不能直接求取这个函数的n阶导数,所以只能对较小的n值进行验证性计算,例如给出下面的语句:
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P65_23530.jpg?sign=1739236165-2GC67BJK5WeZdb8PKO4oH5HbkES6TG0o-0-e4b86d5c0f92cf8f437126e4dc6e9677)
得出的结果如下:
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P65_24553.jpg?sign=1739236165-vHT0hPCHWkjMHAQ104AN4AAW2yLzOlFq-0-94bf5e2a147cd89f8f543c843fc9c926)
可见,对较小的n,可以用MATLAB验证莱布尼茨公式成立。当然,对任意正整数n,可以用数学归纳法证明莱布尼茨公式成立。不过这样的证明用手工方法比较容易,很难由计算机实现。
4.1.3 复合函数的导数
定理4-2 复合函数F(x)=f(g(x))的导数可以由下式求出
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P65_23533.jpg?sign=1739236165-a0nq6rkutUBdM1Kv38PfYGaOldXhA3c1-0-65b6b5b655f0118787ac58326bba18b4)
例4-8 试用MATLAB证明定理4-2。
解 可以给出下面的语句直接推导复合函数的导数
>> syms x g(x) f(x); diff(f(g(x)),x)
得出的结果为D(f)(g(x))*diff(g(x),x),由此得证。
其实有了MATLAB这样的工具,不一定非得通过定理4-2求解复合函数的导数,因为这些规则已经嵌入diff()函数,即使不知道这些定理,也可以直接使用diff()函数计算复合函数的导数。
例4-9 已知函数f(x)=u(x)v(x),试求f′(x)与f′′(x)。
解 定义了复合函数,直接调用diff()函数就可以计算出导数函数
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P66_23537.jpg?sign=1739236165-hS6F0Bzpj5JlndmYlPImAOe4DDxH7s8L-0-aaefc78ffc0e686e7c6f97adf9e9d4e7)
可以得出一阶导数
f′(x)=u(x)v(x)−1[v(x)u′(x)+ln u(x)u(x)v′(x)]
和二阶导数
f′′(x)=u(x)v(x)−2[v2(x)(u′(x))2−v(x)(u′(x))2+ln u(x)u2(x)v′′(x)+u(x)v(x)u′′(x)+(ln u(x))2u2(x)(v′(x))2+2u(x)u′(x)v′(x)+2 ln u(x)u(x)v(x)u′(x)v′(x)]
例4-10 试推导函数F(t)=t2f(t)sin t的三阶导函数公式,并得出f(t)=e−t时的三阶导数,将这样得出的结果与直接求导的结果相比较。
解 用syms函数可以定义出函数表达式f(t),这样由下面的语句可以直接推导出F(t)函数的三阶导函数公式。
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P66_23543.jpg?sign=1739236165-n2A03kzbu11GyAoJCiPyNWn2Z81R7Myk-0-9b760c2b40bf33cf866d4e3bac6a7e33)
得出的结果为
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P66_23545.jpg?sign=1739236165-3X0EgZOtTrS3yuORTpXO0NCCitbI4J7N-0-7a07a1f1b7fdc96bb570c7573b177fe2)
下面语句则可以直接推导出当f(t)=e−t时原函数的三阶导数,与直接求导结果完全一致。
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P66_23547.jpg?sign=1739236165-RXa4Yd7MUSyPnR3vZmZ3VmemqaOe3HW8-0-767329c761e7c8735cae008a55882657)
得出的导函数为y1(t)=2e−t(t2 cos t+t2 sin t−6t cos t+3 cos t−3 sin t)。
4.1.4 分段函数的导数
如果给出了分段函数的符号表达式,可以用MATLAB符号运算工具箱提供的diff()函数直接计算其导函数。下面通过例子演示求导的方法。
例4-11 试求出分段函数的导数。
解 由下面的语句直接将分段函数输入到MATLAB环境,然后就可以调用diff()函数,求出函数的一阶导函数。
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P67_23551.jpg?sign=1739236165-MHDwni8O8U2BRdMgw43J2dagqnQtufoy-0-2a4a50b5ee23360797862ae4f191cbdf)
可以直接得出导函数
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P67_23553.jpg?sign=1739236165-iXgRJMjhDXzWRCNjdskl6EKk9Gtdr1DK-0-11214eccd6c697880f60c37b84ea5e28)
可见,在x=0处导数函数没有定义。由下面的语句还可以直接绘制出函数及其一阶导数的曲线,如图4-2所示。原函数是连续函数,但其一阶导数不连续。
>> fplot([f,f1],[-2,2])
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P67_23556.jpg?sign=1739236165-TJGim5xg3TuWJ33jclYYJhFq68RcpqRp-0-8399d7c39093fed124157d714290f4d8)
图4-2 函数及其一阶导数
4.1.5 矩阵的导数
所谓矩阵的导数就是对矩阵的每个元素hij(x)逐个求导得出的矩阵。矩阵的导数也可以由diff()函数直接求取,无须其他特殊处理。
例4-12 试求矩阵函数的三阶导数矩阵。
解 利用diff()对H(x)的直接求导,得到新的导数矩阵N(x)。
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P67_23561.jpg?sign=1739236165-fd2TklbimX3rfCPmQ0bpbzDjVO5iTMHJ-0-06a4cb66574ecfce42a71a9ba4c1c3fc)
这样得出的三阶导数矩阵为
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P67_23563.jpg?sign=1739236165-h5dsvApcoOfL4UiGgkxREOqXCQ7lm7SM-0-15971900ae49e06c7fddb1f7215b5842)