2.4 导数的应用(1)
求代数方程f(x)=0的根,曾经是代数学领域的中心问题,许多才华横溢的数学家在这一领域作出了卓越的贡献。下面介绍导数在解方程(组)方面的应用。
求代数方程f(x)=0的根,可以直接调用MATLAB命令solve(f, x),输出结果即f(x)=0的所有符号解或精确解。
比如要求x2+3x+2=0的根,可以输入如下代码:
>> syms x; >> f=x^2+3∗x+2; >> solve(f, x)
输出结果为:
ans=-2,-1。
求解如下代数方程组:
可以使用命令代码 [x, y]=solve(f, g, x, y).比如要求解
可以输入如下代码:
>> syms x y b; >> f=x^2+6∗y+2; >> g=x+y-b; >> [x, y]=solve(f, g, x, y)
输出结果为:
x= 3-(7-6∗b)∗(1/2) (7-6∗b)∗(1/2)+3 y= b+(7-6∗b)∗(1/2)-3 b-(7-6∗b)∗(1/2)-3
在上面的例子中,我们得到的都是精确解。如果无法求出精确解,MATLAB会发出提示,并给出相应的近似数值解。
例2-16 求5sin(2x)=ex的根。
仿照此前的例子输入如下代码:
>> syms x; >> f=5∗sin(2∗x)-exp(x); >> solve(f, x)
输出结果为
警告:Cannot solve symbolically. Returning a numeric approximation instead. > In solve at 306 ans= 0.11291035698994542654891471155014
使用绘图命令绘制函数y=5sin(2x)-ex的图像,如图2-11所示。
图2-11
观察图像可以发现,5sin(2x)-ex=0的解并不唯一,因此在使用solve命令解方程时,要注意甄别输出的解是否满足要求。
在了解求解代数方程的命令代码后,我们的下一个问题是:方程的近似数值解是如何求出来的?
代数方程近似解的求法基于零点存在定理,主要分为两个步骤:
(1)确定根的大致范围 [a, b]。这里可以绘出函数的图像,通过观察确定这一范围。我们知道,如果连续函数f(x)满足f(a)f(b)<0且在区间 [a, b] 上仅穿过x轴一次,则 f(x)在(a, b)内必然存在唯一的零点。
(2)以区间端点a和b为根的初始近似值,采用某种算法逐步改进精确度,直至求得满足要求的近似解。
下面介绍牛顿迭代法和弦截法。
如果f(x)在 [a, b] 上二阶可导,f(a)f(b)<0且f′(x)与f″(x)在 [a, b] 上不变号(即函数的单调性与凹凸性不发生变化),则可用牛顿迭代法来求解代数方程f(x)=0。
所谓牛顿迭代法,就是用y=f(x)在各点的切线来代替曲线,以切线与x轴交点的横坐标为f(x)=0实根的近似,如图2-12所示。
图2-12
使用牛顿迭代法求f(x)=0的近似解时,首先需要确定一个迭代的初始值。由于f(a)f(b)<0且f′(x)在 [a, b] 上不变号,因此必有f(a)f′(a)>0或f(b)f′(b)>0。如果f(b)f′(b)>0,则取初始值x0=b;如果f(a)f′(a)>0,则取初始值x0=a。
其次,在x0处,函数 y=f(x)的切线方程为 y-f(x0)=f′(x0)(x-x0),代入y=0可得此切线与 x轴的交点 x1=x0-。如果f(x1)满足精度要求,即输出x1作为f(x)=0的近似解;否则在x1处作切线,继续第(2)步。按照上述办法反复迭代,直到f(xn)满足精度要求为止。
具体算法步骤如下:
(1)输入精度指标ε>0。
(2)确定区间 [a, b],该区间应满足f(a)f(b)<0且f′(x)与f″(x)在 [a, b] 上不变号。
(3)若f(b)f′(b)>0,取x0=b,否则取x0=a。
(4)定义x1=x0-。
(5)若|x1-x0|<ε,则输出近似解x1,否则令x0=x1并返回步骤(4)。
如果f(x)的一阶导数不容易计算,则可以使用弦截法。即给定初始值x0和x1,用如下迭代公式计算其余各点:
对比牛顿迭代法和弦截法,前者每次迭代都需要分别计算一次函数值和一次导数值,后者只需计算一次函数值即可。接下来介绍的几个命令都以牛顿迭代法为基础。比如求函数f(x)=0在一定范围内的零点,可以用命令x=fzero(f, x0);求f(x)=0在区间 [a, b] 上的零点,可以用命令x=fzero(f, [a, b])。
例2-17 求5sin(2x)=ex在x=-5附近的零点。
输入如下代码:
>> f=5∗sin(2∗x)-exp(x); >> x=fzero(f,-5)
输出结果为:
x=-4.7133。
例2-18 求5sin(2x)=ex在 [0, 1] 上的零点。
输入代码:
x=fzero(f, [0, 1])
可得结果为:
x=0.1129。
我们也可以指定初始点来计算函数的零点。从x0出发求f(x)=0的零点,可以用命令[x, f, h]=fsolve(f, x0)。输出结果为向量 [x, f, h],其中x为近似零点,f为该点处的函数值,h的输出值大于零表示结果可靠,否则不可靠。
例2-19 求y=2sinx-1.5的零点。
输入如下代码:
>> syms x f h; >> f=2∗sin(x)-1.5; >> [x, f, h]=fsolve(f, 0)
输出结果为:
x=0.8481, f=-1.0918e-10, h=1。
如果初始点不同,或者使用的命令不同,那么计算出的结果可能会有差异,在使用时要注意。在介绍了导数在解方程中的应用之后,我们将介绍高等数学课程中涉及的导数应用。