MINIBLOG

Blog Note Tags Links About
Home Search
Jun 12, 2026
miniyuan

非线性方程及非线性方程组的解法(二分法,不动点迭代法,迭代的加速方法)


问题简介

非线性方程 f(x)=0f(x)=0f(x)=0 的数值求解是科学计算的核心问题之一,其通常不存在闭式解,需借助区间收缩或不动点迭代等方法来逼近根。

定义(根与重根):

若存在 x∗x^{*}x∗ 使得 f(x∗)=0f(x^{*})=0f(x∗)=0,则称 x∗x^{*}x∗ 为方程的根或零点。若 f(x)f(x)f(x) 可分解为:

f(x)=(x−x∗)mg(x),g(x∗)≠0f(x)=(x-x^{*})^{m}g(x),\quad g(x^{*})\neq 0f(x)=(x−x∗)mg(x),g(x∗)=0

其中 mmm 为正整数,则称 x∗x^{*}x∗ 为方程的 mmm 重根。

定理(根的存在性定理):

设 f(x)∈C[a,b]f(x)\in C[a,b]f(x)∈C[a,b] 且 f(a)⋅f(b)<0f(a)\cdot f(b) \lt 0f(a)⋅f(b)<0,则方程 f(x)=0f(x)=0f(x)=0 在 (a,b)(a,b)(a,b) 内至少存在一个根。


二分法

数学基础

二分法基于根的存在性定理来进行区间收缩,通过不断将含根区间对半分割,并以区间中点作为根的近似。

算法实现

fa = f(a)

while b - a > EPS:
    p = a + (b - a) / 2.0    # 中点(避免 a+b 溢出)
    fp = f(p)
    if fp == 0:
        return p
    if fa * fp < 0:          # 符号与 f(a) 相反
        b = p
    else:
        a = p
        fa = fp

res = a + (b - a) / 2.0

稳定性与复杂度分析

稳定性:

二分法的误差随区间长度线性减小,属于稳定算法。 但终止条件 ∣bn−an∣<ε|b_n-a_n| \lt \varepsilon∣bn​−an​∣<ε 受浮点精度限制,若 ε\varepsilonε 过小会导致无限循环。 一般选取:

ε=max⁡{∣a∣,∣b∣}⋅2εmach\varepsilon = \max\{|a|,|b|\}\cdot 2\varepsilon_{\mathrm{mach}}ε=max{∣a∣,∣b∣}⋅2εmach​

其中 εmach\varepsilon_{\mathrm{mach}}εmach​ 为机器精度,IEEE 754 双精度下 εmach≈2.22×10−16\varepsilon_{\mathrm{mach}}\approx 2.22\times 10^{-16}εmach​≈2.22×10−16。

复杂度分析:

指标结果说明
时间复杂度O ⁣(log⁡2b−aε)O\!\left(\log_2\frac{b-a}{\varepsilon}\right)O(log2​εb−a​)迭代区间减半 1 次需 1 次函数求值
空间复杂度O(1)O(1)O(1)仅存储端点与中点

注: 二分法对函数要求极低(连续性),但收敛速度仅为线性,且无法处理偶数重根。


不动点迭代法

数学基础

定义(不动点):

对于函数 φ(x)\varphi(x)φ(x),若 x∗=φ(x∗)x^{*}=\varphi(x^{*})x∗=φ(x∗),则称 x∗x^{*}x∗ 为 φ\varphiφ 的不动点。

构造迭代格式:

xk+1=φ(xk),k=0,1,2,…x_{k+1}=\varphi(x_k),\quad k=0,1,2,\dotsxk+1​=φ(xk​),k=0,1,2,…

该格式仅依赖前一步 xkx_kxk​,故为单步法;右端不含 xk+1x_{k+1}xk+1​,故为显式算法。

注:将 f(x)=0f(x)=0f(x)=0 等价改写为 x=φ(x)x=\varphi(x)x=φ(x) 的方式不唯一,不同方式的效果不同。

全局收敛的充分条件

定理(不动点存在唯一性与收敛性):

