数学实验教程
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.4 导数的应用(1)

求代数方程fx)=0的根,曾经是代数学领域的中心问题,许多才华横溢的数学家在这一领域作出了卓越的贡献。下面介绍导数在解方程(组)方面的应用。

求代数方程fx)=0的根,可以直接调用MATLAB命令solve(f, x),输出结果即fx)=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]。这里可以绘出函数的图像,通过观察确定这一范围。我们知道,如果连续函数fx)满足fafb)<0且在区间 [a, b] 上仅穿过x轴一次,则 fx)在(a, b)内必然存在唯一的零点。

(2)以区间端点ab为根的初始近似值,采用某种算法逐步改进精确度,直至求得满足要求的近似解。

下面介绍牛顿迭代法和弦截法。

如果fx)在 [a, b] 上二阶可导,fafb)<0且f′x)与f″x)在 [a, b] 上不变号(即函数的单调性与凹凸性不发生变化),则可用牛顿迭代法来求解代数方程fx)=0。

所谓牛顿迭代法,就是用y=fx)在各点的切线来代替曲线,以切线与x轴交点的横坐标为fx)=0实根的近似,如图2-12所示。

图2-12

使用牛顿迭代法求fx)=0的近似解时,首先需要确定一个迭代的初始值。由于fafb)<0且f′x)在 [a, b] 上不变号,因此必有faf′a)>0或fbf′b)>0。如果fbf′b)>0,则取初始值x0=b;如果faf′a)>0,则取初始值x0=a。

其次,在x0处,函数 y=fx)的切线方程为 y-fx0)=f′x0)(x-x0),代入y=0可得此切线与 x轴的交点 x1=x0-。如果fx1)满足精度要求,即输出x1作为fx)=0的近似解;否则在x1处作切线,继续第(2)步。按照上述办法反复迭代,直到fxn)满足精度要求为止。

具体算法步骤如下:

(1)输入精度指标ε>0。

(2)确定区间 [a, b],该区间应满足fafb)<0且f′x)与f″x)在 [a, b] 上不变号。

(3)若fbf′b)>0,取x0=b,否则取x0=a。

(4)定义x1=x0-

(5)若|x1-x0|<ε,则输出近似解x1,否则令x0=x1并返回步骤(4)。

如果fx)的一阶导数不容易计算,则可以使用弦截法。即给定初始值x0x1,用如下迭代公式计算其余各点:

对比牛顿迭代法和弦截法,前者每次迭代都需要分别计算一次函数值和一次导数值,后者只需计算一次函数值即可。接下来介绍的几个命令都以牛顿迭代法为基础。比如求函数fx)=0在一定范围内的零点,可以用命令x=fzero(f, x0);求fx)=0在区间 [a, b] 上的零点,可以用命令x=fzero(f, [a, b])。

例2-17 求5sin(2x)=exx=-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出发求fx)=0的零点,可以用命令[x, f, h]=fsolve(f, x0)。输出结果为向量 [x, f, h],其中x为近似零点,f为该点处的函数值,h的输出值大于零表示结果可靠,否则不可靠。

例2-19y=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。

如果初始点不同,或者使用的命令不同,那么计算出的结果可能会有差异,在使用时要注意。在介绍了导数在解方程中的应用之后,我们将介绍高等数学课程中涉及的导数应用。