7 非线性方程求根
这一章讲的是非线性方程求根的故事,假设有非线性函数 f ( x ) f(x) f(x),那么其对应的非线性方程求根就是求:
f ( x ) = 0 f(x)=0 f(x)=0
的 根,也称作函数 f ( x ) f(x) f(x)的零点。如果 f ( x ) = ( x − α ) m h ( x ) f(x)=(x-\alpha)^mh(x) f(x)=(x−α)mh(x),而且 h ( x ) h(x) h(x)在 x = α x=\alpha x=α处连续且导数不为0,那么就称 α \alpha α是方程1的 m重根,当m=1时,称作 单根。如果知道区间 [ a , b ] [a,b] [a,b]上必有方程的根,那么这个区间就称为该方程的 有根区间。
高次方程没有解析形式的求根公式,而且很多非线性方程实际上都没有直接发可言,所以求解多是使用迭代方法,下面介绍几种常用的求根方法。
7.1 二分法
了解过算法的同学会对这里很熟悉,就是二分查找、折半查找的原理。
二分法只适合求单根,在有根区间内只能存在一个根才行。假设 [ 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≈α。
4.2 简单迭代法
4.2.1 一般形式
简单迭代法,也叫作逐次逼近法,是通过将方程
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)
α=φ(α),它就是原方程的根。如果迭代序列收敛,那么就称这个简单迭代法是收敛的。
4.2.2 收敛条件
收敛定理:
假设迭代函数 φ ( x ) \varphi(x) φ(x)在区间 [ a , b ] [a,b] [a,b]上可导,且满足下面条件:
- a ≤ φ ( x ) ≤ b , x ∈ [ a , b ] a\le\varphi(x)\le b ,\quad x\in[a,b] a≤φ(x)≤b,x∈[a,b]
- 存在整数 L < 1 L\lt1 L<1,使得对任意 x ∈ [ a , b ] x\in[a,b] x∈[a,b]均有 ∣ φ ′ ( x ) ∣ ≤ L < 1 |\varphi'(x)|\le L\lt 1 ∣φ′(x)∣≤L<1(这个条件可以放宽为 ∣ φ ( x ) − φ ( y ) ∣ ≤ L ∣ x − y ∣ , ∀ x , y ∈ [ a , b ] |\varphi(x)-\varphi(y)|\le L|x-y|, \forall x,y\in [a,b] ∣φ(x)−φ(y)∣≤L∣x−y∣,∀x,y∈[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)
4.2.3 收敛阶
收敛阶反映了迭代误差下降的速度,假设有迭代序列
{
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
4.3 Newton迭代法
Newton迭代法的优点在于,在单根附近具有平方收敛,而且可以求重根、复根。基本思想是将非线性方程转换为线性方程,又因为这是根据导数进行计算,又被称为切线法。
4.3.1 迭代格式
假设
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,⋯
4.3.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。