设 φ(x)∈C1[a,b]\varphi(x)\in C^1[a,b]φ(x)∈C1[a,b] 且满足

  1. 封闭性(closure):∀x∈[a,b],  φ(x)∈[a,b]\forall x\in[a,b],\; \varphi(x)\in[a,b]∀x∈[a,b],φ(x)∈[a,b];
  2. 压缩性(contraction):∃ L∈[0,1),  s.t.  ∣φ′(x)∣≤L,  ∀x∈[a,b]\exists\, L\in[0,1),\; \text{s.t.}\; |\varphi'(x)|\le L,\; \forall x\in[a,b]∃L∈[0,1),s.t.∣φ′(x)∣≤L,∀x∈[a,b]。

则:

  1. φ\varphiφ 在 [a,b][a,b][a,b] 上存在唯一不动点 x∗x^{*}x∗;
  2. ∀x0∈[a,b]\forall x_0\in[a,b]∀x0​∈[a,b],迭代序列 {xk},  xk+1=φ(xk)\{x_k\},\; x_{k+1}=\varphi(x_k){xk​},xk+1​=φ(xk​) 均收敛到 x∗x^{*}x∗;
  3. lim⁡k→∞xk+1−x∗xk−x∗=φ′(x∗)\displaystyle\lim_{k\to\infty}\frac{x_{k+1}-x^{*}}{x_k-x^{*}}=\varphi'(x^{*})k→∞lim​xk​−x∗xk+1​−x∗​=φ′(x∗)。

注:条件中的 aaa 可为 −∞-\infty−∞,bbb 可为 +∞+\infty+∞。

证明:

  • 存在性: 构造 h(x)=φ(x)−xh(x)=\varphi(x)-xh(x)=φ(x)−x。 由封闭性:

    h(a)=φ(a)−a≥0,h(b)=φ(b)−b≤0h(a)=\varphi(a)-a\ge 0,\quad h(b)=\varphi(b)-b\le 0h(a)=φ(a)−a≥0,h(b)=φ(b)−b≤0

    因 h∈C[a,b]h\in C[a,b]h∈C[a,b],根据介值定理,∃x∗∈[a,b]\exists x^{*}\in[a,b]∃x∗∈[a,b] 使 h(x∗)=0h(x^{*})=0h(x∗)=0,即 x∗=φ(x∗)x^{*}=\varphi(x^{*})x∗=φ(x∗)。

  • 唯一性: 假设存在两个不动点 x1,x2∈[a,b]x_1, x_2\in[a,b]x1​,x2​∈[a,b]。由微分中值定理,

    ∣x1−x2∣=∣φ(x1)−φ(x2)∣=∣φ′(ξ)∣⋅∣x1−x2∣≤L∣x1−x2∣|x_1-x_2|=|\varphi(x_1)-\varphi(x_2)|=|\varphi'(\xi)|\cdot|x_1-x_2|\le L|x_1-x_2|∣x1​−x2​∣=∣φ(x1​)−φ(x2​)∣=∣φ′(ξ)∣⋅∣x1​−x2​∣≤L∣x1​−x2​∣

    因 L<1L \lt 1L<1,必有 ∣x1−x2∣=0|x_1-x_2|=0∣x1​−x2​∣=0,即 x1=x2x_1=x_2x1​=x2​。

  • 收敛性与渐近误差常数: 反复应用中值定理,

    ∣xk−x∗∣=∣φ(xk−1)−φ(x∗)∣≤L∣xk−1−x∗∣≤⋯≤Lk∣x0−x∗∣|x_k-x^{*}|=|\varphi(x_{k-1})-\varphi(x^{*})|\le L|x_{k-1}-x^{*}|\le\cdots\le L^k|x_0-x^{*}|∣xk​−x∗∣=∣φ(xk−1​)−φ(x∗)∣≤L∣xk−1​−x∗∣≤⋯≤Lk∣x0​−x∗∣

    故 k→∞k\to\inftyk→∞ 时 xk→x∗x_k\to x^{*}xk​→x∗。再由中值定理,∃ξk\exists \xi_k∃ξk​ 介于 xkx_kxk​ 与 x∗x^{*}x∗ 之间,使得

    xk+1−x∗xk−x∗=φ(xk)−φ(x∗)xk−x∗=φ′(ξk)\frac{x_{k+1}-x^{*}}{x_k-x^{*}}=\frac{\varphi(x_k)-\varphi(x^{*})}{x_k-x^{*}}=\varphi'(\xi_k)xk​−x∗xk+1​−x∗​=xk​−x∗φ(xk​)−φ(x∗)​=φ′(ξk​)

    令 k→∞k\to\inftyk→∞,由 ξk→x∗\xi_k\to x^{*}ξk​→x∗ 及 φ′\varphi'φ′ 的连续性,得极限为 φ′(x∗)\varphi'(x^{*})φ′(x∗)。

