MINIBLOG

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

常微分方程初值问题的数值解法(Runge-Kutta 方法,线性多步法,预估-校正法, 常微分方程组与高阶微分方程)


Runge-Kutta 方法简介

Euler 方法及其改进形式都是在区间 [xn,xn+1][x_n, x_{n+1}][xn​,xn+1​] 内计算一个或多个点的斜率,通过加权平均构造 yn+1y_{n+1}yn+1​ 的更高阶近似。

  • Euler 法(局部截断误差 O(h2)O(h^2)O(h2)):

    {k1=hf(xn,yn)yn+1=yn+k1\begin{cases} k_1 = h f(x_n, y_n) \\ y_{n+1} = y_n + k_1 \end{cases}{k1​=hf(xn​,yn​)yn+1​=yn​+k1​​
  • 改进 Euler 法(局部截断误差 O(h3)O(h^3)O(h3)):

    {k1=hf(xn,yn)k2=hf(xn+h,yn+k1)yn+1=yn+12(k1+k2)\begin{cases} k_1 = h f(x_n, y_n) \\ k_2 = h f(x_n + h, y_n + k_1) \\ y_{n+1} = y_n + \frac{1}{2}(k_1 + k_2) \end{cases}⎩⎨⎧​k1​=hf(xn​,yn​)k2​=hf(xn​+h,yn​+k1​)yn+1​=yn​+21​(k1​+k2​)​

RK 方法的核心思想是在 [xn,xn+1][x_n, x_{n+1}][xn​,xn+1​] 内选取若干中间点计算斜率 kik_iki​,通过待定系数匹配 Taylor 展开,使局部截断误差关于 hhh 的阶数最大化。


二阶 Runge-Kutta 方法

数学基础

二阶 RK 方法的一般计算格式为:

{k1=hf(xn,yn)k2=hf(xn+αh,yn+βk1)yn+1=yn+ω1k1+ω2k2\begin{cases} k_1 = h f(x_n, y_n) \\ k_2 = h f(x_n + \alpha h, y_n + \beta k_1) \\ y_{n+1} = y_n + \omega_1 k_1 + \omega_2 k_2 \end{cases}⎩⎨⎧​k1​=hf(xn​,yn​)k2​=hf(xn​+αh,yn​+βk1​)yn+1​=yn​+ω1​k1​+ω2​k2​​

其中 ω1,ω2,α,β\omega_1, \omega_2, \alpha, \betaω1​,ω2​,α,β 为待定参数。

系数推导:

类似 改进 Euler 中的推导过程, 记 k~1=hf(xn,y(xn)),  k~2=hf(xn+αh,y(xn)+βk~1)\tilde{k}_1 = hf(x_n, y(x_n)),\;\tilde{k}_2 = hf(x_n+\alpha h, y(x_n)+\beta \tilde{k}_1)k~1​=hf(xn​,y(xn​)),k~2​=hf(xn​+αh,y(xn​)+βk~1​),则:

y~n+1=y(xn)+ω1k~1+ω2k~2=y(xn)+ω1k~1+ω2h(f+fxαh+fyβk~1)=y(xn)+h(ω1+ω2)f+h2ω2(αfx+βfyf)+O(h3)\begin{aligned} \tilde{y}_{n+1} &= y(x_n) + \omega_1 \tilde{k}_1 + \omega_2 \tilde{k}_2 \\ &= y(x_n) + \omega_1 \tilde{k}_1 + \omega_2 h (f + f_x \alpha h + f_y \beta \tilde{k}_1) \\ &= y(x_n) + h (\omega_1+\omega_2) f + h^2 \omega_2 (\alpha f_x + \beta f_y f) + O(h^3) \end{aligned}y~​n+1​​=y(xn​)+ω1​k~1​+ω2​k~2​=y(xn​)+ω1​k~1​+ω2​h(f+fx​αh+fy​βk~1​)=y(xn​)+h(ω1​+ω2​)f+h2ω2​(αfx​+βfy​f)+O(h3)​

又因为:

y(xn+1)=y(xn)+hf+h2fx+fyf2+O(h3)y(x_{n+1}) = y(x_n) + h f + h^2 \frac{f_x + f_y f}{2} + O(h^3)y(xn+1​)=y(xn​)+hf+h22fx​+fy​f​+O(h3)

希望达到 2 阶精度,匹配系数得:

{ω1+ω2=1αω2=12βω2=12\begin{cases} \omega_1 + \omega_2 = 1 \\ \alpha \omega_2 = \frac{1}{2} \\ \beta \omega_2 = \frac{1}{2} \end{cases}⎩⎨⎧​ω1​+ω2​=1αω2​=21​βω2​=21​​

方程个数小于未知数个数,解不唯一。

注:一般会取 α=β\alpha = \betaα=β,因为若希望 k2k_2k2​ 估计较为准确,则 xxx 方向和 yyy 方向行走的比例应当基本一致。

计算公式

取法一(改进 Euler 法):

ω1=12,ω2=12,α=1,β=1\omega_1 = \frac{1}{2}, \quad \omega_2 = \frac{1}{2}, \quad \alpha = 1, \quad \beta = 1ω1​=21​,ω2​=21​,α=1,β=1 {k1=hf(xn,yn)k2=hf(xn+h,yn+k1)yn+1=yn+12(k1+k2)\begin{cases} k_1 = h f(x_n, y_n) \\ k_2 = h f(x_n + h, y_n + k_1) \\ y_{n+1} = y_n + \frac{1}{2}(k_1 + k_2) \end{cases}⎩⎨⎧​k1​=hf(xn​,yn​)k2​=hf(xn​+h,yn​+k1​)yn+1​=yn​+21​(k1​+k2​)​

取法二(中点方法):

ω1=0,ω2=1,α=12,β=12\omega_1 = 0, \quad \omega_2 = 1, \quad \alpha = \frac{1}{2}, \quad \beta = \frac{1}{2}ω1​=0,ω2​=1,α=21​,β=21​ {k1=hf(xn,yn)k2=hf(xn+h2,yn+k12)yn+1=yn+k2\begin{cases} k_1 = h f(x_n, y_n) \\ k_2 = h f\left(x_n + \frac{h}{2}, y_n + \frac{k_1}{2}\right) \\ y_{n+1} = y_n + k_2 \end{cases}⎩⎨⎧​k1​=hf(xn​,yn​)k2​=hf(xn​+2h​,yn​+2k1​​)yn+1​=yn​+k2​​

Butcher 表:

0αβω1ω2\begin{array}{c|cc} 0 & & \\ \alpha & \beta & \\ \hline & \omega_1 & \omega_2 \end{array}0α​βω1​​ω2​​​

改进 Euler:

0111/21/2\begin{array}{c|cc} 0 & & \\ 1 & 1 & \\ \hline & 1/2 & 1/2 \end{array}01​11/2​1/2​​

中点方法:

01/21/201\begin{array}{c|cc} 0 & & \\ 1/2 & 1/2 & \\ \hline & 0 & 1 \end{array}01/2​1/20​1​​

算法实现

中点方法:

def rk2_midpoint(f, a, b, y0, N):
    """
    二阶 Runge-Kutta 中点方法
    """
    h = (b - a) / (N - 1)
    hh = h * 0.5
    x = a
    y = [0.0] * N
    y[0] = y0
    
    for i in range(1, N):
        k1 = h * f(x, y[i-1])
        k2 = h * f(x + hh, y[i-1] + k1 * 0.5)
        y[i] = y[i-1] + k2
        x += h
    return y

稳定性分析

对模型方程 y′=λy (λ∈C)y' = \lambda y\ (\lambda \in \mathbb{C})y′=λy (λ∈C),代入二阶 RK 计算格式可得:

yn+1=(1+λh+12λ2h2)yny_{n+1} = (1 + \lambda h + \frac{1}{2}\lambda^2 h^2) y_nyn+1​=(1+λh+21​λ2h2)yn​

故绝对稳定条件为 ∣1+λh+12λ2h2∣<1|1 + \lambda h + \frac{1}{2}\lambda^2 h^2| < 1∣1+λh+21​λ2h2∣<1。

当 λ∈R\lambda \in \mathbb{R}λ∈R 且 λ<0\lambda < 0λ<0 时,稳定步长要求:

h<−2λh < -\frac{2}{\lambda}h<−λ2​

四阶 Runge-Kutta 方法

数学基础

四阶 RK 的一般形式含 4 个斜率 k1,k2,k3,k4k_1, k_2, k_3, k_4k1​,k2​,k3​,k4​:

{k1=hf(xn,yn)k2=hf(xn+α1h,yn+β1k1)k3=hf(xn+α2h,yn+β2k1+γ1k2)k4=hf(xn+α3h,yn+β3k1+γ2k2+ζ1k3)yn+1=yn+ω1k1+ω2k2+ω3k3+ω4k4\begin{cases} k_1 = h f(x_n, y_n) \\ k_2 = h f(x_n + \alpha_1 h, y_n + \beta_1 k_1) \\ k_3 = h f(x_n + \alpha_2 h, y_n + \beta_2 k_1 + \gamma_1 k_2) \\ k_4 = h f(x_n + \alpha_3 h, y_n + \beta_3 k_1 + \gamma_2 k_2 + \zeta_1 k_3) \\ y_{n+1} = y_n + \omega_1 k_1 + \omega_2 k_2 + \omega_3 k_3 + \omega_4 k_4 \end{cases}⎩⎨⎧​k1​=hf(xn​,yn​)k2​=hf(xn​+α1​h,yn​+β1​k1​)k3​=hf(xn​+α2​h,yn​+β2​k1​+γ1​k2​)k4​=hf(xn​+α3​h,yn​+β3​k1​+γ2​k2​+ζ1​k3​)yn+1​=yn​+ω1​k1​+ω2​k2​+ω3​k3​+ω4​k4​​

希望局部截断误差为 O(h5)O(h^5)O(h5)。通过 Taylor 展开匹配系数,可以得到关于 13 个参数的 11 个方程。

计算公式

取满足方程组的一组经典解,得到标准四阶 RK 方法:

{k1=hf(xn,yn)k2=hf(xn+h2,yn+k12)k3=hf(xn+h2,yn+k22)k4=hf(xn+h,yn+k3)yn+1=yn+16(k1+2k2+2k3+k4)\begin{cases} k_1 = h f(x_n, y_n) \\ k_2 = h f\left(x_n + \frac{h}{2}, y_n + \frac{k_1}{2}\right) \\ k_3 = h f\left(x_n + \frac{h}{2}, y_n + \frac{k_2}{2}\right) \\ k_4 = h f(x_n + h, y_n + k_3) \\ y_{n+1} = y_n + \frac{1}{6}\left(k_1 + 2k_2 + 2k_3 + k_4\right) \end{cases}⎩⎨⎧​k1​=hf(xn​,yn​)k2​=hf(xn​+2h​,yn​+2k1​​)k3​=hf(xn​+2h​,yn​+2k2​​)k4​=hf(xn​+h,yn​+k3​)yn+1​=yn​+61​(k1​+2k2​+2k3​+k4​)​

Butcher 表:

01/21/21/201/210011/61/31/31/6\begin{array}{c|cccc} 0 & & & & \\ 1/2 & 1/2 & & & \\ 1/2 & 0 & 1/2 & & \\ 1 & 0 & 0 & 1 & \\ \hline & 1/6 & 1/3 & 1/3 & 1/6 \end{array}01/21/21​1/2001/6​1/201/3​11/3​1/6​​

注: 虽然 k2,k3k_2, k_3k2​,k3​ 均位于区间中点,但 k3k_3k3​ 使用更新的斜率 k2k_2k2​ 而非 k1k_1k1​,类似预测-校正的思想。

算法实现

def rk4(f, a, b, y0, N):
    """
    经典四阶 Runge-Kutta 方法
    """
    h = (b - a) / (N - 1)
    hh = h * 0.5
    x = a
    y = [0.0] * N
    y[0] = y0
    
    for i in range(1, N):
        k1 = h * f(x, y[i-1])
        k2 = h * f(x + hh, y[i-1] + k1 * 0.5)
        k3 = h * f(x + hh, y[i-1] + k2 * 0.5)
        k4 = h * f(x + h, y[i-1] + k3)
        y[i] = y[i-1] + (k1 + 2.0*k2 + 2.0*k3 + k4) / 6.0
        x += h
    return y

稳定性分析

对模型方程 y′=λyy' = \lambda yy′=λy,同理可求得四阶 RK 的传递因子为

R(z)=1+z+z22+z36+z424,z=λhR(z) = 1 + z + \frac{z^2}{2} + \frac{z^3}{6} + \frac{z^4}{24}, \quad z = \lambda hR(z)=1+z+2z2​+6z3​+24z4​,z=λh

故绝对稳定条件为:∣R(z)∣≤1|R(z)| \leq 1∣R(z)∣≤1。

当 λ∈R\lambda \in \mathbb{R}λ∈R 且 λ<0\lambda < 0λ<0 时,稳定步长要求

h<−2.78λh < -\frac{2.78}{\lambda}h<−λ2.78​

注:四阶 RK 的绝对稳定区间比二阶 RK 略大,但二者均为条件稳定,对刚性方程(∣λ∣≫0|\lambda| \gg 0∣λ∣≫0)需极小的 hhh。


线性多步法简介

一般形式

若 yn+1y_{n+1}yn+1​ 的计算不仅依赖 yny_nyn​,还利用历史值 yn,yn−1,…,yn−ky_n, y_{n-1}, \dots, y_{n-k}yn​,yn−1​,…,yn−k​,则称为多步法。其一般线性形式为

yn+1=∑i=0kαiyn−i+h∑i=−1kβif(xn−i,yn−i)y_{n+1} = \sum_{i=0}^{k} \alpha_i y_{n-i} + h \sum_{i=-1}^{k} \beta_i f(x_{n-i}, y_{n-i})yn+1​=i=0∑k​αi​yn−i​+hi=−1∑k​βi​f(xn−i​,yn−i​)
  • 若 β−1=0\beta_{-1} = 0β−1​=0(不含 f(xn+1,yn+1)f(x_{n+1}, y_{n+1})f(xn+1​,yn+1​))则为显式方法
  • 若 β−1≠0\beta_{-1} \neq 0β−1​=0 则为隐式方法

构造原理

基于恒等式:

y(xn+1)−y(xn−k)=∫xn−kxn+1f(ξ,y(ξ)) dξy(x_{n+1}) - y(x_{n-k}) = \int_{x_{n-k}}^{x_{n+1}} f(\xi, y(\xi))\,\mathrm{d}\xiy(xn+1​)−y(xn−k​)=∫xn−k​xn+1​​f(ξ,y(ξ))dξ

令 F(x)≡f(x,y(x))F(x) \equiv f(x, y(x))F(x)≡f(x,y(x)),通过 Lagrange 插值多项式 ψ(x)\psi(x)ψ(x) 近似 F(x)F(x)F(x),再积分得到计算格式。

注:当 k=0k=0k=0 时,退化为单步法,Euler、向后 Euler/梯形公式分别对应零次/一次插值。

隐式方法的局部截断误差简化

对隐式多步法(β−1≠0\beta_{-1} \neq 0β−1​=0),严格定义的局部参考值 y~n+1\tilde{y}_{n+1}y~​n+1​ 满足:

y~n+1=∑i=0kαiy(xn−i)+h∑i=0kβiy′(xn−i)+hβ−1f(xn+1,y~n+1)\tilde{y}_{n+1} = \sum_{i=0}^{k}\alpha_i y(x_{n-i}) + h\sum_{i=0}^{k}\beta_i y'(x_{n-i}) + h\beta_{-1}f(x_{n+1},\tilde{y}_{n+1})y~​n+1​=i=0∑k​αi​y(xn−i​)+hi=0∑k​βi​y′(xn−i​)+hβ−1​f(xn+1​,y~​n+1​)

若将隐式项中的 y~n+1\tilde{y}_{n+1}y~​n+1​ 直接替换为真解 y(xn+1)y(x_{n+1})y(xn+1​),得到:

Tn+1=y(xn+1)−[∑i=0kαiy(xn−i)+h∑i=−1kβiy′(xn−i)]T_{n+1} = y(x_{n+1}) - \left[\sum_{i=0}^{k}\alpha_i y(x_{n-i}) + h\sum_{i=-1}^{k}\beta_i y'(x_{n-i})\right]Tn+1​=y(xn+1​)−[i=0∑k​αi​y(xn−i​)+hi=−1∑k​βi​y′(xn−i​)]

由微分中值定理:

f(xn+1,y~n+1)−f(xn+1,y(xn+1))=−fy⋅ln+1f(x_{n+1},\tilde{y}_{n+1}) - f(x_{n+1},y(x_{n+1})) = -f_y \cdot l_{n+1}f(xn+1​,y~​n+1​)−f(xn+1​,y(xn+1​))=−fy​⋅ln+1​

故在 p 阶精度时,隐式修正项为 hβ−1fy⋅ln+1=O(hp+2)h\beta_{-1}f_y \cdot l_{n+1} = O(h^{p+2})hβ−1​fy​⋅ln+1​=O(hp+2)。因此:

ln+1=Tn+1+O(hp+2)l_{n+1} = T_{n+1} + O(h^{p+2})ln+1​=Tn+1​+O(hp+2)

也即隐式项的修正不影响精度结果。实际推导局部截断误差时,可直接将隐式项中的 yn+1y_{n+1}yn+1​ 代入真值 y(xn+1)y(x_{n+1})y(xn+1​) 计算,所得阶数与主项系数均不变。

出发值计算

线性多步法需 kkk 个出发值 y0,y1,…,yk−1y_0, y_1, \dots, y_{k-1}y0​,y1​,…,yk−1​ 才能启动。通常采用单步法(如四阶 RK)以小步长计算出发值,且单步法阶数应不低于多步法阶数,以保证整体精度不被污染。

Adams 外推公式

思想: 插值节点取积分区间左侧的 xn,xn−1,…,xn−kx_n, x_{n-1}, \dots, x_{n-k}xn​,xn−1​,…,xn−k​,然后在 [xn,xn+1][x_n, x_{n+1}][xn​,xn+1​] 上外推积分,得到显式格式。

二阶 Adams-Bashforth(两点线性插值)

对 F(x)F(x)F(x) 在 xn,xn−1x_n, x_{n-1}xn​,xn−1​ 处线性插值:

ψ1(x)=x−xn−1hF(xn)−x−xnhF(xn−1)\psi_1(x) = \frac{x - x_{n-1}}{h} F(x_n) - \frac{x - x_n}{h} F(x_{n-1})ψ1​(x)=hx−xn−1​​F(xn​)−hx−xn​​F(xn−1​)

余项:

R1(x)=12(x−xn)(x−xn−1)F′′(η),η∈(xn−1,xn)R_1(x) = \frac{1}{2}(x - x_n)(x - x_{n-1}) F''(\eta), \quad \eta \in (x_{n-1}, x_n)R1​(x)=21​(x−xn​)(x−xn−1​)F′′(η),η∈(xn−1​,xn​)

在 [xn,xn+1][x_n, x_{n+1}][xn​,xn+1​] 上积分(设步长均匀为 hhh):

∫xnxn+1ψ1(ξ) dξ=h2[3F(xn)−F(xn−1)]\int_{x_n}^{x_{n+1}} \psi_1(\xi)\,\mathrm{d}\xi = \frac{h}{2}\left[3F(x_n) - F(x_{n-1})\right]∫xn​xn+1​​ψ1​(ξ)dξ=2h​[3F(xn​)−F(xn−1​)]

得到计算格式:

yn+1=yn+h2[3f(xn,yn)−f(xn−1,yn−1)]y_{n+1} = y_n + \frac{h}{2}\left[3f(x_n, y_n) - f(x_{n-1}, y_{n-1})\right]yn+1​=yn​+2h​[3f(xn​,yn​)−f(xn−1​,yn−1​)]

局部截断误差:

ln+1=∫xnxn+1R1(ξ) dξ=512h3F′′(η)l_{n+1} = \int_{x_n}^{x_{n+1}} R_1(\xi)\,\mathrm{d}\xi = \frac{5}{12} h^3 F''(\eta)ln+1​=∫xn​xn+1​​R1​(ξ)dξ=125​h3F′′(η)

四阶 Adams-Bashforth(四点三次插值)

对 F(x)F(x)F(x) 在 xn,xn−1,xn−2,xn−3x_n, x_{n-1}, x_{n-2}, x_{n-3}xn​,xn−1​,xn−2​,xn−3​ 处构造三次 Lagrange 插值 ψ3(x)\psi_3(x)ψ3​(x),在 [xn,xn+1][x_n, x_{n+1}][xn​,xn+1​] 上积分。

计算格式:

yn+1=yn+h24(55fn−59fn−1+37fn−2−9fn−3)y_{n+1} = y_n + \frac{h}{24}\left(55f_n - 59f_{n-1} + 37f_{n-2} - 9f_{n-3}\right)yn+1​=yn​+24h​(55fn​−59fn−1​+37fn−2​−9fn−3​)

其中 fi≡f(xi,yi)f_i \equiv f(x_i, y_i)fi​≡f(xi​,yi​)。

局部截断误差:

ln+1=251720h5F(4)(η)+O(h6),η∈(xn−3,xn)l_{n+1} = \frac{251}{720} h^5 F^{(4)}(\eta) + O(h^6), \quad \eta \in (x_{n-3}, x_n)ln+1​=720251​h5F(4)(η)+O(h6),η∈(xn−3​,xn​)

从而四阶 Adams-Bashforth 方法具有 4 阶精度。

Adams 内插公式

思想: 插值节点包含积分区间右端点,取为 xn+1,xn,…,xn−kx_{n+1}, x_n, \dots, x_{n-k}xn+1​,xn​,…,xn−k​,包含了区间 [xn,xn+1][x_n, x_{n+1}][xn​,xn+1​],故为内插积分,得到隐式格式。

二阶 Adams-Moulton(梯形公式)

对 F(x)F(x)F(x) 在 xn,xn+1x_n, x_{n+1}xn​,xn+1​ 处线性插值,积分后恰好得到梯形公式,计算格式为:

yn+1=yn+h2[f(xn,yn)+f(xn+1,yn+1)]y_{n+1} = y_n + \frac{h}{2}\left[f(x_n, y_n) + f(x_{n+1}, y_{n+1})\right]yn+1​=yn​+2h​[f(xn​,yn​)+f(xn+1​,yn+1​)]

局部截断误差:

ln+1=−112h3F′′(η)+O(h4),η∈(xn,xn+1)l_{n+1} = -\frac{1}{12} h^3 F''(\eta) + O(h^4), \quad \eta \in (x_{n}, x_{n+1})ln+1​=−121​h3F′′(η)+O(h4),η∈(xn​,xn+1​)

四阶 Adams-Moulton(四点三次插值)

对 F(x)F(x)F(x) 在 xn+1,xn,xn−1,xn−2x_{n+1}, x_n, x_{n-1}, x_{n-2}xn+1​,xn​,xn−1​,xn−2​ 处构造三次 Lagrange 插值,积分得:

计算格式:

yn+1=yn+h24(9fn+1+19fn−5fn−1+fn−2)y_{n+1} = y_n + \frac{h}{24}\left(9f_{n+1} + 19f_n - 5f_{n-1} + f_{n-2}\right)yn+1​=yn​+24h​(9fn+1​+19fn​−5fn−1​+fn−2​)

局部截断误差:

ln+1=−19720h5F(4)(η)+O(h6),η∈(xn−2,xn+1)l_{n+1} = -\frac{19}{720} h^5 F^{(4)}(\eta) + O(h^6), \quad \eta \in (x_{n-2}, x_{n+1})ln+1​=−72019​h5F(4)(η)+O(h6),η∈(xn−2​,xn+1​)

结论:四阶 Adams-Moulton 为隐式方法,局部截断误差系数小于同阶 Adams-Bashforth,精度更优且稳定性更好。


预估-校正法

基本思想

  • 预估(Predictor, P):用显式方法(如 Adams-Bashforth)计算 yn+1y_{n+1}yn+1​ 的初始近似 pn+1p_{n+1}pn+1​
  • 求值(Evaluation, E):计算 f(xn+1,pn+1)f(x_{n+1}, p_{n+1})f(xn+1​,pn+1​)
  • 校正(Corrector, C):用隐式方法(如 Adams-Moulton)迭代求解 yn+1y_{n+1}yn+1​

改进 Euler 的 PEC 形式

P:pn+1=yn+hf(xn,yn)E:f~n+1=f(xn+1,pn+1)C:yn+1=yn+h2(fn+f~n+1)\begin{aligned} \mathrm{P}: &\quad p_{n+1} = y_n + h f(x_n, y_n) \\ \mathrm{E}: &\quad \tilde{f}_{n+1} = f(x_{n+1}, p_{n+1}) \\ \mathrm{C}: &\quad y_{n+1} = y_n + \frac{h}{2}\left(f_n + \tilde{f}_{n+1}\right) \end{aligned}P:E:C:​pn+1​=yn​+hf(xn​,yn​)f~​n+1​=f(xn+1​,pn+1​)yn+1​=yn​+2h​(fn​+f~​n+1​)​

注:此即改进 Euler 法的实现形式,仅进行一次校正(迭代次数为 1)。

Adams 预估-校正法

PEC 格式(四阶):

P:pn+1=yn+h24(55fn−59fn−1+37fn−2−9fn−3)E:f~n+1=f(xn+1,pn+1)C:yn+1=yn+h24(9f~n+1+19fn−5fn−1+fn−2)\begin{aligned} \mathrm{P}: &\quad p_{n+1} = y_n + \frac{h}{24}\left(55f_n - 59f_{n-1} + 37f_{n-2} - 9f_{n-3}\right) \\ \mathrm{E}: &\quad \tilde{f}_{n+1} = f(x_{n+1}, p_{n+1}) \\ \mathrm{C}: &\quad y_{n+1} = y_n + \frac{h}{24}\left(9\tilde{f}_{n+1} + 19f_n - 5f_{n-1} + f_{n-2}\right) \end{aligned}P:E:C:​pn+1​=yn​+24h​(55fn​−59fn−1​+37fn−2​−9fn−3​)f~​n+1​=f(xn+1​,pn+1​)yn+1​=yn​+24h​(9f~​n+1​+19fn​−5fn−1​+fn−2​)​

P(EC)2^22 格式(四阶,两次校正):

P:pn+1=yn+h24(55fn−59fn−1+37fn−2−9fn−3)E:f~n+1(1)=f(xn+1,pn+1)C:yn+1(1)=yn+h24(9f~n+1(1)+19fn−5fn−1+fn−2)E:f~n+1(2)=f(xn+1,yn+1(1))C:yn+1(2)=yn+h24(9f~n+1(2)+19fn−5fn−1+fn−2)\begin{aligned} \mathrm{P}: &\quad p_{n+1} = y_n + \frac{h}{24}\left(55f_n - 59f_{n-1} + 37f_{n-2} - 9f_{n-3}\right) \\ \mathrm{E}: &\quad \tilde{f}_{n+1}^{(1)} = f(x_{n+1}, p_{n+1}) \\ \mathrm{C}: &\quad y_{n+1}^{(1)} = y_n + \frac{h}{24}\left(9\tilde{f}_{n+1}^{(1)} + 19f_n - 5f_{n-1} + f_{n-2}\right) \\ \mathrm{E}: &\quad \tilde{f}_{n+1}^{(2)} = f(x_{n+1}, y_{n+1}^{(1)}) \\ \mathrm{C}: &\quad y_{n+1}^{(2)} = y_n + \frac{h}{24}\left(9\tilde{f}_{n+1}^{(2)} + 19f_n - 5f_{n-1} + f_{n-2}\right) \end{aligned}P:E:C:E:C:​pn+1​=yn​+24h​(55fn​−59fn−1​+37fn−2​−9fn−3​)f~​n+1(1)​=f(xn+1​,pn+1​)yn+1(1)​=yn​+24h​(9f~​n+1(1)​+19fn​−5fn−1​+fn−2​)f~​n+1(2)​=f(xn+1​,yn+1(1)​)yn+1(2)​=yn​+24h​(9f~​n+1(2)​+19fn​−5fn−1​+fn−2​)​

注:校正公式的截断误差优于预估公式。实际计算中通常限制校正迭代次数为 1–2 次,以平衡计算开销与精度收益。

误差修正与 PMECME 方法

利用 Adams-Bashforth(预估)与 Adams-Moulton(校正)的同阶截断误差进行事后误差估计与修正:

设 pn+1p_{n+1}pn+1​ 为预估值,cn+1c_{n+1}cn+1​ 为校正值,根据余项公式:

y(xn+1)−pn+1=251720h5y(5)(ξn),xn−3<ξn<xn+1y(xn+1)−cn+1=−19720h5y(5)(ηn),xn−2<ηn<xn+1\begin{aligned} y(x_{n+1}) - p_{n+1} &= \frac{251}{720} h^5 y^{(5)}(\xi_n), \quad x_{n-3} < \xi_n < x_{n+1} \\ y(x_{n+1}) - c_{n+1} &= -\frac{19}{720} h^5 y^{(5)}(\eta_n), \quad x_{n-2} < \eta_n < x_{n+1} \end{aligned}y(xn+1​)−pn+1​y(xn+1​)−cn+1​​=720251​h5y(5)(ξn​),xn−3​<ξn​<xn+1​=−72019​h5y(5)(ηn​),xn−2​<ηn​<xn+1​​

两式相减,由中值定理得:

cn+1−pn+1=270720h5y(5)(ζn)c_{n+1} - p_{n+1} = \frac{270}{720} h^5 y^{(5)}(\zeta_n)cn+1​−pn+1​=720270​h5y(5)(ζn​)

从而得到事后误差估计:

y(xn+1)−pn+1≈251270(cn+1−pn+1)y(xn+1)−cn+1≈−19270(cn+1−pn+1)\begin{aligned} y(x_{n+1}) - p_{n+1} &\approx \frac{251}{270}(c_{n+1} - p_{n+1}) \\ y(x_{n+1}) - c_{n+1} &\approx -\frac{19}{270}(c_{n+1} - p_{n+1}) \end{aligned}y(xn+1​)−pn+1​y(xn+1​)−cn+1​​≈270251​(cn+1​−pn+1​)≈−27019​(cn+1​−pn+1​)​

PMECME 修正方案:

P:pn+1=yn+h24(55fn−59fn−1+37fn−2−9fn−3)M:mn+1=pn+1+251270(cn−pn)E:fn+1=f(xn+1,mn+1)C:cn+1=yn+h24(9fn+1+19fn−5fn−1+fn−2)M:yn+1=cn+1−19270(cn+1−pn+1)E:fn+1=f(xn+1,yn+1)\begin{aligned} \mathrm{P}: &\quad p_{n+1} = y_n + \frac{h}{24}\left(55f_n - 59f_{n-1} + 37f_{n-2} - 9f_{n-3}\right) \\ \mathrm{M}: &\quad m_{n+1} = p_{n+1} + \frac{251}{270}(c_n - p_n) \\ \mathrm{E}: &\quad f_{n+1} = f(x_{n+1}, m_{n+1}) \\ \mathrm{C}: &\quad c_{n+1} = y_n + \frac{h}{24}\left(9f_{n+1} + 19f_n - 5f_{n-1} + f_{n-2}\right) \\ \mathrm{M}: &\quad y_{n+1} = c_{n+1} - \frac{19}{270}(c_{n+1} - p_{n+1}) \\ \mathrm{E}: &\quad f_{n+1} = f(x_{n+1}, y_{n+1}) \end{aligned}P:M:E:C:M:E:​pn+1​=yn​+24h​(55fn​−59fn−1​+37fn−2​−9fn−3​)mn+1​=pn+1​+270251​(cn​−pn​)fn+1​=f(xn+1​,mn+1​)cn+1​=yn​+24h​(9fn+1​+19fn​−5fn−1​+fn−2​)yn+1​=cn+1​−27019​(cn+1​−pn+1​)fn+1​=f(xn+1​,yn+1​)​

其中两步 M\mathrm{M}M 分别在利用前一步修正预估值和利用当前步修正校正值。

注:PMECME 可以在不显著增加计算量的前提下将有效精度提升约 1–2 阶。


常微分方程组与高阶微分方程

常微分方程组

问题形式:

{dydx=f(x,y,z)dzdx=g(x,y,z)y(x0)=y0, z(x0)=z0\begin{cases} \displaystyle\frac{\mathrm{d}y}{\mathrm{d}x} = f(x, y, z) \\[6pt] \displaystyle\frac{\mathrm{d}z}{\mathrm{d}x} = g(x, y, z) \\[6pt] y(x_0)=y_0,\ z(x_0)=z_0 \end{cases}⎩⎨⎧​dxdy​=f(x,y,z)dxdz​=g(x,y,z)y(x0​)=y0​, z(x0​)=z0​​

数值处理:将各未知量视为向量 Y=[y,z]T\mathbf{Y} = [y, z]^TY=[y,z]T,右端函数视为向量值函数 F=[f,g]T\mathbf{F} = [f, g]^TF=[f,g]T,所有单步/多步公式直接向量形式套用。

注:方程组求解时,各分量必须同步推进,即先计算所有分量的斜率,再统一更新,避免使用已更新的分量去计算其他分量(这会改变方法的数学性质)。

高阶微分方程

降阶法:mmm 阶 ODE 可通过引入 m−1m-1m−1 个新变量化为一阶方程组。

例:二阶方程

d2ydx2=g(x,y,y′), y(x0)=y0, y′(x0)=y0′\frac{\mathrm{d}^2 y}{\mathrm{d}x^2} = g(x, y, y') ,\ y(x_0)=y_0,\ y'(x_0)=y'_0dx2d2y​=g(x,y,y′), y(x0​)=y0​, y′(x0​)=y0′​

令 z=dydxz = \dfrac{\mathrm{d}y}{\mathrm{d}x}z=dxdy​,则化为方程组:

{dydx=zdzdx=g(x,y,z)y(x0)=y0, z(x0)=y0′≡z0\begin{cases} \displaystyle\frac{\mathrm{d}y}{\mathrm{d}x} = z \\[6pt] \displaystyle\frac{\mathrm{d}z}{\mathrm{d}x} = g(x, y, z) \\[6pt] y(x_0)=y_0,\ z(x_0)=y'_0 \equiv z_0 \end{cases}⎩⎨⎧​dxdy​=zdxdz​=g(x,y,z)y(x0​)=y0​, z(x0​)=y0′​≡z0​​

注:高阶 RK 方法(如 RK4)对向量值 F\mathbf{F}F 的每一步仍只需分别计算各分量的 kik_iki​,存储与计算复杂度随变量数线性增长。


复杂度与稳定性总览

方法类型局部误差全局误差每步 fff 求值稳定区间(实 λ<0\lambda<0λ<0)存储需求
Euler显式单步O(h2)O(h^2)O(h2)O(h)O(h)O(h)1h<−2/λh < -2/\lambdah<−2/λO(1)O(1)O(1)
改进 Euler显式单步O(h3)O(h^3)O(h3)O(h2)O(h^2)O(h2)2h<−2/λh < -2/\lambdah<−2/λO(1)O(1)O(1)
RK2(中点)显式单步O(h3)O(h^3)O(h3)O(h2)O(h^2)O(h2)2h<−2/λh < -2/\lambdah<−2/λO(1)O(1)O(1)
RK4显式单步O(h5)O(h^5)O(h5)O(h4)O(h^4)O(h4)4h<−2.78/λh < -2.78/\lambdah<−2.78/λO(1)O(1)O(1)
Adams-Bashforth 4显式多步O(h5)O(h^5)O(h5)O(h4)O(h^4)O(h4)1较小O(4)O(4)O(4)
Adams-Moulton 4隐式多步O(h5)O(h^5)O(h5)O(h4)O(h^4)O(h4)迭代较大O(4)O(4)O(4)
PECE (Adams)预估-校正O(h5)O(h^5)O(h5)O(h4)O(h^4)O(h4)2中等O(4)O(4)O(4)
PMECME修正预估-校正O(h6)O(h^6)O(h6)O(h5)O(h^5)O(h5)2中等O(4)O(4)O(4)

注: Adams-Moulton 的绝对稳定域显著大于同阶显式方法,适合刚性方程;预估-校正法在保持显式方法计算效率的同时,通过一次校正获得接近隐式的稳定性与精度。

目录
  • Runge-Kutta 方法简介
  • 二阶 Runge-Kutta 方法
    • 数学基础
    • 计算公式
    • 算法实现
    • 稳定性分析
  • 四阶 Runge-Kutta 方法
    • 数学基础
    • 计算公式
    • 算法实现
    • 稳定性分析
  • 线性多步法简介
    • 一般形式
    • 构造原理
    • 隐式方法的局部截断误差简化
    • 出发值计算
  • Adams 外推公式
    • 二阶 Adams-Bashforth(两点线性插值)
    • 四阶 Adams-Bashforth(四点三次插值)
  • Adams 内插公式
    • 二阶 Adams-Moulton(梯形公式)
    • 四阶 Adams-Moulton(四点三次插值)
  • 预估-校正法
    • 基本思想
    • 改进 Euler 的 PEC 形式
    • Adams 预估-校正法
    • 误差修正与 PMECME 方法
  • 常微分方程组与高阶微分方程
    • 常微分方程组
    • 高阶微分方程
  • 复杂度与稳定性总览
© 2026 miniyuan. All rights reserved.
Go to miniyuan's GitHub repo