数值分析笔记(一):方程求根


根的搜索

  • 逐步搜索

    在给定区间 [ 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=klimxk

收敛性的判断

如果存在邻域 Δ : ∣ x − x ∗ ∣ ≤ δ , ∀ δ > 0 \Delta : |x-x^*|\leq\delta,\forall\delta>0 Δ:xxδ,δ>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) xxk+1=L(xxk)

对迭代误差 e k = ∣ x ∗ − x k ∣ e_k=|x^*-x_k| ek=xxk,有 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) xxˉk+1L(xxk)。求解出 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 x1L1xˉk+11LLxk。即有
{ 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=1L1xˉk+11LLxk,

x k + 1 = 1 1 − L [ φ ( x k ) − L x k ] x_{k+1}=\frac1{1-L}[\varphi(x_k)-Lx_k] xk+1=1L1[φ(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+1x~k+12xˉk+1+xk(xk+1xˉ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=xkf(xk)f(xk)

这就是著名的Newton迭代公式

求解 f ( x ) = x 2 − a = 0 f(x)=x^2-a=0 f(x)=x2a=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)=xf(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=xkf(xk)f(x0)f(xk)(xkx0)。弦截法虽然避开了导数计算,但其迭代速度只有一阶。

快速弦截法

为提高弦截法的效率,再对弦截法公式进行加工,从而我们导出了快速弦截法公式: 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=xkf(xk)f(xk1)f(xk)(xkxk1)。快速弦截法的收敛速度无疑比弦截法快,但是其要提供两个迭代初值,所以又被称为两步法。

改进牛顿法

对于重根情形,即当 f ( x ) = ( x − x ∗ ) m g ( x ) f(x)=(x-x^*)^mg(x) f(x)=(xx)mg(x) g ( x ∗ ) ≠ 0 g(x^*)\neq 0 g(x)=0时,直接采用牛顿法,其 φ ′ ( x ∗ ) = 1 − 1 m > 0 \varphi '(x^*)=1-\frac 1m>0 φ(x)=1m1>0,其仅仅只是线性收敛。

一种改进方法是修改迭代公式,消去 m m m,此时迭代公式变为 φ ( x ) = x − m f ( x ) f ′ ( x ) \varphi (x)=x-m\frac{f(x)}{f'(x)} φ(x)=xmf(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)=(xx)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)=xf(x)2f(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=xkf(xk)2f(xk)f(xk)f(xk)f(xk),容易证明,其是二阶收敛的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值