局部收敛的充要条件

定理(不动点迭代的局部收敛性判别):

设 x∗x^{*}x∗ 为 φ\varphiφ 的不动点,且 φ\varphiφ 在 x∗x^{*}x∗ 的某邻域内连续可微。则:

  1. 收敛: 若 ∣φ′(x∗)∣<1|\varphi'(x^{*})|<1∣φ′(x∗)∣<1,则存在 x∗x^{*}x∗ 的邻域 UUU,使得 ∀x0∈U\forall x_0\in U∀x0​∈U,迭代序列 {xk},  xk+1=φ(xk)\{x_k\},\; x_{k+1}=\varphi(x_k){xk​},xk+1​=φ(xk​) 均收敛到 x∗x^{*}x∗,且

    lim⁡k→∞xk+1−x∗xk−x∗=φ′(x∗)\lim_{k\to\infty}\frac{x_{k+1}-x^{*}}{x_k-x^{*}}=\varphi'(x^{*})k→∞lim​xk​−x∗xk+1​−x∗​=φ′(x∗)
  2. 发散: 若 ∣φ′(x∗)∣>1|\varphi'(x^{*})|>1∣φ′(x∗)∣>1,则存在 x∗x^{*}x∗ 的邻域 UUU,使得 ∀x0∈U\forall x_0\in U∀x0​∈U 且 x0≠x∗x_0\neq x^{*}x0​=x∗,迭代序列 {xk}\{x_k\}{xk​} 不收敛到 x∗x^{*}x∗,且 ∣xk+1−x∗∣>∣xk−x∗∣|x_{k+1}-x^{*}|>|x_k-x^{*}|∣xk+1​−x∗∣>∣xk​−x∗∣。

  3. 临界: 若 ∣φ′(x∗)∣=1|\varphi'(x^{*})|=1∣φ′(x∗)∣=1,收敛性不确定,需通过 φ\varphiφ 的更高阶导数以及具体结构判断。

证明:

