根的搜索
-
逐步搜索
在给定区间 [ a , b ] [a, b] [a,b]上从左端点 x = a x=a x=a开始,按照步长 h h h一步一步取 f ( x 0 ) f(x_0) f(x0)和 f ( x 0 + h ) f(x_0+h) f(x0+h),如果发现成立 f ( x 0 ) ⋅ f ( x 0 + h ) ≤ 0 f(x_0)\cdot f(x_0+h)\leq 0 f(x0)⋅f(x0+h)≤0则在区间 [ x 0 , x 0 + h ] [x_0,x_0+h] [x0,x0+h]有根。
当 h h h太小时所需的搜索次数过多,计算量过大。
-
二分搜索
对有根区间 [ a 0 , b 0 ] [a_0,b_0] [a0,b0]实行如下二分手续:用中点 x 0 = a 0 + b 0 2 x_0= \frac{a_0+b_0}2 x0=2a0+b0将区间分成两半,判断所求根 x ∗ x^* x∗在 x 0 x_0 x0的哪一侧,从而确定新的有根区间 [ a 1 , b 1 ] [a_1,b_1] [a1,b1],其长度为 [ a 0 , b 0 ] [a_0,b_0] [a0,b0]的一半。如果无限循环下去,有根区间必收敛于一点 x ∗ x^* x∗。
-
试位法(Method of False Position
)思想:寻找过 f ( a ) f(a) f(a)和 f ( b ) f(b) f(b)的割线与x轴的交点 ( c , 0 ) (c,0) (c,0)
迭代法
迭代法的核心思想就是隐式方程显式化。将方程 f ( x ) = 0 f(x)=0 f(x)=0改写为 x = φ ( x ) x=\varphi (x) x=φ(x),给出方程根的某个近似值 x k x_k xk,代入,得 x k + 1 = φ ( x k ) x_{k+1}=\varphi (x_k) xk+1=φ(xk),即能得到从给定初值出发的序列 x 1 , x 2 , x 3 , ⋯ x_1,x_2,x_3,\cdots x1,x2,x3,⋯。如果这个数列是收敛的,那么显然有方程的根 x ∗ = lim k → ∞ x k x^*=\lim\limits_{k \to \infty}x_k x∗=k→∞limxk。
收敛性的判断
如果存在邻域 Δ : ∣ x − x ∗ ∣ ≤ δ , ∀ δ > 0 \Delta : |x-x^*|\leq\delta,\forall\delta>0 Δ:∣x−x∗∣≤δ,∀δ>0,使得在迭代过程中 ∀ x 0 ∈ Δ \forall x_0\in\Delta ∀x0∈Δ,则称其在根 x ∗ x^* x∗邻近收敛。其中 x 0 x_0 x0为迭代初值。
设 φ ( x ) \varphi(x) φ(x)在方程 x = φ ( x ) x=\varphi(x) x=φ(x)的根 x ∗ x^* x∗的邻近有连续的一阶导数,且成立 ∣ φ ′ ( x ∗ ) ∣ < 1 |\varphi'(x^*)|<1 ∣φ′(x∗)∣<1,则迭代过程 x k + 1 = φ ( x k ) x_{k+1}=\varphi (x_k) xk+1=φ(xk)在 x ∗ x^* x∗邻近具有局部收敛性。也就是说,具有局部收敛性的迭代过程 x k + 1 = φ ( x k ) x_{k+1}=\varphi (x_k) xk+1=φ(xk)对足够准确的迭代初值 x ∗ x^* x∗收敛。
收敛速度
对于具有局部收敛性的迭代过程 x k + 1 = φ ( x k ) x_{k+1}=\varphi (x_k) xk+1=φ(xk),若 φ ′ ( x ∗ ) ≠ 0 \varphi '(x^*)\neq0 φ′(x∗)=0则称迭代过程是线性收敛的,而当 φ ′ ( x ∗ ) = 0 \varphi '(x^*)=0 φ′(x∗)=0且 φ ′ ′ ( x ∗ ) ≠ 0 \varphi ''(x^*)\neq0 φ′′(x∗)=0,则称迭代过程是平方收敛的。
加速迭代
先考察线性迭代函数
设 φ ( x ) \varphi (x) φ(x)为线性函数 φ ( x ) = L x + d , L > 0 \varphi (x)=Lx+d,L>0 φ(x)=Lx+d,L>0
则所给方程的迭代公式为 x k + 1 = L x k + d x_{k+1}=Lx_k+d xk+1=Lxk+d
方程的根 x ∗ x^* x∗满足 x ∗ = L x ∗ + d x^*=Lx^*+d x∗=Lx∗+d
两式相减,有 x ∗ − x k + 1 = L ( x ∗ − x k ) x^*-x_{k+1}=L(x^*-x_k) x∗−xk+1=L(x∗−xk)
对迭代误差 e k = ∣ x ∗ − x k ∣ e_k=|x^*-x_k| ek=∣x∗−xk∣,有 e k + 1 = L e k e_{k+1}=Le_k ek+1=Lek
反复递推,有 e k = L k e 0 e_k=L^ke_0 ek=Lke0
L < 1 L<1 L<1时,迭代序列收敛,且L越小收敛速度越快。
利用上述思想,我们可以对迭代过程进行加速。设
x
k
x_k
xk是根
x
∗
x^*
x∗的某个近似值,用迭代公式校正一次,有
x
ˉ
k
+
1
=
φ
(
x
k
)
\bar{x}_{k+1}=\varphi(x_k)
xˉk+1=φ(xk)。假设
φ
′
(
x
)
\varphi'(x)
φ′(x)在考察范围内变化不大,其估计值为
L
L
L,则
x
∗
−
x
ˉ
k
+
1
≈
L
(
x
∗
−
x
k
)
x^*-\bar{x}_{k+1}\approx L(x^*-x_k)
x∗−xˉk+1≈L(x∗−xk)。求解出
x
∗
x^*
x∗,有
x
∗
≈
1
1
−
L
x
ˉ
k
+
1
−
L
1
−
L
x
k
x^*\approx\frac{1}{1-L}\bar{x}_{k+1}-\frac L{1-L}x_k
x∗≈1−L1xˉk+1−1−LLxk。即有
{
x
ˉ
k
+
1
=
φ
(
x
k
)
,
迭
代
x
K
+
1
=
1
1
−
L
x
ˉ
k
+
1
−
L
1
−
L
x
k
,
加
速
\left\{ \begin{array}{lr} \bar{x}_{k+1}=\varphi(x_k), & 迭代 \\ x_{K+1}=\frac{1}{1-L}\bar{x}_{k+1}-\frac L{1-L}x_k, & 加速\\ \end{array} \right.
{xˉk+1=φ(xk),xK+1=1−L1xˉk+1−1−LLxk,迭代加速
即 x k + 1 = 1 1 − L [ φ ( x k ) − L x k ] x_{k+1}=\frac1{1-L}[\varphi(x_k)-Lx_k] xk+1=1−L1[φ(xk)−Lxk]
然而上述加速迭代法需要处理一次导数,对有些迭代公式并不方便。更一般的,我们有Aitken加速方法
{ x ˉ k + 1 = φ ( x k ) , 迭 代 x ~ k + 1 = φ ( x ˉ k + 1 ) , 迭 代 x K + 1 = x ~ k + 1 − ( x k + 1 − x ˉ k + 1 ) 2 x ~ k + 1 − 2 x ˉ k + 1 + x k , 加 速 \left\{ \begin{array}{lr} \bar{x}_{k+1}=\varphi(x_k), & 迭代 \\ \tilde{x}_{k+1}=\varphi(\bar{x}_{k+1}),& 迭代\\ x_{K+1}=\tilde{x}_{k+1}-\frac{(x_{k+1}-\bar{x}_{k+1})^2}{\tilde{x}_{k+1}-2\bar{x}_{k+1}+x_k}, & 加速\\ \end{array} \right. ⎩⎪⎨⎪⎧xˉk+1=φ(xk),x~k+1=φ(xˉk+1),xK+1=x~k+1−x~k+1−2xˉk+1+xk(xk+1−xˉk+1)2,迭代迭代加速
其思想就是用估计值进行二次迭代,然后再做商消去 L L L,最后解出 x ∗ x^* x∗,代回即可。Aitken的缺点也是显然的:其要进行两次迭代才能求出一个估计值。
Newton法(切线法)
牛顿法是应用最为广泛的迭代方法。下面导出牛顿公式。考察 f ( x ) = 0 f(x)=0 f(x)=0,设已知近似根 x k x_k xk,则显然,我们希望对 x k + 1 = x k + Δ x x_{k+1}=x_k+\Delta x xk+1=xk+Δx尽量满足 f ( x k + Δ x ) ≈ 0 f(x_k+\Delta x)\approx0 f(xk+Δx)≈0。将其左端用其线性主部代替,有 f ( x k ) + f ′ ( x k ) Δ x = 0 f(x_k)+f'(x_k)\Delta x=0 f(xk)+f′(xk)Δx=0,由此,解出 Δ x = − f ( x k ) f ′ ( x k ) \Delta x=-\frac{f(x_k)}{f'(x_k)} Δx=−f′(xk)f(xk),从而对 x k + 1 = x k + Δ x x_{k+1}=x_k+\Delta x xk+1=xk+Δx有
x k + 1 = x k − f ( x k ) f ′ ( x k ) x_{k+1}=x_k-\frac{f(x_k)}{f'(x_k)} xk+1=xk−f′(xk)f(xk)
这就是著名的Newton迭代公式
求解 f ( x ) = x 2 − a = 0 f(x)=x^2-a=0 f(x)=x2−a=0时, f ′ ( x ) = 2 x f'(x)=2x f′(x)=2x,其Newton迭代函数为 φ ( x ) = x − f ( x k ) f ′ ( x k ) = 1 2 ( a + a x ) \varphi(x)=x-\frac{f(x_k)}{f'(x_k)}=\frac{1}{2}\left(a+\frac ax\right) φ(x)=x−f′(xk)f(xk)=21(a+xa),这就是古代数学界的开方法。
Newton法的改进
Newton下山法
基本思想:每一步迭代均保证下降条件,即 ∣ f ( x k + 1 ) ∣ < ∣ f ( x k ) ∣ |f(x_{k+1})|<|f(x_k)| ∣f(xk+1)∣<∣f(xk)∣,这样能保证全局收敛。
具体做法:加入下山因子 λ \lambda λ,将改进值 x k + 1 x_{k+1} xk+1与前一步的结果 x k x_k xk取加权平均,即 x k + 1 = λ x ˉ k + 1 + ( 1 − λ ) x k x_{k+1}=\lambda \bar{x}_{k+1}+(1-\lambda)x_k xk+1=λxˉk+1+(1−λ)xk,也就说,迭代公式变形成 x k + 1 = x k − λ f ( x k ) f ′ ( x k ) x_{k+1}=x_k-\lambda\frac{f(x_k)}{f'(x_k)} xk+1=xk−λf′(xk)f(xk),其中 λ \lambda λ的取法为从1开始将 λ \lambda λ进行反复折半,直到满足 ∣ f ( x k + 1 ) ∣ < ∣ f ( x k ) ∣ |f(x_{k+1})|<|f(x_k)| ∣f(xk+1)∣<∣f(xk)∣。
弦截法
为了避开导数的计算,我们可以采用取割线来代替切线,从而导出弦截法的迭代公式: x k + 1 = x k − f ( x k ) f ( x k ) − f ( x 0 ) ( x k − x 0 ) x_{k+1}=x_k-\frac {f(x_k)}{f(x_k)-f(x_0)}(x_k-x_0) xk+1=xk−f(xk)−f(x0)f(xk)(xk−x0)。弦截法虽然避开了导数计算,但其迭代速度只有一阶。
快速弦截法
为提高弦截法的效率,再对弦截法公式进行加工,从而我们导出了快速弦截法公式: x k + 1 = x k − f ( x k ) f ( x k ) − f ( x k − 1 ) ( x k − x k − 1 ) x_{k+1}=x_k-\frac {f(x_k)}{f(x_k)-f(x_{k-1})}(x_k-x_{k-1}) xk+1=xk−f(xk)−f(xk−1)f(xk)(xk−xk−1)。快速弦截法的收敛速度无疑比弦截法快,但是其要提供两个迭代初值,所以又被称为两步法。
改进牛顿法
对于重根情形,即当 f ( x ) = ( x − x ∗ ) m g ( x ) f(x)=(x-x^*)^mg(x) f(x)=(x−x∗)mg(x)且 g ( x ∗ ) ≠ 0 g(x^*)\neq 0 g(x∗)=0时,直接采用牛顿法,其 φ ′ ( x ∗ ) = 1 − 1 m > 0 \varphi '(x^*)=1-\frac 1m>0 φ′(x∗)=1−m1>0,其仅仅只是线性收敛。
一种改进方法是修改迭代公式,消去 m m m,此时迭代公式变为 φ ( x ) = x − m f ( x ) f ′ ( x ) \varphi (x)=x-m\frac{f(x)}{f'(x)} φ(x)=x−mf′(x)f(x),此时 φ ′ ( x ∗ ) = 0 \varphi '(x^*)=0 φ′(x∗)=0,收敛性变好。但是这种改进方式需要知道具体的重根阶数 m m m。
另一种改进方式是利用 μ ( x ) = f ( x ) f ′ ( x ) \mu(x)=\frac{f(x)}{f'(x)} μ(x)=f′(x)f(x)与 f ( x ) = ( x − x ∗ ) m g ( x ) f(x)=(x-x^*)^mg(x) f(x)=(x−x∗)mg(x)同根的性质,对 μ ( x ) \mu(x) μ(x)使用牛顿法, φ ( x ) = x − μ ( x ) μ ′ ( x ) = x − f ( x ) f ′ ( x ) ∣ f ′ ( x ) ∣ 2 − f ( x ) f ′ ′ ( x ) \varphi(x)=x-\frac{\mu(x)}{\mu'(x)}=x-\frac{f(x)f'(x)}{|f'(x)|^2-f(x)f''(x)} φ(x)=x−μ′(x)μ(x)=x−∣f′(x)∣2−f(x)f′′(x)f(x)f′(x)从而得到迭代公式为 x k + 1 = x k − f ( x k ) f ′ ( x k ) ∣ f ′ ( x k ) ∣ 2 − f ( x k ) f ′ ′ ( x k ) x_{k+1}=x_k-\frac{f(x_k)f'(x_k)}{|f'(x_k)|^2-f(x_k)f''(x_k)} xk+1=xk−∣f′(xk)∣2−f(xk)f′′(xk)f(xk)f′(xk),容易证明,其是二阶收敛的。