高次方程没有解析形式的求根公式,而且很多非线性方程实际上都没有直接发可言,所以求解多是使用迭代方法,下面介绍几种常用的求根方法。
了解过算法的同学会对这里很熟悉,就是二分查找、折半查找的原理。
二分法只适合求单根,在有根区间内只能存在一个根才行。假设 [ a , b ] [a,b] [a,b] 是方程 f ( x ) = 0 f(x)=0 f(x)=0的有根区间,二分法就是将有根区间逐次减半,使有根区间的长度越来越小,从而得到根的近似值。其迭代步骤如下:
如果有根区间为 [ a , b ] [a,b] [a,b],那么有 f ( a ) f ( b ) < 0 f(a)f(b)<0 f(a)f(b)<0,令 a 0 = a , b 0 = b a_0=a,\quad b_0=b a0=a,b0=b,计算 x 1 = a 0 + b 0 2 x_1=\frac{a_0+b_0}{2} x1=2a0+b0,如果此时 f ( a 0 ) f ( x 1 ) > 0 f(a_0)f(x_1)>0 f(a0)f(x1)>0则说明根在区间 [ x 1 , b 0 ] [x_1,b_0] [x1,b0]中,进而令 a 1 = x 1 , b 1 = b 0 a_1=x_1, b_1=b_0 a1=x1,b1=b0,得到新的有根区间,其长度恰好为上一步的一半。
依照上面的套路,重复进行计算,最后得到的区间 [ a k , b k ] [a_k,b_k] [ak,bk],这时候我们知道根就在这个区间中,从而误差为:
∣ x k − α ∣ ≤ b k − a k = b k − 1 − a k − 1 2 = ⋯ = b 0 − a 0 2 k = b − a 2 k |x_k-\alpha|\le b_k-a_k=\frac{b_{k-1}-a_{k-1}}{2}=\cdots=\frac{b_0-a_0}{2^k}=\frac{b-a}{2^k} ∣xk−α∣≤bk−ak=2bk−1−ak−1=⋯=2kb0−a0=2kb−a
这样就可以得到计算精度与迭代次数的关系:
b − a 2 k < ε o r k > l o g 2 b − a ε \frac{b-a}{2^k}\lt\varepsilon\quad or\quad k>log_2\frac{b-a}{\varepsilon} 2kb−a<εork>log2εb−a
当满足误差 ε \varepsilon ε时,可以取近似值 x k ≈ α x_k\approx\alpha xk≈α。
简单迭代法,也叫作逐次逼近法,是通过将方程 f ( x ) = 0 f(x)=0 f(x)=0通过等价变换的方式,转换为 x = φ ( x ) x=\varphi(x) x=φ(x)的形式,其中 φ ( x ) \varphi(x) φ(x)叫做迭代函数,然后构造迭代格式:
x k + 1 = φ ( x k ) x_{k+1}=\varphi(x_k) xk+1=φ(xk)
得到迭代序列 { x k } \{x_k\} {xk},如果 x k x_k xk收敛于 α \alpha α,而且函数 φ ( x ) \varphi(x) φ(x)在 α \alpha α附近是连续的,那么根据上面的迭代格式,可以知道 α = φ ( α ) \alpha=\varphi(\alpha) α=φ(α),它就是原方程的根。如果迭代序列收敛,那么就称这个简单迭代法是收敛的。
收敛定理:
假设迭代函数 φ ( x ) \varphi(x) φ(x)在区间 [ a , b ] [a,b] [a,b]上可导,且满足下面条件:
这时,方程 x = φ ( x ) x=\varphi(x) x=φ(x)在 [ a , b ] [a,b] [a,b]上存在唯一根 α \alpha α,且对 [ a , b ] [a,b] [a,b]内的任意初值,其产生的迭代序列均收敛于 α \alpha α,并有误差估计:
∣ x k − α ∣ ≤ L 1 − L ∣ x k − x k − 1 ∣ |x_k-\alpha|\le\frac{L}{1-L}|x_k-x_{k-1}| ∣xk−α∣≤1−LL∣xk−xk−1∣
∣ x k − α ∣ ≤ L k 1 − L ∣ x 1 − x 0 ∣ |x_k-\alpha|\le\frac{L^k}{1-L}|x_1-x_0| ∣xk−α∣≤1−LLk∣x1−x0∣
进而得到近似精度与迭代次数的关系:
L k 1 − L ∣ x 1 − x 0 ∣ < ε o r k > l n ε ( 1 − L ) ∣ x 1 − x 0 ∣ l n L \frac{L^k}{1-L}|x_1-x_0|<\varepsilon \quad or \quad k\gt\frac{ln\frac{\varepsilon(1-L)}{|x_1-x_0|}}{lnL} 1−LLk∣x1−x0∣<εork>lnLln∣x1−x0∣ε(1−L)
收敛阶反映了迭代误差下降的速度,假设有迭代序列 { x k } \{x_k\} {xk}收敛于 α \alpha α,记误差为 e k = x k − α e_k=x_k-\alpha ek=xk−α,如果存在正实数p和非零常数C使得下面式子成立:
lim k → ∞ ∣ e k + 1 ∣ ∣ e k ∣ p = C \lim_{k\to\infty}\frac{|e_{k+1}|}{|e_k|^p}=C k→∞lim∣ek∣p∣ek+1∣=C
就称这个迭代序列是p阶收敛的,p是收敛阶,C是渐进误差常数。通常称p=1为线性收敛,p>1为超线性收敛,p=2为平方收敛。
另外还有一个求收敛阶的定理:
假设 α = φ ( α ) , φ ( x ) \alpha=\varphi(\alpha),\varphi(x) α=φ(α),φ(x)在 α \alpha α的邻域充分光滑,且满足下面:
φ ′ ( α ) = φ ′ ′ ( α ) = ⋯ = φ ( p − 1 ) ( α ) = 0 , φ ( p ) ( α ) ≠ 0 , p ⩾ 2 \varphi^{\prime}(\alpha)=\varphi^{\prime \prime}(\alpha)=\cdots=\varphi^{(p-1)}(\alpha)=0, \quad \varphi^{(p)}(\alpha) \neq 0, \quad p \geqslant 2 φ′(α)=φ′′(α)=⋯=φ(p−1)(α)=0,φ(p)(α)̸=0,p⩾2
则当初始值 x 0 x_0 x0的取值充分靠近 α \alpha α时,迭代格式是p阶收敛的,且有:
lim k → ∞ ∣ e k + 1 ∣ ∣ e k ∣ p = 1 p ! ∣ φ ( p ) ( α ) ∣ ≠ 0 \lim _{k \rightarrow \infty} \frac{\left|e_{k+1}\right|}{\left|e_{k}\right|^{p}}=\frac{1}{p !}\left|\varphi^{(p)}(\alpha)\right| \neq 0 k→∞lim∣ek∣p∣ek+1∣=p!1∣∣∣φ(p)(α)∣∣∤=0
Newton迭代法的优点在于,在单根附近具有平方收敛,而且可以求重根、复根。基本思想是将非线性方程转换为线性方程,又因为这是根据导数进行计算,又被称为切线法。
假设 f ( x ) f(x) f(x)二阶连续可微, x 0 x_0 x0是 α \alpha α的某个近似值,那么在 x 0 x_0 x0处泰勒展开(Taylor):
f ( x ) = f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) + f ′ ′ ( ξ 0 ) 2 ( x − x 0 ) 2 f(x)=f\left(x_{0}\right)+f^{\prime}\left(x_{0}\right)\left(x-x_{0}\right)+\frac{f^{\prime \prime}\left(\xi_{0}\right)}{2}\left(x-x_{0}\right)^{2} f(x)=f(x0)+f′(x0)(x−x0)+2f′′(ξ0)(x−x0)2
其中 ξ 0 \xi_0 ξ0介于 x , x 0 x,x_0 x,x0之间,可以用其线性主部近似原函数,即:
f ( x ) ≈ f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) f(x)\approx f\left(x_{0}\right)+f^{\prime}\left(x_{0}\right)\left(x-x_{0}\right) f(x)≈f(x0)+f′(x0)(x−x0)
那么非线性方程 f ( x ) = 0 f(x)=0 f(x)=0就近似为了线性方程:
f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) = 0 f\left(x_{0}\right)+f^{\prime}\left(x_{0}\right)\left(x-x_{0}\right)=0 f(x0)+f′(x0)(x−x0)=0
若 f ′ ( x ) ≠ 0 f^\prime(x)\ne 0 f′(x)̸=0,则可得到:
x 1 = x 0 − f ( x 0 ) f ′ ( x 0 ) x_1=x_0-\frac{f(x_0)}{f^\prime(x_0)} x1=x0−f′(x0)f(x0)
按照此套路,若 f ′ ( x ) ≠ 0 f^\prime(x)\ne 0 f′(x)̸=0,可以得到Newton迭代格式:
x k + 1 = x k − f ( x k ) f ′ ( x k ) , k = 0 , 1 , 2 , ⋯ x_{k+1}=x_{k}-\frac{f\left(x_{k}\right)}{f^{\prime}\left(x_{k}\right)}, \quad k=0,1,2, \cdots xk+1=xk−f′(xk)f(xk),k=0,1,2,⋯
Newton迭代法迭代函数为:
φ ( x ) = x − f ( x ) f ′ ( x ) \varphi(x)=x-\frac{f(x)}{f^\prime(x)} φ(x)=x−f′(x)f(x)
又因为Newton迭代法要求在根的位置一阶可导,且原函数在有根区间二次连续可微,那么可以知道迭代函数的导数为:
φ ′ ( x ) = 1 − ( f ′ ( x ) ) 2 − f ( x ) f ′ ′ ( x ) ( f ′ ( x ) ) 2 = f ( x ) f ′ ′ ( x ) ( f ′ ( x ) ) 2 ≠ 0 \varphi^{\prime}(x)=1-\frac{\left(f^{\prime}(x)\right)^{2}-f(x) f^{\prime \prime}(x)}{\left(f^{\prime}(x)\right)^{2}}=\frac{f(x) f^{\prime \prime}(x)}{\left(f^{\prime}(x)\right)^{2}} \ne 0 φ′(x)=1−(f′(x))2(f′(x))2−f(x)f′′(x)=(f′(x))2f(x)f′′(x)̸=0
所以知道,Newton迭代法是局部收敛的,而且至少是平方收敛。进一步可以得到如下收敛定理
设函数 f ( x ) f(x) f(x)在根 α \alpha α邻域有二阶连续导数,且 f ′ ( α ) ≠ 0 f^\prime(\alpha)\ne 0 f′(α)̸=0,则对充分接近 α \alpha α的初值 x 0 x_0 x0,Newton迭代法产生的迭代序列 { x k } \{x_k\} {xk}收敛于 α \alpha α,并有:
lim h → ∞ x k + 1 − α ( x k − α ) 2 = f ′ ′ ( α ) 2 f ′ ( α ) \lim _{h \rightarrow \infty} \frac{x_{k+1}-\alpha}{\left(x_{k}-\alpha\right)^{2}}=\frac{f^{\prime \prime}(\alpha)}{2 f^{\prime}(\alpha)} h→∞lim(xk−α)2xk+1−α=2f′(α)f′′(α)
上面定理说明了,一般情况下,Newton迭代是平方收敛,如果 f ′ ′ ( x ) = 0 f^{\prime\prime}(x)=0 f′′(x)=0那么收敛阶会更高。
下面讨论初始值的要求:
设 M 2 = max ∣ f ′ ′ ( x ) ∣ , m 1 = min ∣ f ′ ( x ) ∣ , C = M 2 2 m 1 M_{2}=\max \left|f^{\prime \prime}(x)\right|, m_{1}=\min \left|f^{\prime}(x)\right|,C=\frac{M_2}{2m_1} M2=max∣f′′(x)∣,m1=min∣f′(x)∣,C=2m1M2,则有上面公式,有:
∣ x k + 1 − α ∣ ⩽ C ∣ x k − α ∣ 2 , k = 0 , 1 , 2 , ⋯ \left|x_{k+1}-\alpha\right| \leqslant C\left|x_{k}-\alpha\right|^{2}, \quad k=0,1,2, \cdots ∣xk+1−α∣⩽C∣xk−α∣2,k=0,1,2,⋯
为了方便计算,改写为:
C ∣ x k + 1 − α ∣ ⩽ ( C ∣ x k − α ∣ ) 2 , k = 0 , 1 , 2 , ⋯ C\left|x_{k+1}-\alpha\right| \leqslant\left(C\left|x_{k}-\alpha\right|\right)^{2}, \quad k=0,1,2, \cdots C∣xk+1−α∣⩽(C∣xk−α∣)2,k=0,1,2,⋯
于是有:
C ∣ x k − α ∣ ≤ ( C ∣ x 0 − α ∣ ) 2 k C|x_k-\alpha|\le(C|x_0-\alpha|)^{2k} C∣xk−α∣≤(C∣x0−α∣)2k
将C带入:
∣ x k − α ∣ ≤ 2 m 1 M 2 ( M 2 2 m 1 ∣ x 0 − α ∣ ) 2 k |x_k-\alpha|\le\frac{2m_1}{M_2}\left(\frac{M_2}{2m_1}|x_0-\alpha|\right)^{2k} ∣xk−α∣≤M22m1(2m1M2∣x0−α∣)2k
要保证 ∣ x k − α ∣ |x_k-\alpha| ∣xk−α∣趋近于0,那么对于 x 0 x_0 x0的选择,要保证 ∣ x 0 − α ∣ < 2 m 1 M 2 |x_0-\alpha|\lt\frac{2m_1}{M_2} ∣x0−α∣<M22m1。