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+2,n!(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))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)函数的三阶导函数公式。
得出的结果为
下面语句则可以直接推导出当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)。
这样得出的三阶导数矩阵为