薛定宇教授大讲堂(卷Ⅱ):MATLAB微积分运算
上QQ阅读APP看书,第一时间看更新

4.1 函数的导数和高阶导数

本节先从导数的定义入手,介绍已知函数导数的求解方法,然后将介绍基于MATLAB的一阶导数与高阶导数计算,并引入数学归纳法及其MATLAB实现,更严格地得出某些函数的任意阶导数计算方法。

4.1.1 函数的导数与微分

前面两个例子在数学上是等效的,由此可以给出函数导数的定义。其实,有了MATLAB这样的工具,可以很容易地由定义直接计算给出的函数导数。当然在后续的内容中将给出更容易、更简洁的导数计算方法。

定义4-1 函数y=f(x)对自变量x的一阶导数定义为

由定义看,曲线切线斜率就是已知曲线函数的导数函数,质点瞬时速度也是位移函数的导数函数。更进一步地,如果对瞬时速度再求一阶导数,可以得出质点的瞬时加速度;再继续求解则将得出函数的高阶导数。

定义4-2 如果∆x→0,则对自变量x而言,dx是其微分,而dy是函数y(x)的微分。

一个给定函数的导数可以通过求极限的方法直接得出,而求极限的方法前面一章已经充分叙述了,可以由limit()函数直接求解。这里将直接用例子演示求导的方法。

例4-3 给定函数,试由定义求出该函数的一阶导数。

利用第3章介绍的极限计算方法,根据定义就可以直接计算出一阶导函数。

得出如下的结果:

由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)。

图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)

原函数的四阶导数可以直接由下面的语句求出。

得出的结果比较冗长,由可以显示出更好的效果如下:

从化简的结果看,单纯采用simplify()函数得出的化简结果不一定是令人满意的最简结果,需要再根据具体问题选择合适的化简方法。仔细分析上述结果可以发现,若按照sin x或cos x单独进行处理,则可能得出最简的结果。例如给出命令

     >> simplify(collect(simplify(f4),cos(x)))

则可以得出下面给出的更简洁的结果。

其中

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必须取作有限的正整数。可以尝试几个阶次。

由这些命令可以立即得出如下结论:

根据这些结果可以归纳出结论

不过,这种凭几个公式直接归纳出来的结论往往不是严格的数学结论,这些结论需要进一步的严格数学证明,例如采用数学归纳法。

定义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阶导数了。

这样,可以直接得出结果为(−1)ncnn!(ad−bc)(n+1)/(d+cx)n+2。由于(−1)n=(−1)n+2n!(n+1)=(n+1)!,所以可见,k=n+1时式(4-1-2)也成立,从而由数学归纳法可以证明给出的命题。

定理4-1莱布尼茨公式)如果已知函数u(x)、v(x),则

其中二项式系数

例4-7 试对较小的n验证定理4-1。

利用MATLAB并不能直接求取这个函数的n阶导数,所以只能对较小的n值进行验证性计算,例如给出下面的语句:

得出的结果如下:

可见,对较小的n,可以用MATLAB验证莱布尼茨公式成立。当然,对任意正整数n,可以用数学归纳法证明莱布尼茨公式成立。不过这样的证明用手工方法比较容易,很难由计算机实现。

4.1.3 复合函数的导数

定理4-2 复合函数F(x)=f(g(x))的导数可以由下式求出

例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()函数就可以计算出导数函数

可以得出一阶导数

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))2v(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)函数的三阶导函数公式。

得出的结果为

下面语句则可以直接推导出当f(t)=e−t时原函数的三阶导数,与直接求导结果完全一致。

得出的导函数为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()函数,求出函数的一阶导函数。

可以直接得出导函数

可见,在x=0处导数函数没有定义。由下面的语句还可以直接绘制出函数及其一阶导数的曲线,如图4-2所示。原函数是连续函数,但其一阶导数不连续。

     >> fplot([f,f1],[-2,2])

图4-2 函数及其一阶导数

4.1.5 矩阵的导数

所谓矩阵的导数就是对矩阵的每个元素hij(x)逐个求导得出的矩阵。矩阵的导数也可以由diff()函数直接求取,无须其他特殊处理。

例4-12 试求矩阵函数的三阶导数矩阵。

利用diff()对H(x)的直接求导,得到新的导数矩阵N(x)。

这样得出的三阶导数矩阵为