![薛定宇教授大讲堂(卷Ⅱ):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=1738992985-hC3DqQ2eE8OlEJgypfiLaQAlemnSAyyL-0-597dfbf80559fc1fa2a6b8b76ed76e58)
由定义看,曲线切线斜率就是已知曲线函数的导数函数,质点瞬时速度也是位移函数的导数函数。更进一步地,如果对瞬时速度再求一阶导数,可以得出质点的瞬时加速度;再继续求解则将得出函数的高阶导数。
定义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=1738992985-zIOjKtCym5WFD1sMNWdMsB5pkPkvTHP5-0-994b7108841d8bc9086e4d74227c4bd4)
得出如下的结果:
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P62_23493.jpg?sign=1738992985-IXSTRw8fq4Fm7MOjTZj5JYlrlkfvgnOY-0-37e73195ef68584c3512dfa2bb4d5589)
由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=1738992985-1D7Riogc79CyQwhrAg4I7R1wSx6gBWF9-0-32df0ad513d4ba744721985ab3862f75)
图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=1738992985-2hmLnZkS5YmJ9Gzp4A9CwmXKm0qotXEJ-0-83a1dff9c6d81bf965345d3fb9c09e0d)
得出的结果比较冗长,由可以显示出更好的效果如下:
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P63_23509.jpg?sign=1738992985-uAF9bj2wXo8HQ3VeLyzC1NbJ062CXNU2-0-3b8d8e92305f336e30392b41a0ca877a)
从化简的结果看,单纯采用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=1738992985-rq8AagUGhG7kwRzer6l5SFVMX29g6Uep-0-59136ac00079a98ae9c9d3f0e5ff6830)
其中
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=1738992985-NmlITZop6iLtFSkd0xAEjezNMDfxr7rD-0-a8fe28ab4fba9b5ab4e91c0d6f796adb)
由这些命令可以立即得出如下结论:
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P64_23522.jpg?sign=1738992985-0wGrKz4FWwgfROfY2OlrSLCY8S3tIUmy-0-0b341d55e162e9f4fcac2645dfef1efe)
根据这些结果可以归纳出结论
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P64_23524.jpg?sign=1738992985-OTKClbC4NKJFH9szpweMWpdi3gngrkuz-0-5ce893b3b7f2c93b480a7ce37bc1e2de)
不过,这种凭几个公式直接归纳出来的结论往往不是严格的数学结论,这些结论需要进一步的严格数学证明,例如采用数学归纳法。
定义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=1738992985-lSIwBlCJz0zzvDjQnS3k4CXa2hb9kn72-0-57954d2015e1fa36855e0b8c46387dda)
这样,可以直接得出结果为(−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=1738992985-U0m6HXpBGITZ0ySMReMRyRDiFqHH4BiO-0-b8cc132777ade034427c2add2f5d92c4)
其中二项式系数
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P65_23528.jpg?sign=1738992985-sek8mwtXJtpNTrNBoj0NCIWyjPb6aHqo-0-c5996e91ce3fc486f8b9d1665fb811da)
例4-7 试对较小的n验证定理4-1。
解 利用MATLAB并不能直接求取这个函数的n阶导数,所以只能对较小的n值进行验证性计算,例如给出下面的语句:
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P65_23530.jpg?sign=1738992985-g98wEd0Wkx2FqmhX3kiru88411Lz1qaf-0-4d90ab53e5d9029c8d6e5990e9990fc6)
得出的结果如下:
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P65_24553.jpg?sign=1738992985-032JisXInjH8AD09yDZqK8sFxOcfrxtC-0-31d9b4c1080c783e2ecb33a1c7730fc6)
可见,对较小的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=1738992985-3nlTlR7tqhHOkScezeqB2IXAev6NiDNh-0-65c4c474cb43d2a0f12540763b2e9449)
例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=1738992985-iZj3huTWQF469dWRRRmhkasZsHiiKzuV-0-a0cb98cb96207baee24866fdafbd27b3)
可以得出一阶导数
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=1738992985-KMwzGUSF7ACDbkXhvYccWwMc9WmKaBYL-0-edb22995f71dae3974d952e84b1c1c00)
得出的结果为
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P66_23545.jpg?sign=1738992985-MhVBjmg3IQYZnAKjgUUHSWqGb6ATJKWX-0-1e0befe2fa4f140a07370e57101a4119)
下面语句则可以直接推导出当f(t)=e−t时原函数的三阶导数,与直接求导结果完全一致。
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P66_23547.jpg?sign=1738992985-sMNeZFcrQC6oAVbpFRX5DIlJR7MtQtwF-0-44b081890bf66c9f5e29355a4fcc0b35)
得出的导函数为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=1738992985-CZvqcNdMbjDEDlHz64JczpeagxKH2rcd-0-8f2baa96e77f8a965cc95a040bb0351d)
可以直接得出导函数
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P67_23553.jpg?sign=1738992985-VOyxzjnDOfT5MqL4j6dGqwVoI5FHqKmF-0-733b57c55e0c2534ff885c2a7c102075)
可见,在x=0处导数函数没有定义。由下面的语句还可以直接绘制出函数及其一阶导数的曲线,如图4-2所示。原函数是连续函数,但其一阶导数不连续。
>> fplot([f,f1],[-2,2])
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P67_23556.jpg?sign=1738992985-Lo3heUk12YIn1KAgJ5RIaEJfn8o2C2LA-0-4b52cd0b1c178deca19be39cdba7c2f1)
图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=1738992985-dvGI5tf7UPUEXnvvqCFSWm33kPk2r0TU-0-dc725bc421ad4af526f5ec8c0e329645)
这样得出的三阶导数矩阵为
![](https://epubservercos.yuewen.com/30E2CE/16499866805000006/epubprivate/OEBPS/Images/Figure-P67_23563.jpg?sign=1738992985-J1QTXe1ZQKp7gKt73tHMD8qcIUHcKJGb-0-bcdba82568961ebb18baf57a61bd3b09)