第3章微分中值定理与导数的应用 第2章介绍了导数的概念以及导数的计算,本章将会介绍导数的应用以及相关的知识。 按照理论与应用,本章分为微分中值定理及导数应用两个部分。前者具体地介绍了作为导数应用理论基础的微分中值定理,包括罗尔定理、拉格朗日中值定理和柯西中值定理等。而导数应用部分则具体介绍了洛必达法则、泰勒公式等这些在数学、物理中常用的原理,包括判断函数单调性、凹凸性和求拐点这些分析函数的工具,还有函数图形的绘制、求函数的曲率和方程近似解这些在工程当中广泛使用的关于导数的应用。 3.1本章目标 与本章相关的MATLAB实现会以导数的应用这部分为重点,具体将使用MATLAB实现以下内容: (1) 验证洛必达法则; (2) 对合适的函数在任意点的任意阶进行泰勒展开; (3) 绘制函数图形; (4) 求函数的最大值、最小值; (5) 求函数的零点; (6) 判断函数的单调性和曲线的凹凸性; (7) 求函数的曲率; (8) 用二分法求零点。 因为通过计算机学习高数和一般的学习有所不同,为了方便MATLAB数学实现的进行,调整了部分章节的顺序。 值得一提的是,函数的泰勒展开以及求函数最值、极值、零点和判断函数单调性等知识曾在近代科学技术发展中起了十分重要的作用,而在计算机技术发达的今天,可以通过计算机更好地进行分析和计算,为科学技术的发展提供更强大的数学工具。 3.2相关命令 下面介绍本章涉及的相关命令。 (1) limit: 求极限。用法如下: limit(f,var,a): 函数f在变量var下在a处的双向极限。 limit(f,a): 函数f在默认变量下在a处的双向极限。 limit(f): 函数f在默认变量下在0处的双向极限。 limit(f,var,a,'left'): 函数f在变量var下在a处的左极限。 limit(f,var,a,'right'): 函数f在变量var下在a处的右极限。 (2) log: 求自然对数。 (3) taylor: 求泰勒展开。用法如下: taylor(f,var): 默认为五阶Maclaurin展开。 taylor(f,var,a): 默认为五阶的在a点的泰勒展开。 taylor(f,var,a,'order',n): 在a点的n-1阶泰勒展开。 (4) vpa: 变量精度控制。用法如下: vap(x): 将结果x转化为小数。 vpa(fun,n): fun为待积分函数,n为精确位数。 (5) fzero: 求零点。用法如下: fzero(f,[a,b]),注意: 需要f(a)*f(b)<0。 (6) fminbnd(fun,a,b): 求函数在区间[a,b]上的最小值。 (7) max(A): 返回数组A的最大元素。 (8) min(A): 返回数组A的最小元素。 (9) round(a): 取离a最近的整数(四舍五入)。 3.3洛必达法则 先回顾一下洛必达法则的理论知识: 定理31设 (1) 当x→a时,函数fx及Fx都趋于零; (2) 在点a的某去心邻域内,f′x与F′x都存在,且F′x≠0; (3) limx→af′xF′x存在(或为无穷大), 则 limx→afxFx=limx→af′xF′x 定理32设 (1) 当x→a时,函数fx及Fx都趋于零; (2) 当x>N时,f′x与F′x都存在,且F′x≠0; (3) limx→∞f′xF′x存在(或为无穷大), 则 limx→afxFx=limx→af′xF′x 可以看到,通过洛必达法则,未定式的极限可能会变成确定的极限。MATLAB中有求极限的函数,下面将通过几个例子使用MATLAB来验证洛必达法则。 例31求limx→0sinaxsinbx b≠0。 解: syms a b x; f=sin(a*x); g=sin(b*x); %通过内置的limit函数来直接求极限 L=limit(f/g,x,0) L = ab %通过内置的求导函数和limit函数求出洛必达法则下的极限 df=diff(f,x); dg=diff(g,x); L1=limit(df/dg,x,0) L1 = ab 故L=L1,正好证明了洛必达法则。 例32使用MATLAB求 limx→∞lnxxn n>0 和其洛必达意义下的极限。 解: %输入变量且n>0 syms n positive syms x %通过内置的limit函数来直接求极限 f=log(x); g=x^n; L=limit(f/g,x,+Inf) L = 0 %通过内置的求导函数和limit函数求出洛必达法则下的极限 df=diff(f,x); dg=diff(g,x); L1=limit(df/dg,x,+Inf) L1 = 0 上面的两个例子,求得了两个分式在洛必达法则下的极限,也求得了分式的极限,并且容易看出直接求得的极限与洛必达法则下得到的极限相同。 但是值得强调的是,洛必达法则这个定理只具有充分性,并不具有必要性。也就是说,一个满足命题条件的函数,即使极限存在,洛必达意义下的极限也可能不存在。大家可以尝试举例。 3.4泰勒展开 定理33 (泰勒中值定理1) 如果函数fx在x0处具有n阶导数,那么存在x0的一个邻域,对于该邻域内的任一x,有 fx=fx0+f′x0x-x0+f″x02!x-x02+…+ fnx0n!x-x0n+Rnx 其中, Rnx0=ox-x0n 定理34(泰勒中值定理2) 如果函数fx在x0的某个邻域Ux0内具有n+1阶导数,那么对任一x∈Ux0,有 fx=fx0+f′x0x-x0+f″x02!x-x02+…+ fnx0n!x-x0n+Rnx 其中, Rnx=fn+1ξn+1!x-x0n+1 这里的ξ是x0与x之间的某个值。 例33 写出函数fx=ex的带有拉格朗日余项的10阶麦克劳林公式,并计算得到的多项式在x=1处的误差。 解: syms x %利用内置函数taylor得到exp(x)在零点的泰勒展开,在十一阶阶段,即得到十阶展开 f(x)=taylor(exp(x),x,'order',11) f(x) = x103628800+ x9362880+ x840320+ x75040+ x6720+ x5120+ x424+ x36+ x22+x+1 %计算x=1处的误差,并用小数表示 vpa(exp(1)-f(1)) ans = 0.00000002731266105516699509734388053207 例34 利用带有佩亚诺余项的麦克劳林公式,求极限limx→0sinx-xcosxsin3x。 解: syms x %利用内置函数taylor得到分式上下两部分的麦克劳林展开 f1(x)=taylor(sin(x)-x*cos(x)) f1(x) =x33-x530 f2(x)=taylor((sin(x))^3) f2(x) =x3-x52 由于x→0,极限只与低阶项有关,易得极限为1/3。 泰勒展开在物理化学等科学技术上有广泛的应用。本质上来说,它是一种使用简单函数较好地近似代替复杂函数的途径。我们熟悉的简单函数不仅包括幂函数,还有三角函数,而使用三角函数去逼近函数的方式称之为函数的傅里叶展开。泰勒展开在具体的使用过程中可能有一定的局限性,这时傅里叶级数可以用来更好地吻合函数。 fx在[-π,π]上的傅里叶展开为 fx=a02+∑∞n=1ancosnx+bnsinnx 其中, an=1π∫π-πfxcosnxdx bn=1π∫π-πfxcsinnxdx 傅里叶展开对函数的要求较低,它只要求函数的可积性(指黎曼可积或反常积分意义下绝对可积,后面几章会介绍),回顾前面的内容可以知道泰勒展开需要函数有较好的光滑性(多阶可导),然而这在现实应用中是比较严苛的性质,所以虽然傅里叶展开较泰勒展开烦琐,但傅里叶展开有更广泛的应用。 例35绘制 y=sinx在-π,π上的n阶泰勒展开及原函数的图形,其中n=1, 3, 5, 7, 9。 解: syms x %原函数y=sinx y=sin(x); %写出1-9阶泰勒展开 y1=taylor(sin(x),x,'order',2); y2=taylor(sin(x),x,'order',4); y3=taylor(sin(x),x,'order',6); y4=taylor(sin(x),x,'order',8); y5=taylor(sin(x),x,'order',10); %利用plot函数绘制各个函数图形 x=-pi:0.1:pi; axy0=plot(x,subs(y),'k-'); hold on; axy1=plot(x,subs(y1),'r--'); hold on; axy2=plot(x,subs(y2),'ko'); hold on; axy3=plot(x,subs(y3),'b*'); hold on; axy4=plot(x,subs(y4),'rd'); hold on; axy5=plot(x,subs(y5),'k+'); %为图形添加图例 legend([axy0(1),axy1(1),axy2(1),axy3(1),axy4(1),axy5(1)],'原函数','n=1','n=3','n=5','n=7','n=9'); xlabel('x'); xlabel('y'); hold off 运行脚本可以得到如图31所示的图形。从图中可以看出,随着阶数的增高,所得到的泰勒展开与原函数变得十分接近,也就是说泰勒展开在达到一定阶数时可以较好地逼近原函数。利用这一性质,可以利用泰勒展开代替原函数,进行极限的计算。 图31函数y=sinx在-π,π上的n阶泰勒展开及原函数的图形 上述程序简单地应用了之前讲过的plot函数,并为曲线添加了图例。因为之前的泰勒展开中是符号运算,所以使用了subs函数对变量赋值从而就得到了函数的数值解。 使用计算机绘制的图形看起来虽然是光滑的,但是实际上计算机的绘制过程是多段的,也就是说,这里的一个图形是由多段曲线拼接而成。这就要求在使用legend函数的时候要对其进行选取。读者可以尝试把legend函数中的矩阵去掉,看会得到什么样的结果。 上面只是简单地介绍了两个函数的主要功能,实际上MATLAB的绘图功能十分强大,参考1.2里关于函数绘图的指令介绍,可以在同一个图形上绘制多个函数曲线并设置颜色、线型和添加标题等。由于使用电脑绘图简单方便,在这里就不赘述,具体可以参考MATLAB里的帮助,获得更多的使用方式。 3.5求函数的最大值与最小值 在生产生活中,都会遇到决策“如何最优”的问题,而其中的部分问题本质上可以归结为某一函数(目标函数)的最大值或最小值问题。在通常的高等数学教材中,求最大值或最小值的方法,一般是通过求出函数的各个极值点,然后比较极值的大小,来确定最大值或最小值。 在MATLAB中,可以使用内置函数fminbnd来计算函数的最大值或最小值。 例36求函数fx=x2-3x+2在[-3,4]上的最大值与最小值。 解: %写出函数和负的函数 f1 = @(x)abs(x^2-3*x+2); f2 = @(x)-abs(x^2-3*x+2); %求出最小值和最大值分别对应的自变量值x1,x2 x1 = fminbnd(f1,-3,4) x1 = 1.0000 x2 = fminbnd(f2,-3,4) x2 = -3.0000 %得到最大值和最小值 min_f1 = f1(x1) min_f1 = 5.3047e-06 max_f1 = -f2(x2) max_f1 = 19.9997 上述程序为了同时展示最大值和最小值采取了比较麻烦的写法,事实上,使用[x,fval]=fminbnd()即可同时输出最小值的位置和最小值。 由上,先通过fminbnd求出了函数的最小值所对应的自变量值,然后再代入原函数,就得到了最小值。对于求最大值,则采取先在函数前面加负号求最小值,再转换为最大值的方法。本质上来说,求函数的最大值和最小值是一样的。 上面的例子比较简单,可以直接看出最小值为0,最大值为20。通过MATLAB求得的结果与实际最大、最小值基本相符。但是由于计算机储存数据的方式和机器精度等的限制,得到的结果并不是完全相同。 MATLAB中除了求函数最小值的函数fminbnd,还有求矩阵最值的函数max、min。矩阵的形式是离散的、有限的,而函数的自变量是稠密的、不可数的。但仍然可以利用矩阵最值的计算来估计函数的最小值,并达到一定的精度,这也是计算机求最值的原理。 3.6求函数的零点 对于函数的零点,可以使用内置函数fzero来实现。 例37 求ex+sinx+x在[-1,1]上的零点。 解: %利用函数句柄写出函数 f=@(x)exp(x)+sin(x)+x; %计算零点 fzero(f,[-1,1]) ans = -0.3545 fplot(f,[-1,1],'k'); hold on line([-1,1],[0,0]); xlabel('x'); ylabel('y'); hold off 另外可以得到函数的图形(如图32所示)。 图32函数ex+sinx+x在[-1,1]的图形及零点示意图 3.7函数的单调性和曲线的凹凸性 前面的章节介绍了函数图形的绘制,本节将利用绘制函数图形的方法来讨论曲线的单调性和凹凸性。 首先可以利用函数图形来粗略观察函数的单调性。 例38判定函数 y=x-sinx在-π,π上的单调性。 解: 首先可以使用plot绘制函数 y=x-sinx在-π, π上的图形: x=-pi:0.1:pi; y=x-sin(x); plot(x,y); grid on; title('y=x-sinx'); xlabel('x'); ylabel('y'); 得到如图33所示的函数图形。通过此图可以观察到函数大致是单调递增的,但并不能精确地得到结果。若加上对导函数的考查,可以准确地判断函数的单调性。如果进一步对函数的二阶导数进行考查,可以判断曲线的凹凸性。 图33函数y=x-sinx在-π,π上的图形 然后,可以通过以下两个定理来判断函数的单调性和凹凸性。 定理35设函数y=fx在a,b上连续,在a,b内可导,那么: (1) 如果在a, b内f′x≥0,且等号仅在有限多个点处成立,那么函数y=fx在a,b上单调增加; (2) 如果在a,b内f′x≤0,且等号仅在有限多个点处成立,那么函数y=fx在a,b上单调减少。 定理36设fx在a, b上连续,在a,b内具有一阶导数和二阶导数,那么: (1) 如果在a, b内f″x>0,则fx在a, b上的图形是凹的; (2) 如果在a, b内f″x<0,则fx在a, b上的图形是凸的。 结合3.6中求函数的零点,可以通过先绘图,再分析的方式给出结论。 例39讨论函数sinx+x5在区间[-2,2]上的单调性和凹凸性。 解: syms x; %分别定义原函数、导数、二阶导数 y = sin(x)+x/5; dy = diff(y,x); ddy = diff(y,x,2); %绘制图形,并添加表格线 x = -2:0.1:2; plot(x,subs(y),'b.'); hold on; plot(x,subs(dy),'r--'); hold on; plot(x,subs(ddy)); xlabel('x'); ylabel('y'); grid on; legend ('原函数','导数','二阶导数','location','northwest'); disp(dy); cos(x)+15 disp(ddy); -sin(x) hold off 执行程序,还可以得到函数的图形,如图34所示。 图34函数sinx+x5的原函数、导数、二阶导数的图形 从图34中可以看出,原函数先减再增再减,先凹后凸; 导函数有两个零点,分别位于[-2,-1.5]、[1.5,2]; 二阶导数有一个零点,位于[-0.5,0.5]。接下来,只需通过fzero函数把零点求出即可: syms x; a1 = fzero('cos(x) + 1/5',[-2,-1.5]) a2 = fzero('cos(x) + 1/5',[1.5,2]) b1 = fzero('-sin(x)',[-0.5,0.5]) 得到结果: a1 = -1.7722;a2 = 1.7722;b1 = 0 故根据定理31和定理32得出函数在[-2,-1.7722]单调递减,在[-1.7722,1.7722]单调递增,在[1.7722,2]单调递减;函数在[-2,0]是凹的,在[0,2]是凸的。 3.8曲率 在工程计算中,有时需要精确描述曲线的弯曲程度,而曲率就是表征曲线弯曲程度的概念。由微分的概念和曲率的定义,得到的曲率计算公式如下。 设曲线的直角坐标方程是y=f(x),且f(x)具有二阶导数y″(这时f′(x)连续,从而曲线是光滑的),那么曲线的曲率为: K=y″1+y′3/2。 例310计算等边双曲线xy=1在点(1,1)处的曲率。 解: syms t %x、y为关于t的函数 x = t;y = 1/t; %求一阶导数 dx1 = diff(x,t);dy1 = diff(y,t); %求二阶导数 dx2 = diff(x,t,2);dy2 = diff(y,t,2); %根据曲率公式求得曲率 k1 = (dx1*dy2-dx2*dy1)/(dx1^2+dy1^2)^1.5; k = abs(k1) k = 21t4+13/2|t|3 代入t=1,得: ans =0.7071。 3.9拓展实例: 寻找方程近似解 在面对一些科学技术和实际应用等问题时,经常遇到方程求解的问题,但是很多的方程并不能精确求解,在方程比较稳定的情况下,求方程的近似解来代替实际的精确解就可以很好地解决问题。 求方程的近似解,一般分为两步: (1) 确定根的大致范围,可以通过作图、计算等方式得到一个理想的近似解范围; (2) 在确定的范围里寻找近似解,以端点为初始值进行迭代,逐步改善近似值的精确度,直到取得满足精度要求的近似解。二分法、牛顿法等,都是通过这样的方式来寻找近似解。下面主要以二分法为例进行学习。 接下来具体了解一下二分法。 设f(x)在a,b上连续,fa·fb<0,且f(x)=0在a,b内仅有一个根。 a,b作为前文提到的近似解范围。 然后取区间中点,如果区间中点函数值为0,那么零点已经找到,如果区间中点的函数值不为0,那么它的函数值必与a或b点的函数值异号,取区间中点和与它异号的点作为新的范围,继续迭代。 迭代终止的条件为: 区间的长度小于精度或中点函数值为0。 由上可以看出,二分法对函数的要求并不严格。虽然本章主要研究可导的函数,但二分法只需要连续这个性质就足够了。 前面曾经使用过fzero函数来求函数零点。求函数的零点即求方程的近似解,而 它也要求函数在给出的两个端点的函数值乘积为负,和二分法要求相同。 例311利用二分法求正弦函数在[-1,1]之间的零点。 解: 先根据二分法的原理写出二分法的函数: function [c,err,yc] = bisect(f,a,b,delta) % BISECT以二分法在指定区间寻找函数零点 % 输入参数: % ——f:函数句柄 % ——a、b:区间左右端点 % ——delta:精度 % 输出参数: % ——c:零点 % ——yc:c点函数值 % ——err:误差 % 调用说明: % bisect(f,a,b,delta):在区间[a,b]间寻找f的零点,精度delta ya=f(a); yb=f(b); if ya*yb > 0,return,end max1=1+round((log(b-a)-log(delta))/log(2)); %由于每一步区间长度都变为原来的一半,这一步来计算达到相应的精度,最多需要多少步 for k=1:max1 c=(a+b)/2; yc=f(c); if yc==0 a=c; b=c; elseif yb*yc>0 b=c; yb=yc; else a=c; end if b-a < delta, break,end end c=(a+b)/2; err=abs(b-a); yc=f(c); 然后,再利用这个函数求解正弦函数在[-1,1]之间的零点: bisect(@(x) sin(x), -1, 1, 0.01) ans = 0。 3.10动手实践 请用MATLAB实现下列问题。 1. 验证极限limx→∞x+sinxx存在,但不能用洛必达法则得出,并说明原因。 2. 求函数fx=1x按x+1的幂展开的5阶泰勒公式。 3. 应用三阶泰勒公式求下列各数的近似值,并估计误差: (1) sin18°; (2) e0.5。 4. 描绘下列函数的图形: (1) y=cosxcos2x在[-4π,4π]上; (2) y=e-x-12在[-2,2]上。 5. 利用plot函数绘制圆心位于原点,半径为2的圆。 6. 假设某工厂生产某产品x千件的成本是Cx=x3-6x2+15x,售出该产品x千件的收入是rx=9x,问是否存在一个能取得最大利润的生产水平?如果存在的话,找出这个生产水平。 7. 求函数fx=x3-x2-5x-2的零点和导数及二阶导数的零点。 8. 在上机作业基础上,讨论函数fx=x3-x2-5x-2的单调性、单调区间和凹凸性。 9. 求曲线x=acos3t,y=asin3t在t=t0处的曲率。