情形 1(∣φ′(x∗)∣<1|\varphi'(x^{*})|<1∣φ′(x∗)∣<1):

由连续性,存在 δ>0\delta>0δ>0 和 L∈[0,1)L\in[0,1)L∈[0,1),使得

∣φ′(x)∣≤L,∀x∈U=[x∗−δ, x∗+δ]|\varphi'(x)|\le L,\quad \forall x\in U=[x^{*}-\delta,\,x^{*}+\delta]∣φ′(x)∣≤L,∀x∈U=[x∗−δ,x∗+δ]

对任意 x∈Ux\in Ux∈U,由中值定理:

∣φ(x)−x∗∣=∣φ′(ξ)∣⋅∣x−x∗∣≤L∣x−x∗∣<δ|\varphi(x)-x^{*}|=|\varphi'(\xi)|\cdot|x-x^{*}|\le L|x-x^{*}|<\delta∣φ(x)−x∗∣=∣φ′(ξ)∣⋅∣x−x∗∣≤L∣x−x∗∣<δ

故 φ(x)∈U\varphi(x)\in Uφ(x)∈U,即封闭性成立。从而可知收敛。

情形 2(∣φ′(x∗)∣>1|\varphi'(x^{*})|>1∣φ′(x∗)∣>1):

由连续性,存在 δ>0\delta>0δ>0 和 L>1L>1L>1,使得

∣φ′(x)∣≥L,∀x∈U=[x∗−δ, x∗+δ]|\varphi'(x)|\ge L,\quad \forall x\in U=[x^{*}-\delta,\,x^{*}+\delta]∣φ′(x)∣≥L,∀x∈U=[x∗−δ,x∗+δ]

对任意 x0∈Ux_0\in Ux0​∈U 且 x0≠x∗x_0\neq x^{*}x0​=x∗,由中值定理:

∣x1−x∗∣=∣φ(x0)−φ(x∗)∣=∣φ′(ξ0)∣⋅∣x0−x∗∣≥L∣x0−x∗∣>∣x0−x∗∣|x_1-x^{*}|=|\varphi(x_0)-\varphi(x^{*})|=|\varphi'(\xi_0)|\cdot|x_0-x^{*}|\ge L|x_0-x^{*}|>|x_0-x^{*}|∣x1​−x∗∣=∣φ(x0​)−φ(x∗)∣=∣φ′(ξ0​)∣⋅∣x0​−x∗∣≥L∣x0​−x∗∣>∣x0​−x∗∣

故不收敛。

误差估计

定理(先验与后验误差估计):

在全局收敛的必要条件中的条件下,有先验估计:

∣xk−x∗∣≤Lk1−L∣x1−x0∣|x_k-x^{*}|\le\frac{L^k}{1-L}|x_1-x_0|∣xk​−x∗∣≤1−LLk​∣x1​−x0​∣

以及后验估计:

∣xk−x∗∣≤11−L∣xk+1−xk∣|x_k-x^{*}|\le\frac{1}{1-L}|x_{k+1}-x_k|∣xk​−x∗∣≤1−L1​∣xk+1​−xk​∣

证明:

对任意正整数 ppp,利用三角不等式与压缩性:

∣xk+p−xk∣≤∑i=1p∣xk+i−xk+i−1∣≤(Lk+p−1+⋯+Lk)∣x1−x0∣=Lk(1−Lp)1−L∣x1−x0∣|x_{k+p}-x_k|\le\sum_{i=1}^{p}|x_{k+i}-x_{k+i-1}|\le(L^{k+p-1}+\cdots+L^k)|x_1-x_0|=\frac{L^k(1-L^p)}{1-L}|x_1-x_0|∣xk+p​−xk​∣≤i=1∑p​∣xk+i​−xk+i−1​∣≤(Lk+p−1+⋯+Lk)∣x1​−x0​∣=1−LLk(1−Lp)​∣x1​−x0​∣

令 p→∞p\to\inftyp→∞ 即得先验估计。同理,

∣xk+p−xk∣≤(Lp−1+⋯+1)∣xk+1−xk∣=1−Lp1−L∣xk+1−xk∣|x_{k+p}-x_k|\le(L^{p-1}+\cdots+1)|x_{k+1}-x_k|=\frac{1-L^p}{1-L}|x_{k+1}-x_k|∣xk+p​−xk​∣≤(Lp−1+⋯+1)∣xk+1​−xk​∣=1−L1−Lp​∣xk+1​−xk​∣

令 p→∞p\to\inftyp→∞ 即得后验估计。

注:后验估计表明,当相邻两次迭代值之差足够小时,真实误差也足够小,可用于停机判断。

算法实现

x = x0
res = None

for _ in range(N):
    x_new = phi(x)
    if abs(x_new - x) < EPS:
        res = x_new
        break
    x = x_new

收敛阶与误差分析

定义(收敛阶):

设 lim⁡k→∞xk=x∗\lim_{k\to\infty}x_k=x^{*}limk→∞​xk​=x∗,记 ek=xk−x∗e_k=x_k-x^{*}ek​=xk​−x∗。若存在实数 p≥1p\ge 1p≥1 及常数 c≠0c\neq 0c=0,使得

lim⁡k→∞∣ek+1∣∣ek∣p=c\lim_{k\to\infty}\frac{|e_{k+1}|}{|e_k|^p}=ck→∞lim​∣ek​∣p∣ek+1​∣​=c

则称序列 {xk}\{x_k\}{xk​} 为 ppp 阶收敛。特别地:

  • p=1,  0<c<1p=1,\; 0 \lt c \lt 1p=1,0<c<1:线性收敛;
  • p=2p=2p=2:平方收敛;
  • p=1,  c=0p=1,\; c=0p=1,c=0:超线性收敛。

定理(高阶收敛判据):

设迭代函数 φ(x)\varphi(x)φ(x) 满足:

  1. x∗=φ(x∗)x^{*}=\varphi(x^{*})x∗=φ(x∗),且在 x∗x^{*}x∗ 附近有 ppp 阶连续导数;
  2. φ′(x∗)=φ′′(x∗)=⋯=φ(p−1)(x∗)=0\varphi'(x^{*})=\varphi''(x^{*})=\cdots=\varphi^{(p-1)}(x^{*})=0φ′(x∗)=φ′′(x∗)=⋯=φ(p−1)(x∗)=0;
  3. φ(p)(x∗)≠0\varphi^{(p)}(x^{*})\neq 0φ(p)(x∗)=0。

则不动点迭代为 ppp 阶收敛,且

lim⁡k→∞ek+1ekp=φ(p)(x∗)p!\lim_{k\to\infty}\frac{e_{k+1}}{e_k^p}=\frac{\varphi^{(p)}(x^{*})}{p!}k→∞lim​ekp​ek+1​​=p!φ(p)(x∗)​

证明:

对 φ(xk)\varphi(x_k)φ(xk​) 在 x∗x^{*}x∗ 处作 Taylor 展开:

φ(xk)=φ(x∗)+∑j=1p−1φ(j)(x∗)j!ekj+φ(p)(ξ)p!ekp=φ(x∗)+φ(p)(ξ)p!ekp\varphi(x_k) =\varphi(x^{*})+\sum_{j=1}^{p-1}\frac{\varphi^{(j)}(x^{*})}{j!}e_k^j+\frac{\varphi^{(p)}(\xi)}{p!}e_k^p =\varphi(x^{*})+\frac{\varphi^{(p)}(\xi)}{p!}e_k^pφ(xk​)=φ(x∗)+j=1∑p−1​j!φ(j)(x∗)​ekj​+p!φ(p)(ξ)​ekp​=φ(x∗)+p!φ(p)(ξ)​ekp​

其中 ξ\xiξ 介于 xkx_kxk​ 与 x∗x^{*}x∗ 之间。于是:

ek+1ekp=φ(xk)−φ(x∗)ekp=φ(p)(ξ)p!\frac{e_{k+1}}{e_k^p} =\frac{\varphi(x_k)-\varphi(x^{*})}{e_k^p}=\frac{\varphi^{(p)}(\xi)}{p!}ekp​ek+1​​=ekp​φ(xk​)−φ(x∗)​=p!φ(p)(ξ)​

令 k→∞k\to\inftyk→∞,由 ξ→x∗\xi\to x^{*}ξ→x∗ 得证。

注:也即高阶导数为 0 会带来更高阶的收敛性,这也是下面迭代加速法的基本思想。


迭代加速方法

松弛法

思想:

从 x=φ(x)x=\varphi(x)x=φ(x) 出发,引入参数 λ\lambdaλ 构造等价形式

x=λ1+λx+11+λφ(x)≡ψ(x)x=\frac{\lambda}{1+\lambda}x+\frac{1}{1+\lambda}\varphi(x)\equiv\psi(x)x=1+λλ​x+1+λ1​φ(x)≡ψ(x)

其导数为

ψ′(x)=λ+φ′(x)1+λ\psi'(x)=\frac{\lambda+\varphi'(x)}{1+\lambda}ψ′(x)=1+λλ+φ′(x)​

若选取 λ\lambdaλ 使 ∣ψ′(x)∣<∣φ′(x)∣|\psi'(x)| \lt |\varphi'(x)|∣ψ′(x)∣<∣φ′(x)∣,则新格式收敛更快。理论上最优 λ=−φ′(x∗)\lambda=-\varphi'(x^{*})λ=−φ′(x∗)。 但 x∗x^{*}x∗ 未知,故以当前迭代值近似:

λk=−φ′(xk),ωk=11+λk\lambda_k=-\varphi'(x_k),\qquad \omega_k=\frac{1}{1+\lambda_k}λk​=−φ′(xk​),ωk​=1+λk​1​

得到松弛迭代格式:

xk+1=(1−ωk)xk+ωkφ(xk)x_{k+1}=(1-\omega_k)x_k+\omega_k\varphi(x_k)xk+1​=(1−ωk​)xk​+ωk​φ(xk​)

松弛法算法实现

x = x0
res = None

for k in range(N):
    lamb = -dphi(x)
    omega = 1.0 / (1.0 + lamb)
    x_new = (1 - omega) * x + omega * phi(x)
    if abs(x_new - x) < EPS:
        res = x_new
        break
    x = x_new

注:松弛法需额外计算 φ′(x)\varphi'(x)φ′(x),适用于导数易求的情形。

Steffensen 法

思想:

若原序列 {xk}\{x_k\}{xk​} 线性收敛,当 kkk 充分大时近似有

xk+2−x∗xk+1−x∗≈xk+1−x∗xk−x∗\frac{x_{k+2}-x^{*}}{x_{k+1}-x^{*}}\approx\frac{x_{k+1}-x^{*}}{x_k-x^{*}}xk+1​−x∗xk+2​−x∗​≈xk​−x∗xk+1​−x∗​

交叉相乘解出 x∗x^{*}x∗ 的近似:

x∗≈xk−(xk+1−xk)2xk+2−2xk+1+xkx^{*}\approx x_k-\frac{(x_{k+1}-x_k)^2}{x_{k+2}-2x_{k+1}+x_k}x∗≈xk​−xk+2​−2xk+1​+xk​(xk+1​−xk​)2​

定义(差分算子):

  • 向前差分:Δxk=xk+1−xk\Delta x_k = x_{k+1}-x_kΔxk​=xk+1​−xk​
  • 二阶差分:Δ2xk=Δ(Δxk)=xk+2−2xk+1+xk\Delta^2 x_k = \Delta(\Delta x_k)=x_{k+2}-2x_{k+1}+x_kΔ2xk​=Δ(Δxk​)=xk+2​−2xk+1​+xk​

定义(Aitken 加速序列):

x^k=xk−(Δxk)2Δ2xk=xk−(xk+1−xk)2xk+2−2xk+1+xk\hat{x}_k = x_k-\frac{(\Delta x_k)^2}{\Delta^2 x_k}=x_k-\frac{(x_{k+1}-x_k)^2}{x_{k+2}-2x_{k+1}+x_k}x^k​=xk​−Δ2xk​(Δxk​)2​=xk​−xk+2​−2xk+1​+xk​(xk+1​−xk​)2​

Steffensen 法:

使用 Aitken 加速序列来进行不动点迭代就是 Steffensen 法。也即令:

xk+1=xk−(φ(xk)−xk)2φ(φ(xk))−2φ(xk)+xkx_{k+1}=x_k-\frac{(\varphi(x_k)-x_k)^2}{\varphi(\varphi(x_k))-2\varphi(x_k)+x_k}xk+1​=xk​−φ(φ(xk​))−2φ(xk​)+xk​(φ(xk​)−xk​)2​

等价于使用新的迭代函数:

φ^(x)=xφ(φ(x))−φ2(x)φ(φ(x))−2φ(x)+x\hat{\varphi}(x)=\frac{x\varphi(\varphi(x))-\varphi^2(x)}{\varphi(\varphi(x))-2\varphi(x)+x}φ^​(x)=φ(φ(x))−2φ(x)+xxφ(φ(x))−φ2(x)​

验证正确性:

由 L’Hôpital 法则可得:

lim⁡x→x∗φ^(x)=lim⁡x→x∗φ(φ(x))+xφ′(φ(x))φ′(x)−2φ(x)φ′(x)φ′(φ(x))φ′(x)−2φ′(x)+1=x∗+x∗(φ′(x∗))2−2x∗φ′(x∗)(φ′(x∗))2−2φ′(x∗)+1=x∗(1−φ′(x∗))2(1−φ′(x∗))2=x∗\begin{aligned} \lim_{x\to x^{*}}\hat{\varphi}(x) &=\lim_{x\to x^{*}} \frac{\varphi(\varphi(x))+x\varphi'(\varphi(x))\varphi'(x)-2\varphi(x)\varphi'(x)} {\varphi'(\varphi(x))\varphi'(x)-2\varphi'(x)+1} \\ &=\frac{x^{*}+x^{*}(\varphi'(x^{*}))^2-2x^{*}\varphi'(x^{*})}{(\varphi'(x^{*}))^2-2\varphi'(x^{*})+1} \\ &=\frac{x^{*}(1-\varphi'(x^{*}))^2}{(1-\varphi'(x^{*}))^2} \\ &=x^{*} \end{aligned}x→x∗lim​φ^​(x)​=x→x∗lim​φ′(φ(x))φ′(x)−2φ′(x)+1φ(φ(x))+xφ′(φ(x))φ′(x)−2φ(x)φ′(x)​=(φ′(x∗))2−2φ′(x∗)+1x∗+x∗(φ′(x∗))2−2x∗φ′(x∗)​=(1−φ′(x∗))2x∗(1−φ′(x∗))2​=x∗​

故 x∗x^{*}x∗ 仍为 φ^\hat{\varphi}φ^​ 的不动点。

Steffensen 法算法实现

x = x0
res = None

for k in range(N):
    x1 = phi(x)
    x2 = phi(x1)
    denom = x2 - 2*x1 + x
    if abs(denom) < 1e-15:
        res = x
        break
    x_new = x - (x1 - x)**2 / denom
    if abs(x_new - x) < eps:
        res = x_new
        break
    x = x_new

注:Steffensen 法无需计算导数,每步仅需两次 φ\varphiφ 求值,即可将线性收敛提升为平方收敛。

Ramanujan 迭代法

数学基础

Ramanujan 迭代法是通过幂级数系数递推求模最小根的方法。

考虑方程:

f(x)=1−(a1x+a2x2+⋯ )=0f(x)=1-(a_1x+a_2x^2+\cdots)=0f(x)=1−(a1​x+a2​x2+⋯)=0

对 [1−∑n=1∞anxn]−1=∑n=0∞bnxn[1-\sum_{n=1}^{\infty}a_n x^n]^{-1}=\sum_{n=0}^{\infty}b_n x^n[1−∑n=1∞​an​xn]−1=∑n=0∞​bn​xn 比较系数,得到递推关系:

b0=1,bn=∑i=1naibn−i(n≥1)b_0=1,\qquad b_n=\sum_{i=1}^{n}a_i b_{n-i}\quad(n\ge 1)b0​=1,bn​=i=1∑n​ai​bn−i​(n≥1)

不加证明地指出,若极限 lim⁡n→∞bn/bn+1=c\lim_{n\to\infty}b_n/b_{n+1}=climn→∞​bn​/bn+1​=c 存在,则 ccc 即为 f(x)=0f(x)=0f(x)=0 的模最小根。

算法实现

def ramanujan(coeffs, max_n):
    """
    coeffs: list [a_1, a_2, ..., a_m]
    返回序列 b 以及近似根序列 b[n-1]/b[n]
    """
    b = [1.0]  # b_0
    roots = []
    for n in range(1, max_n + 1):
        bn = 0.0
        for i in range(1, min(n, len(coeffs)) + 1):
            bn += coeffs[i-1] * b[n - i]
        b.append(bn)
        if n >= 1 and abs(bn) > 1e-15:
            roots.append(b[n-1] / bn)
    return b, roots

方法对比与复杂度总表

方法收敛条件收敛阶时间复杂度/步空间复杂度
二分法f∈C[a,b], f(a)f(b)<0f\in C[a,b],\,f(a)f(b) \lt 0f∈C[a,b],f(a)f(b)<0线性 p=1p=1p=1O(log⁡(1/ε))O(\log(1/\varepsilon))O(log(1/ε))O(1)O(1)O(1)
不动点迭代φ\varphiφ 压缩映射线性 p=1p=1p=1O(log⁡(1/ε))O(\log(1/\varepsilon))O(log(1/ε))O(1)O(1)O(1)
松弛法φ′\varphi'φ′ 存在且连续线性(加速)O(log⁡(1/ε))O(\log(1/\varepsilon))O(log(1/ε))O(1)O(1)O(1)
Steffensenφ∈C2\varphi\in C^2φ∈C2 附近平方 p=2p=2p=2O(log⁡log⁡(1/ε))O(\log\log(1/\varepsilon))O(loglog(1/ε))O(1)O(1)O(1)
Ramanujan幂级数形式,模最小根唯一线性O(n2)O(n^2)O(n2) 递推 nnn 项O(n)O(n)O(n)
目录
  • 问题简介
  • 二分法
    • 数学基础
    • 算法实现
    • 稳定性与复杂度分析
  • 不动点迭代法
    • 数学基础
    • 全局收敛的充分条件
    • 局部收敛的充要条件
    • 误差估计
    • 算法实现
    • 收敛阶与误差分析
  • 迭代加速方法
    • 松弛法
    • 松弛法算法实现
    • Steffensen 法
    • Steffensen 法算法实现
  • Ramanujan 迭代法
    • 数学基础
    • 算法实现
  • 方法对比与复杂度总表
© 2026 miniyuan. All rights reserved.
Go to miniyuan's GitHub repo