数值计算方法笔记02——方程求根

参考教材:孙志忠, 吴宏伟, 等. 计算方法与实习[M]. 第五版. 南京: 东南大学出版社, 2011:17-49.

零点定理: $f(x)\in C[a,b], \text{单调}, f(a)f(b)<0, \text{则} f(X)=0 \text{在} (a,b) \text{有唯一根}$

方程求根的步骤:

  1. 求根的隔离区间
  2. 将根精确化

根的隔离区间求法:画草图;多项式函数交点横坐标;试算;函数单调性等

二分法

基本思想:用对分区间的方法根据分点处函数 $f(x)$ 的符号逐步将有根区间缩小,使在足够小的区间内,方程仅有一个根。

  • 使用条件: $f(x)$ 连续、单调、区间端点函数值异号
  • 优点:计算简单,方法可靠
  • 缺点:收敛慢,不能求复根
  • 结论:一般不单独使用,而常用于提供初值的求解

对于给定精度 $\varepsilon$ ,若取 $k$ 使得 $\frac{1}{2^{k+1}}(b-a)\le\varepsilon$ ,则 $|x_k-x^*|\le\varepsilon$

$k\ge\frac{\ln (b-a)-\ln\varepsilon}{\ln2}-1$

function x = divide(a, b, f, e)
    fa = feval(f, a);
    fb = feval(f, b);
    if fa * fb > 0 
        error('函数在两端点必须异号');
    elseif fa == 0 
        x = a;
        return;
    elseif fb == 0
        x = b;
        return;
    end
    x = (b + a) / 2;
    while b - a > 2 * e 
        fx = feval(f, x);
        if fx == 0
            return
        elseif fx * fa < 0
            b = x;
            fb = fx;
        elseif fx * fb < 0
            a = x;
            fa = fx;
        else
            error('???');
        end
        x = (b + a) / 2;
    end
end

迭代法

$f(x)=0$ 改写为 $x=\varphi(x)$ ,$f, \varphi$ 连续( $\varphi(x)$ 称为迭代函数)

则产生数列 $x_1, x_2, \cdots, x_n, x_{n+1}, \cdots$ (迭代序列)

若迭代序列收敛,设极限为 $x^*$ ,则 $\lim_{n\rightarrow\infty}x_{n+1}=\lim_{n\rightarrow\infty}\varphi(x_n)$

所以 $x^*=\varphi(x^*)$

设 $\varphi(x)$ 在 $[a,b]$ 上具有一阶连续的导数且满足

  1. 当 $a\le x\le b$ 时, $a\le\varphi(x)\le b$
  2. $\forall x\in[a,b], |\varphi’(x)|\le L\lt1$ , $L$ 为常数

则:

  1. $x=\varphi(x)$ 在 $[a,b]$ 有唯一根 $x^*$
  2. $\forall x_0\in[a,b], x_{n+1}=\varphi(x_n)$ 收敛到 $x^*$
  3. $|x_k-x^*|\le\frac{L}{1-L}|x_k-x_{k-1}|,k=1,2,\cdots$ (事后误差估计式)
  4. $|x_k-x^*|\le\frac{L^k}{1-L}|x_1-x_0|, k=1,2,\cdots$ (事前误差估计式)
  5. $\lim_{k\rightarrow\infty}\frac{x_{k+1}-x^*}{x_k-x^*}=\varphi’(x^*)$ (渐近误差估计式)

证明见 P23-P24

编程停机判断

设定初值 $x_0$ 由 $x_{k+1}=\varphi(x_k)$ 计算,当 $|x_k-x_{k-1}|\le \varepsilon$ (事后误差估计)时, $|x_k-x^*|\le\frac{L}{1-L}\varepsilon$ 。此时可停机,取 $x_k$ 为近似值。

为了确保误差满足条件,可在连续两次迭代结果都满足所给精度时才停机


设方程在区间 $[a,b]$ 内有根 $x^*$ ,且当 $x\in[a,b]$ 时, $|\varphi’(x)|\ge1$ ,则对任意初始值 $x_0\in[a,b] \land x_0\ne x^*$ ,迭代产生的迭代序列发散。

迭代法的局部收敛性

对于方程 $x=\varphi(x)$ ,若在 $x^*$ 的某个邻域 $S$ 内,对任意初值 $x_0\in S$ ,迭代格式 $x_{k+1}=\varphi(x_k)(k=0,1,2,\cdots)$ 都收敛,则称该迭代格式在 $x^*$ 附近是局部收敛

设方程 $x=\varphi(x)$ 有根 $x^*$ ,且在 $x^*$ 的某个邻域内 $\varphi(x)$ 存在一阶连续导数,则

  1. 当 $|\varphi’(x^*)|\lt1$ 时,迭代局部收敛
  2. 当 $|\varphi’(x^*)|\gt1$ 时,迭代发散

这个定理对初值 $x_0$ 的要求较高。如果已知 $x^*$ 的大概位置, $x_0$ 为 $x^*$ 的一个较好的近似值,则可用 $\varphi(x_0)$ 代替 $\varphi(x^*)$ ,然后应用定理判断迭代的局部敛散性。

迭代法的收敛速度

设序列 $\{x_k\}$ 收敛于 $x^*$ ,并记 $e_k=x_k-x^*$ 。如果存在非零常数 $c$ 和正常数 $p$ ,使得 $\lim_{k\rightarrow\infty}\frac{e_{k+1}}{e_k^p}=c$ ,则称序列是 $p$ 阶收敛的。

