![薛定宇教授大讲堂(卷Ⅱ):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=1739361104-myivkwSk06Z3JTTq1SDVyqVKpENWsyBs-0-0370747409cddbf1aa08b3cf3c58c2e7)
由定义看,曲线切线斜率就是已知曲线函数的导数函数,质点瞬时速度也是位移函数的导数函数。更进一步地,如果对瞬时速度再求一阶导数,可以得出质点的瞬时加速度;再继续求解则将得出函数的高阶导数。
定义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=1739361104-0pXvcTC53IgKZQY9Bl8GsJWoYH6HkmRC-0-d0303bbbd7089804a622d0b228178ed3)
得出如下的结果:
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P62_23493.jpg?sign=1739361104-Iq78mZDHyGTQa4usoaCLzFQQFsA8mhgv-0-cc1625f6d1cf4a1e2d69850af8a0b267)
由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=1739361104-5IJY6TcVDHZyn7ZknQjTCi4CFROlecEw-0-639f5caae9457acfc7ca36be09c7f2b5)
图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=1739361104-qp5LvgfhH7LAGV3zdlLB8ipYvqDcWVxx-0-d279c13bf481af25e30605588e0d248e)
得出的结果比较冗长,由可以显示出更好的效果如下:
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P63_23509.jpg?sign=1739361104-EyWPG314dWYOhFFTQo2y195pUiTJPaKg-0-54d1386c7738a618b1890ecf46597618)
从化简的结果看,单纯采用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=1739361104-GHDhR4FsD2P5z5FkfGL5nx8R3FX4dsGt-0-9b0c7978e06098bf7d638ce4da20be4f)
其中
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=1739361104-wYf4ELBYYdSSm1tcD3xP4pMY1sBtbxVl-0-89870753c6b7622a094beda797510ea1)
由这些命令可以立即得出如下结论:
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P64_23522.jpg?sign=1739361104-4BitZtzTlnUK7sjLRvyCCzPUPaimJwnZ-0-a339074ec53eaf28b3f5a46d3ffb045a)
根据这些结果可以归纳出结论
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P64_23524.jpg?sign=1739361104-zQg63MXLbNq5Q1CVisnpLdlANWRnjcfp-0-b4607bec39a3a9da06cde744063c23ea)
不过,这种凭几个公式直接归纳出来的结论往往不是严格的数学结论,这些结论需要进一步的严格数学证明,例如采用数学归纳法。
定义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=1739361104-pGxldxXmRtmHdzQncGRcO50tBMrI8LZB-0-6280daf011b915d22515751781cc7a4c)
这样,可以直接得出结果为(−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=1739361104-8wvud1NUXC3xYy9ZUOYWawATPeKT8fVQ-0-64fb3973d38d90ba0b6a6a93dccf65b5)
其中二项式系数
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P65_23528.jpg?sign=1739361104-s88YtmgpTH8F3onRAbqu5O0EEMRLwlY9-0-c4d2ab16b9139dd7286a7b27ded036b0)
例4-7 试对较小的n验证定理4-1。
解 利用MATLAB并不能直接求取这个函数的n阶导数,所以只能对较小的n值进行验证性计算,例如给出下面的语句:
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P65_23530.jpg?sign=1739361104-eplrU6tijekH1yOo6bcZ1FlBk29YZ2eX-0-a9db12625f59c523d0f73d81ee32850b)
得出的结果如下:
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P65_24553.jpg?sign=1739361104-SDglkslRPx58BBe12CpJUFznhAJAo7bg-0-f58f79aca75d0bf9fc138373331c11ef)
可见,对较小的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=1739361104-1dMlL1sYv30o2q68Sg5o44Xb7X6eW8DP-0-433396dd4a23c46f835caf52f6a0fad2)
例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=1739361104-SSvuQCA3T9lY46f5fFbXlUawhR2Z5MAi-0-a0f3fe44abac515471c64d08e686347a)
可以得出一阶导数
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=1739361104-xc9HFxXNxFzEhcMpZ5XabaB8FAuHjgTI-0-8f8f40b48b4fab35d3a839af4a93d28a)
得出的结果为
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P66_23545.jpg?sign=1739361104-Zo5f0y4CUneZZuXqJ7RVGBOC7Z7pE0yp-0-1dbef0bb7f2374f1833379b7f176be43)
下面语句则可以直接推导出当f(t)=e−t时原函数的三阶导数,与直接求导结果完全一致。
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P66_23547.jpg?sign=1739361104-HR0LopyeI53d5DAbeBM9007oQV3RndwL-0-5d7e376deefeb46a374e0a28ee0ec7f2)
得出的导函数为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=1739361104-aG9FaD7t8fdlckXrC6uj0PNcYHkDen8N-0-dba6f74b40eab83a6006a36a5b86e643)
可以直接得出导函数
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P67_23553.jpg?sign=1739361104-r9Z5eYsBGZMSYZyFgHTRc4iSk3A5vMcq-0-905af0e87a1be6579ef456de8c8923db)
可见,在x=0处导数函数没有定义。由下面的语句还可以直接绘制出函数及其一阶导数的曲线,如图4-2所示。原函数是连续函数,但其一阶导数不连续。
>> fplot([f,f1],[-2,2])
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P67_23556.jpg?sign=1739361104-VbNkiamo5juKDHBr08YkcYR2PlfHBoQ9-0-5eeee31edf2c4dfb305a47ed6651b598)
图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=1739361104-ujFolGcrtTw8Ts9nRiSu26KiEEtO9LFi-0-4a1c60ec4386d5af4c9720fa06778558)
这样得出的三阶导数矩阵为
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P67_23563.jpg?sign=1739361104-JD8tNfDrUti9uGC8XujlHh0TS7Wq8ECm-0-a0f06f14c5e71837810622bfc4dc7456)