$p$ 的大小反映了序列收敛速度的快慢。 $p$ 越大,则收敛的越快。当 $p=1$ 且 $0\lt|c|\lt1$ 时,称为线性收敛;当 $p\gt1$ 时,称为超线性收敛。特别地,当 $p=2$ 时,称为平方收敛

如果一个迭代格式产生的迭代序列是 $p$ 阶收敛的,则称该迭代格式是 $p$ 阶收敛的。

由 $\lim_{k\rightarrow\infty}\frac{x_{k+1}-x^*}{x_k-x^*}=\varphi’(x^*)$ 知,简单迭代法是线性收敛的。

若 $\varphi(x)$ 在 $x^*$ 的某个邻域内有 $p(p\ge1)$ 阶导数,且 $\left\{\begin{array}{l}
\varphi(x^*)=x^*&\\
\varphi^{(k)}(x^*)=0&k=1,2,\cdots,p-1\\
\varphi^{(p)}(x^*)\ne0&
\end{array}\right.$ ,则对一个任意靠近 $x^*$ 的初始值 $x_0$ ,迭代公式 $x_{k+1}=\varphi(x_k)$ 是 $p$ 阶收敛的,且有 $\lim_{k\rightarrow\infty}\frac{x_{k+1}-x^*}{(x_k-x^*)^p}=\frac{\varphi^{(p)}(x^*)}{p!}$ 。如果 $p=1$ ,要求 $|\varphi’(x^*)|\lt1$

埃特金(Aitken)加速法

简单迭代法的收敛速度与迭代函数 $\varphi(x)$ 有关。在许多情况下,可以由 $\varphi(x)$ 构造一个新的迭代函数 $\varPhi(x)$ ,使得

  1. 方程 $x=\varPhi(x)$ 和 $x=\varphi(x)$ 具有相同的根 $x^*$
  2. 迭代公式 $x_{k+1}=\varPhi(x_k)$ 产生的迭代序列收敛于 $x^*$ 的阶高于由式 $x_{k+1}=\varphi(x_k)$ 产生的迭代序列收敛于 $x^*$ 的阶。

由迭代格式 $x_{k+1}=\varphi(x_k)$ 产生收敛较快的迭代格式 $x_{k+1}=\varPhi(x_k)$ 的方法通常称为加速方法

设迭代格式 $x_{k+1}=\varphi(x_k)$ 是收敛的,由定理有

因而当 $k$ 适当大时,有

由此解出

把上式右端值作为 $\varPhi(x_k)$ ,得到新的迭代格式 $x_{k+1}=\varPhi(x_k)=\frac{x_k\varphi(\varphi(x_k))-\varphi^2(x_k)}{\varphi(\varphi(x_k))-2\varphi(x_k)+x_k}$

设在 $x^*$ 附近 $\varphi(x)$ 有 $(p+1)$ 阶连续导数,则对一个充分靠近 $x^*$ 的初始值 $x_0$ :

  1. 如果 $x_{k+1}=\varphi(x_k)$ 是线性收敛的,则 $x_{k+1}=\varPhi(x_k)$ 是二阶收敛的。
  2. 如果 $x_{k+1}=\varphi(x_k)$ 是 $p(p\ge2)$ 阶收敛的,则 $x_{k+1}=\varPhi(x_k)$ 是 $(2p-1)$ 阶收敛的。

证明略

牛顿法

$f(x)\approx f(x_k)+f’(x_k)(x-x_k)$

则 $f(x)=0$ 可以近似看作 $f(x_k)+f’(x_k)(x-x_k)=0$

所以有迭代公式 $x_{k+1}=x_k-\frac{f(x_k)}{f’(x_k)}$

牛顿法也称切线法

局部收敛性

可证明,牛顿法对单根至少是二阶局部收敛的;对重根是一阶局部收敛的。

即:牛顿法不论对单根还是重根均是局部收敛的。只要初值足够靠近精确解,牛顿迭代序列均收敛于精确解。

证明略(P32)

大范围收敛性

设函数 $f(x)$ 在区间 $[a, b]$ 上存在二阶连续导数,且满足条件:

  1. $f(a)f(b)\lt0$
  2. $\forall x\in[a, b], f’(x)\ne0$
  3. $\forall x\in[a,b], f’’(x)\text{保号}$
  4. $a-\frac{f(a)}{f’(a)}\le b, b-\frac{f(b)}{f’(b)}\ge a$

则对任意初值 $x_0\in[a, b]$ ,由牛顿迭代产生的序列二阶收敛到方程 $f(x)=0$ 在 $[a,b]$ 上的唯一根。

前两个条件保证了唯一根的存在,第三个条件保证了 $f(x)$ 在 $[a, b]$ 内上凸或下凸,条件四保证了 $x_k\in[a, b]$ 时 $x_{k+1}\in[a, b]$ ,迭代过程可一直进行下去。

牛顿法改进

设 $f(x)=0$ 有 $m(m\ge2)$ 重根,则 $x_{k+1}=x_k-m\frac{f(x_k)}{f’(x_k)}$ 至少是二阶收敛

割线法

为了避免导数,可以用差商代替导数。

$x_{k+1}=x_k-\frac{f(x_k)}{f(x_k)-f(x_{k-1})}(x_k-x_{k-1})$