跳转至

1 Runge-Kutta 方法

1.1 方法思想

Euler 方法的局部截断误差为 \(O(h^2)\),而改进 Euler 方法的局部截断误差为 \(O(h^3)\)。回顾这两种方法:

Euler 方法

\[ \begin{cases} k_1=hf(x_n,y_n)\\[6pt] y_{n+1}=y_n+k_1 \end{cases} \]

改进 Euler 方法

\[ \begin{cases} k_1=hf(x_n,y_n)\\[6pt] k_2=hf(x_n+h,y_n+k_1)\\[6pt] y_{n+1}=y_n+\dfrac{1}{2}(k_1+k_2) \end{cases} \]

可以看到,改进 Euler 方法计算了 \([x_n,x_{n+1}]\) 区间内 更多点 的函数值,然后通过合适的 加权系数,最终得到了更好的 \(y_{n+1}\) 的估计。Runge-Kutta(RK)方法正是将这一思想系统化、推广化的结果。

Runge-Kutta 方法的核心思想

通过在区间 \([x_n,x_{n+1}]\) 内计算若干个点处的斜率(导数值),然后对这些斜率进行加权平均,作为整个区间上的平均斜率,从而获得更高精度的近似。

1.2 二阶 Runge-Kutta 方法

一般形式与参数推导

从改进 Euler 方法入手,假设更一般的计算格式:

\[ \begin{cases} k_1=hf(x_n,y_n)\\[6pt] k_2=hf(x_n+\alpha h,y_n+\beta k_1)\\[6pt] y_{n+1}=y_n+\omega_1k_1+\omega_2k_2 \end{cases} \]

其中 \(\omega_1,\omega_2,\alpha,\beta\) 为待定参数。

\(f(x_n+\alpha h,y_n+\beta k_1)\)\(f(x_n,y_n)\) 处展开:

\[ \begin{aligned} f(x_n+\alpha h,y_n+\beta k_1) &=f(x_n,y_n)+\alpha hf_x+\beta k_1f_y+O(h^2)\\ &=f(x_n,y_n)+\alpha hf_x+\beta hf_yf(x_n,y_n)+O(h^2) \end{aligned} \]

如果假设第 \(n\) 步是准确解(即 \(y_n=y(x_n)\)),则

\[ \begin{aligned} f(x_n+\alpha h,y(x_n)+\beta k_1) &=f(x_n,y_n)+\alpha hf_x+\beta hf_yf(x_n,y(x_n))+O(h^2) \end{aligned} \]

代入 RK 计算格式,得到

\[ \begin{aligned} \tilde{y}_{n+1} &=y(x_n)+(\omega_1+\omega_2)hf(x_n,y(x_n))\\ &\quad+\omega_2h^2\bigl[\alpha f_x+\beta f_yf(x_n,y(x_n))\bigr]+O(h^3) \end{aligned} \]

回顾 \(y=y(x)\) 的 Taylor 展开:

\[ y(x_{n+1})=y(x_n)+hf(x_n,y(x_n))+\frac{h^2}{2}\bigl[f_x+f_yf(x_n,y(x_n))\bigr]+O(h^3) \]

比较两式的系数,得到如下方程组:

\[ \begin{cases} \omega_1+\omega_2=1\\[6pt] \alpha\omega_2=\dfrac{1}{2}\\[10pt] \beta\omega_2=\dfrac{1}{2} \end{cases} \]

这里有 4 个未知数但只有 3 个方程,因此解不唯一。每取一组满足条件的参数,就得到一种二阶 RK 方法。

改进 Euler 方法

\(\omega_1=\omega_2=\dfrac{1}{2}\)\(\alpha=\beta=1\),得到改进 Euler 方法:

\[ \begin{cases} k_1=hf(x_n,y_n)\\[6pt] k_2=hf(x_n+h,y_n+k_1)\\[6pt] y_{n+1}=y_n+\dfrac{1}{2}(k_1+k_2) \end{cases} \]

中点方法

\(\omega_1=0\)\(\omega_2=1\)\(\alpha=\beta=\dfrac{1}{2}\),得到 中点方法

\[ \begin{cases} k_1=hf(x_n,y_n)\\[6pt] k_2=hf\left(x_n+\dfrac{h}{2},y_n+\dfrac{k_1}{2}\right)\\[8pt] y_{n+1}=y_n+k_2 \end{cases} \]

中点方法的几何意义

中点方法用区间中点处的斜率作为整个区间的平均斜率。与改进 Euler 方法(用端点斜率的平均)不同,中点方法只需要存储一个 \(k\) 值来更新 \(y\)

Butcher 表

Butcher 将 RK 方法的系数整理排列成如下的表格形式,称为 Butcher 表

\[ \begin{array}{c|cc} 0 & &\\ \alpha & \beta &\\ \hline & \omega_1 & \omega_2 \end{array} \]

改进 Euler 方法与中点方法的 Butcher 表分别为:

\[ \text{改进 Euler:}\quad \begin{array}{c|cc} 0 & &\\ 1 & 1 &\\ \hline & \dfrac{1}{2} & \dfrac{1}{2} \end{array} \qquad \text{中点方法:}\quad \begin{array}{c|cc} 0 & &\\ \dfrac{1}{2} & \dfrac{1}{2} &\\ \hline & 0 & 1 \end{array} \]

算法(中点方法)

\[ \begin{aligned} & \textbf{算法: } \text{2 阶 RK 方法(中点方法)} \\ & \textbf{输入: } f(x,y),\ [a,b],\ y_0,\ N \\ & \textbf{输出: } y[1:N] \\ & 1. \quad y[1] \leftarrow y_0 \\ & 2. \quad h \leftarrow (b-a)/(N-1);\quad hh \leftarrow h/2 \\ & 3. \quad x \leftarrow a \\ & 4. \quad \textbf{for } i = 2, 3, \ldots, N \textbf{ do} \\ & 5. \quad \quad k_1 \leftarrow h \cdot f(x, y[i-1]) \\ & 6. \quad \quad k_2 \leftarrow h \cdot f(x + hh, y[i-1] + k_1/2) \\ & 7. \quad \quad y[i] \leftarrow y[i-1] + k_2 \\ & 8. \quad \quad x \leftarrow x + h \\ & 9. \quad \textbf{end for} \\ & 10. \quad \textbf{return } y[1:N] \end{aligned} \]
例 1.1:二阶 RK 方法的精度验证

考察相同的初值问题

\[ \begin{cases} \dfrac{dy}{dx}=\dfrac{2}{x}y+x^2e^x,\quad 1\leq x\leq 2\\[8pt] y(1)=0 \end{cases} \]

采用二阶 Runge-Kutta 方法(中点方法)研究不同步长下的局部截断误差与总体截断误差,并与梯形公式作比较。

二阶 RK 方法误差对比

通过数据拟合:

二阶 RK(中点方法)

\[ \begin{aligned} l_{x=1+h}&\approx4.7935\,h^{2.9946}\\[4pt] e_{x=2}&\approx15.927\,h^{1.9813} \end{aligned} \]

梯形公式 (回顾):

\[ \begin{aligned} l_{x=1+h}&\approx3.6474\,h^{3.0299}\\[4pt] e_{x=2}&\approx12.682\,h^{2.0148} \end{aligned} \]

两种方法都具有 2 阶精度,误差表现相近。

稳定性分析

利用二阶 RK 方法求解模型方程 \(y'=\lambda y\),可以得到

\[ y_{n+1}=\left(1+\lambda h+\frac{(\lambda h)^2}{2}\right)y_n \]

稳定的计算格式要求

\[ \left|1+\lambda h+\frac{(\lambda h)^2}{2}\right|\leq1 \]

考虑 \(\lambda\in\mathbb{R}\) 的情况,可以得到稳定的计算格式要求 \(h<-2/\lambda\)(当 \(\lambda<0\) 时)。

二阶 RK 的稳定区域

二阶 RK 方法的绝对稳定区域比 Euler 方法稍大,但仍然是 条件稳定 的,不是 A-稳定方法。

1.3 四阶 Runge-Kutta 方法

经典公式

对于四阶 Runge-Kutta 方法,其更一般的计算格式表示为:

\[ \begin{cases} k_1=hf(x_n,y_n)\\[6pt] k_2=hf(x_n+\alpha_1h,y_n+\beta_1k_1)\\[6pt] k_3=hf(x_n+\alpha_2h,y_n+\beta_2k_1+\gamma_1k_2)\\[6pt] k_4=hf(x_n+\alpha_3h,y_n+\beta_3k_1+\gamma_2k_2+\zeta_1k_3)\\[8pt] y_{n+1}=y_n+\omega_1k_1+\omega_2k_2+\omega_3k_3+\omega_4k_4 \end{cases} \]

希望这种计算格式下,局部截断误差满足

\[ y(x_{n+1})-\tilde{y}_{n+1}=O(h^5) \]

结合 Taylor 展开,得到关于 13 个参数、11 个方程的方程组。

最经典、最广泛使用的四阶 Runge-Kutta 方法为:

\[ \begin{cases} k_1=hf(x_n,y_n)\\[6pt] k_2=hf\left(x_n+\dfrac{h}{2},y_n+\dfrac{k_1}{2}\right)\\[8pt] k_3=hf\left(x_n+\dfrac{h}{2},y_n+\dfrac{k_2}{2}\right)\\[8pt] k_4=hf(x_n+h,y_n+k_3)\\[8pt] y_{n+1}=y_n+\dfrac{1}{6}(k_1+2k_2+2k_3+k_4) \end{cases} \]

其 Butcher 表为:

\[ \begin{array}{c|cccc} 0 & & & &\\ \dfrac{1}{2} & \dfrac{1}{2} & & &\\ \dfrac{1}{2} & 0 & \dfrac{1}{2} & &\\ 1 & 0 & 0 & 1 &\\ \hline & \dfrac{1}{6} & \dfrac{1}{3} & \dfrac{1}{3} & \dfrac{1}{6} \end{array} \]

四阶 RK 方法的精度

经典的四阶 Runge-Kutta 方法具有 \(O(h^5)\) 的局部截断误差和 \(O(h^4)\) 的全局截断误差,是工程计算中最常用的常微分方程数值解法之一。

四阶 RK 的系数规律

注意到 \(k_1,k_2,k_3,k_4\) 的权重分别为 \(\dfrac{1}{6},\dfrac{2}{6},\dfrac{2}{6},\dfrac{1}{6}\),这与 Simpson 积分公式的权重一致,反映了 RK 方法与数值积分的深刻联系。

算法

\[ \begin{aligned} & \textbf{算法: } \text{4 阶 RK 方法} \\ & \textbf{输入: } f(x,y),\ [a,b],\ y_0,\ N \\ & \textbf{输出: } y[1:N] \\ & 1. \quad y[1] \leftarrow y_0 \\ & 2. \quad h \leftarrow (b-a)/(N-1);\quad hh \leftarrow h/2 \\ & 3. \quad x \leftarrow a \\ & 4. \quad \textbf{for } i = 2, 3, \ldots, N \textbf{ do} \\ & 5. \quad \quad k_1 \leftarrow h \cdot f(x, y[i-1]) \\ & 6. \quad \quad k_2 \leftarrow h \cdot f(x + hh, y[i-1] + k_1/2) \\ & 7. \quad \quad k_3 \leftarrow h \cdot f(x + hh, y[i-1] + k_2/2) \\ & 8. \quad \quad k_4 \leftarrow h \cdot f(x + h, y[i-1] + k_3) \\ & 9. \quad \quad y[i] \leftarrow y[i-1] + (k_1 + 2k_2 + 2k_3 + k_4)/6 \\ & 10. \quad \quad x \leftarrow x + h \\ & 11. \quad \textbf{end for} \\ & 12. \quad \textbf{return } y[1:N] \end{aligned} \]
例 1.2:四阶 RK 方法的精度验证

采用四阶 Runge-Kutta 方法研究不同步长下的误差,并与二阶 RK 方法(中点方法)作比较。

四阶 RK 方法误差对比

通过数据拟合:

四阶 RK 方法

\[ \begin{aligned} l_{x=1+h}&\approx1.1151\,h^{5.0330}\\[4pt] e_{x=2}&\approx2.519\,h^{4.1079} \end{aligned} \]

二阶 RK(中点方法) (回顾):

\[ \begin{aligned} l_{x=1+h}&\approx4.7935\,h^{2.9946}\\[4pt] e_{x=2}&\approx15.927\,h^{1.9813} \end{aligned} \]

四阶 RK 方法的局部误差为 \(O(h^5)\),全局误差为 \(O(h^4)\),比二阶方法高出两个数量级。在实际应用中,四阶 RK 方法通常用较大的步长就能获得很高的精度。

稳定性分析

四阶 RK 方法求解模型方程 \(y'=\lambda y\) 时:

\[ \begin{aligned} k_1&=(h\lambda)y_n\\ k_2&=\left(h\lambda+\frac{(h\lambda)^2}{2}\right)y_n\\ k_3&=\left(h\lambda+\frac{(h\lambda)^2}{2}+\frac{(h\lambda)^3}{4}\right)y_n\\ k_4&=\left(h\lambda+(h\lambda)^2+\frac{(h\lambda)^3}{2}+\frac{(h\lambda)^4}{4}\right)y_n \end{aligned} \]

于是

\[ y_{n+1}=\left(1+h\lambda+\frac{(h\lambda)^2}{2}+\frac{(h\lambda)^3}{6}+\frac{(h\lambda)^4}{24}\right)y_n \]

稳定性要求

\[ \left|1+h\lambda+\frac{(h\lambda)^2}{2}+\frac{(h\lambda)^3}{6}+\frac{(h\lambda)^4}{24}\right|\leq1 \]

如果考虑 \(\lambda\in\mathbb{R}\)(且 \(\lambda<0\)),则稳定条件近似为 \(h\leq-2.78/\lambda\)

四阶 RK 的稳定区域

四阶 RK 方法的绝对稳定区域比低阶方法更大,但仍然是条件稳定的。对于刚性问题,需要配合隐式方法或特殊设计的 RK 方法。


2 线性多步法

2.1 方法简介

在之前介绍的方法中,包括 Euler 法、梯形公式、Runge-Kutta 方法,\(y_{n+1}\) 仅依赖于 \(y_n\),因此这些方法都属于 单步法

如果可以采用多个之前计算结果 \(y_n,y_{n-1},\cdots,y_{n-k}\),则可期望获得更好的精度。这种方法称为 多步法

多步法中,常见的构造方法为 线性多步法

\[ y_{n+1}=\sum_{i=0}^{k}\alpha_iy_{n-i}+\sum_{i=-1}^{k}\beta_if(x_{n-i},y_{n-i}) \]

特别地:

  • 如果 \(\beta_{-1}=0\),则这个线性多步法为 显式方法
  • 如果 \(\beta_{-1}\neq0\),则为 隐式算法

多步法的优势

多步法每步的计算量通常比同阶 RK 方法小(不需要多次计算中间点的函数值),但需要额外的"出发值"来启动计算。

根据恒等式

\[ y(x_{n+1})-y(x_{n-k})=\int_{x_{n-k}}^{x_{n+1}}f(x,y(x))\,dx \]

\(F(x)\equiv f(x,y(x))\),利用 插值方式 近似 \(F(x)\),可以获得不同的数值求解格式。

单步法是多步法的特例

\(k=0\) 时,线性多步法退化为单步法。Euler 法、向后 Euler 法和梯形公式在区间 \([x_n,x_{n+1}]\) 中,分别采用了如下的近似函数:

\[ \begin{aligned} f(x,y(x))&\approx f(x_n,y_n)\quad\text{(Euler 法)}\\ f(x,y(x))&\approx f(x_{n+1},y_{n+1})\quad\text{(向后 Euler 法)}\\ f(x,y(x))&\approx\frac{1}{2}\bigl[f(x_n,y_n)+f(x_{n+1},y_{n+1})\bigr]\quad\text{(梯形公式)} \end{aligned} \]
例 2.1:一个简单多步法的精度分析

假设有线性多步法迭代格式

\[ y_{n+1}=y_{n-1}+2hf(x_n,y_n) \]

计算其局部截断误差,并给出计算精度。

解:局部截断误差为

\[ l_{n+1}=y(x_{n+1})-y(x_{n-1})-2hf(x_n,y(x_n))=y(x_{n+1})-y(x_{n-1})-2hy'(x_n) \]

\(y(x)\)\(x_n\) 处做 Taylor 展开:

\[ \begin{aligned} y(x_{n+1})&=y(x_n)+hy'(x_n)+\frac{h^2}{2}y''(x_n)+\frac{h^3}{6}y'''(x_n)+O(h^4)\\ y(x_{n-1})&=y(x_n)-hy'(x_n)+\frac{h^2}{2}y''(x_n)-\frac{h^3}{6}y'''(x_n)+O(h^4) \end{aligned} \]

两式相减,代入局部截断误差表达式:

\[ l_{n+1}=\frac{h^3}{3}y'''(x_n)+O(h^4)=O(h^3) \]

因此这个多步法的局部截断误差为 \(O(h^3)\),具有 2 阶精度

例 2.2:Simpson 线性多步法

考察 Simpson 线性多步法

\[ y_{n+1}=y_{n-1}+\frac{h}{3}\bigl[f(x_{n-1},y_{n-1})+4f(x_n,y_n)+f(x_{n+1},y_{n+1})\bigr] \]

这实际上是用 Simpson 积分公式近似积分:

\[ \int_{x_{n-1}}^{x_{n+1}}f(\xi,y(\xi))\,d\xi\approx\frac{2h}{6}\bigl[f(x_{n-1},y_{n-1})+4f(x_n,y_n)+f(x_{n+1},y_{n+1})\bigr] \]

Simpson 积分公式的余项为 \(-\dfrac{(2h)^5}{2880}F^{(4)}(\eta)\),因此 Simpson 线性多步法是一个 4 阶方法

2.2 Adams 外推公式

一次多项式插值(二阶 Adams-Bashforth)

以两个点为例,通过点 \((x_n,F(x_n))\)\((x_{n-1},F(x_{n-1}))\),构造一次多项式插值:

\[ \psi_1(x)=\frac{x-x_{n-1}}{x_n-x_{n-1}}F(x_n)+\frac{x-x_n}{x_{n-1}-x_n}F(x_{n-1}) \]

插值余项为

\[ R_1(x)=F(x)-\psi_1(x)=\frac{1}{2}(x-x_n)(x-x_{n-1})F''(\eta),\quad\eta\in(x_{n-1},x_n) \]

\(\psi_1(x)\) 代入积分公式(假设均匀步长 \(h\)):

\[ \begin{aligned} y(x_{n+1}) &=y(x_n)+\int_{x_n}^{x_{n+1}}F(\xi)\,d\xi\\ &\approx y(x_n)+\int_{x_n}^{x_{n+1}}\psi_1(\xi)\,d\xi\\ &=y(x_n)+\frac{h}{2}\bigl[3F(x_n)-F(x_{n-1})\bigr] \end{aligned} \]

得到计算格式:

\[ y_{n+1}=y_n+\frac{h}{2}\bigl[3f(x_n,y_n)-f(x_{n-1},y_{n-1})\bigr] \]

余项的积分代表了这个算法的局部截断误差:

\[ l_{n+1}=\int_{x_n}^{x_{n+1}}R_1(\xi)\,d\xi=\frac{5h^3}{12}F''(\eta)=O(h^3) \]

因此这个方法是 2 阶 的 Adams 外推公式,也称为 2 步 Adams-Bashforth 方法

三次多项式插值(四阶 Adams-Bashforth)

若采用点 \((x_n,F(x_n)),(x_{n-1},F(x_{n-1})),(x_{n-2},F(x_{n-2})),(x_{n-3},F(x_{n-3}))\),构造三次 Lagrange 多项式插值 \(\psi_3(x)\),积分后得到:

\[ y_{n+1}=y_n+\frac{h}{24}\bigl[55f_n-59f_{n-1}+37f_{n-2}-9f_{n-3}\bigr] \]

其中 \(f_k=f(x_k,y_k)\)。余项为

\[ l_{n+1}=\frac{251h^5}{720}F^{(4)}(\eta)+O(h^6),\quad\eta\in(x_{n-3},x_n) \]

因此局部截断误差为 \(O(h^5)\),具有 4 阶精度

Adams-Bashforth 4 步公式

\[ y_{n+1}=y_n+\frac{h}{24}\bigl(55f_n-59f_{n-1}+37f_{n-2}-9f_{n-3}\bigr) \]

局部截断误差:\(O(h^5)\),4 阶精度。

为什么叫"外推"

这一类算法在构造插值多项式时,是在区间 \([x_{n-k},x_n]\) 内,但积分在 \([x_n,x_{n+1}]\) 内计算。插值点在积分区间之外,因此称为 外推 (extrapolation)公式。

2.3 Adams 内插公式

若多项式插值时考虑点 \((x_{n+1},F(x_{n+1}))\),我们称这类线性多步法为 Adams 内插公式。Adams 内插公式是一种 隐式算法

一次多项式插值(梯形公式)

通过点 \((x_{n+1},F(x_{n+1}))\)\((x_n,F(x_n))\),构造一次多项式插值:

\[ \psi_1(x)=\frac{x-x_n}{x_{n+1}-x_n}F(x_{n+1})+\frac{x_{n+1}-x}{x_{n+1}-x_n}F(x_n) \]

代入积分公式,得到

\[ y_{n+1}=y_n+\frac{h}{2}\bigl[f(x_n,y_n)+f(x_{n+1},y_{n+1})\bigr] \]

这个方法其实就是 梯形公式

三次多项式插值(四阶 Adams-Moulton)

类似地,可以得到通过三次多项式插值后的 Adams 内插公式:

\[ y_{n+1}=y_n+\frac{h}{24}\bigl[9f(x_{n+1},y_{n+1})+19f_n-5f_{n-1}+f_{n-2}\bigr] \]

余项为

\[ l_{n+1}=-\frac{19h^5}{720}F^{(4)}(\eta)+O(h^6),\quad\eta\in(x_{n-2},x_{n+1}) \]

Adams-Moulton 3 步公式

\[ y_{n+1}=y_n+\frac{h}{24}\bigl(9f_{n+1}+19f_n-5f_{n-1}+f_{n-2}\bigr) \]

局部截断误差:\(O(h^5)\),4 阶精度。

Adams 外推 vs 内插

Adams-Bashforth(外推) Adams-Moulton(内插)
类型 显式 隐式
4 阶公式需要的历史步数 4 步(\(f_n,f_{n-1},f_{n-2},f_{n-3}\) 3 步(\(f_{n+1},f_n,f_{n-1},f_{n-2}\)
主误差系数 \(+251/720\) \(-19/720\)
稳定性 条件稳定 更好的稳定性

2.4 出发值的计算

在使用线性多步法的时候,仅仅有初值 \(y(0)=y_0\) 是不够的。例如在 4 阶 Adams-Bashforth 公式中,需要 \(y_0,y_1,y_2,y_3\) 的值才能计算 \(y_4\)

多步法需要出发值

线性多步法需要 \(y_0,y_1,\cdots,y_{k-1}\) 的值才能启动计算。这些初始的近似值称为 出发值 (starting values)。

通常采用 单步法 计算出发值。为保证多步法的精确度:

  • 用于计算出发值的单步法的阶应 至少不低于 多步法的阶;
  • 常常以 小步长 来计算出发值。

常用做法

四阶 Adams 方法常采用 四阶 Runge-Kutta 方法 计算初始的 3 个出发值(\(y_1,y_2,y_3\)),然后用 Adams 多步法继续计算。


3 预估-校正法

3.1 基本思想

在隐式方法每步的迭代求解中,通常由显式方法来计算迭代初值,称为 预估 (predictor)。每进行一次迭代,称作一次 校正 (corrector)。

例如,可以采用 Euler 方法进行预估:

\[ y_{n+1}^{(0)}=y_n+hf(x_n,y_n) \]

然后采用梯形公式进行校正:

\[ y_{n+1}^{(k+1)}=y_n+\frac{h}{2}\bigl[f(x_n,y_n)+f(x_{n+1},y_{n+1}^{(k)})\bigr] \]

3.2 改进 Euler 法的 PEC 结构

如果校正过程中的迭代次数限制为一次,就得到了改进 Euler 法:

\[ \begin{aligned} &\text{P(预估):}\quad p_{n+1}=y_n+hf_n\\ &\text{E(求值):}\quad\tilde{f}_{n+1}=f(x_{n+1},p_{n+1})\\ &\text{C(校正):}\quad y_{n+1}=y_n+\frac{h}{2}(f_n+\tilde{f}_{n+1}) \end{aligned} \]

这里用 P、E 和 C 分别表示预估(predictor)、求值(evaluation)和校正(corrector)步。

PEC 的含义

  • P:用显式公式预估 \(y_{n+1}\)
  • E:在新的预估值处计算导数值 \(f_{n+1}\)
  • C:用隐式公式校正 \(y_{n+1}\)

3.3 Adams 预估-校正法

类似地,可以采用 Adams-Bashforth 外推公式进行预估:

\[ p_{n+1}=y_n+\frac{h}{24}(55f_n-59f_{n-1}+37f_{n-2}-9f_{n-3}) \]

然后利用 Adams-Moulton 内插公式进行校正:

\[ y_{n+1}^{(k+1)}=y_n+\frac{h}{24}\bigl[9f(x_{n+1},y_{n+1}^{(k)})+19f_n-5f_{n-1}+f_{n-2}\bigr],\quad k=0,1,\cdots \]

校正优于预估

校正公式(Adams-Moulton)的截断误差优于预估公式(Adams-Bashforth)。预估提供一个好的初值,校正提高精度。

如果校正过程中的迭代次数限制为一次,则得到了 Adams 预估-校正法

\[ \begin{aligned} &\text{P:}\quad p_{n+1}=y_n+\frac{h}{24}(55f_n-59f_{n-1}+37f_{n-2}-9f_{n-3})\\ &\text{E:}\quad\tilde{f}_{n+1}=f(x_{n+1},p_{n+1})\\ &\text{C:}\quad y_{n+1}=y_n+\frac{h}{24}(9\tilde{f}_{n+1}+19f_n-5f_{n-1}+f_{n-2}) \end{aligned} \]

以上计算方法可以用符号 PEC 表示。

如果再求一次函数值并校正迭代一次,则记为 P(EC)\(^2\)

\[ \begin{aligned} &\text{P:}\quad p_{n+1}=y_n+\frac{h}{24}(55f_n-59f_{n-1}+37f_{n-2}-9f_{n-3})\\ &\text{E:}\quad\tilde{f}_{n+1}^{(1)}=f(x_{n+1},p_{n+1})\\ &\text{C:}\quad y_{n+1}^{(1)}=y_n+\frac{h}{24}(9\tilde{f}_{n+1}^{(1)}+19f_n-5f_{n-1}+f_{n-2})\\ &\text{E:}\quad\tilde{f}_{n+1}^{(2)}=f(x_{n+1},y_{n+1}^{(1)})\\ &\text{C:}\quad y_{n+1}^{(2)}=y_n+\frac{h}{24}(9\tilde{f}_{n+1}^{(2)}+19f_n-5f_{n-1}+f_{n-2}) \end{aligned} \]

3.4 PMECME 修正方案

对 Adams 外插和内插公式,可以将各自的截断误差(同阶的)用于修正,以进一步提高精度,从而实现只校正一次就达到精度要求的目的。

假设 \(p_n\) 以及 \(c_n\) 分别是 \(y_n\) 的预估值以及校正值。根据余项估计:

\[ \begin{aligned} y(x_{n+1})-p_{n+1}&=\frac{251h^5}{720}y^{(5)}(\xi_n),\quad x_{n-3}<\xi_n<x_{n+1}\\[6pt] y(x_{n+1})-c_{n+1}&=-\frac{19h^5}{720}y^{(5)}(\eta_n),\quad x_{n-2}<\eta_n<x_{n+1} \end{aligned} \]

两式相减:

\[ c_{n+1}-p_{n+1}=\frac{251h^5}{720}y^{(5)}(\xi_n)+\frac{19h^5}{720}y^{(5)}(\eta_n) \]

如果 \(y(x)\) 的五阶导数仍然连续,则在区间 \([x_{n-3},x_{n+1}]\) 中存在一点 \(\zeta_n\),使得

\[ c_{n+1}-p_{n+1}=\frac{270h^5}{720}y^{(5)}(\zeta_n)=\frac{3h^5}{8}y^{(5)}(\zeta_n) \]

于是就得到如下近似:

\[ \begin{aligned} y(x_{n+1})-p_{n+1}&\approx\frac{251}{270}(c_{n+1}-p_{n+1})\\[6pt] y(x_{n+1})-c_{n+1}&\approx-\frac{19}{270}(c_{n+1}-p_{n+1}) \end{aligned} \]

PMECME 修正方案

基于上述误差估计,得到了如下的 PMECME 预估-校正修正方案:

\[ \begin{aligned} &\text{P:}\quad p_{n+1}=y_n+\frac{h}{24}(55f_n-59f_{n-1}+37f_{n-2}-9f_{n-3})\\[4pt] &\text{M:}\quad m_{n+1}=p_{n+1}+\frac{251}{270}(c_n-p_n)\quad\text{(修正预估)}\\[4pt] &\text{E:}\quad\tilde{f}_{n+1}=f(x_{n+1},m_{n+1})\\[4pt] &\text{C:}\quad c_{n+1}=y_n+\frac{h}{24}(9\tilde{f}_{n+1}+19f_n-5f_{n-1}+f_{n-2})\\[4pt] &\text{M:}\quad y_{n+1}=c_{n+1}-\frac{19}{270}(c_{n+1}-p_{n+1})\quad\text{(修正校正)}\\[4pt] &\text{E:}\quad f_{n+1}=f(x_{n+1},y_{n+1}) \end{aligned} \]

其中 M 表示修正(modification)步。这种方法只用一次校正就能达到很高的精度。

PMECME 的优势

PMECME 方案通过利用预估和校正公式的截断误差信息,对预估值和校正值都进行了修正,使得即使只进行一次校正,也能获得接近多次校正迭代的精度。这是实际计算中非常高效的实现方式。


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

4.1 常微分方程组

考虑一阶常微分方程组

\[ \begin{cases} \dfrac{dy}{dx}=f(x,y,z)\\[10pt] \dfrac{dz}{dx}=g(x,y,z) \end{cases} \]

以及初值 \(y(x_0)=y_0\)\(z(x_0)=z_0\)

常微分方程组的数值计算方法与求解单个常微分方程数值方法 完全一致。只需要将标量公式向量化即可。

方程组的 Euler 法

对于方程组,Euler 方法为

\[ \begin{cases} y_{n+1}=y_n+hf(x_n,y_n,z_n)\\[6pt] z_{n+1}=z_n+hg(x_n,y_n,z_n) \end{cases} \]

方程组的 4 阶 RK 方法

对于方程组,4 阶 Runge-Kutta 方法为

\[ \begin{cases} k_1^{(y)}=hf(x_n,y_n,z_n),\quad k_1^{(z)}=hg(x_n,y_n,z_n)\\[6pt] k_2^{(y)}=hf\left(x_n+\dfrac{h}{2},y_n+\dfrac{k_1^{(y)}}{2},z_n+\dfrac{k_1^{(z)}}{2}\right),\quad\cdots\\[8pt] \vdots\\[4pt] y_{n+1}=y_n+\dfrac{1}{6}(k_1^{(y)}+2k_2^{(y)}+2k_3^{(y)}+k_4^{(y)})\\[6pt] z_{n+1}=z_n+\dfrac{1}{6}(k_1^{(z)}+2k_2^{(z)}+2k_3^{(z)}+k_4^{(z)}) \end{cases} \]

每个变量都需要计算一组 \(k\) 值,但计算流程与标量情况完全相同。

4.2 高阶微分方程

高阶微分方程可以化成 方程组 的形式。例如对于二阶方程

\[ \frac{d^2y}{dx^2}=g\left(x,y,\frac{dy}{dx}\right) \]

以及初值 \(y(x_0)=y_0\)\(y'(x_0)=y_0'\)

通过定义 \(z=\dfrac{dy}{dx}\),得到一阶常微分方程组:

\[ \begin{cases} \dfrac{dy}{dx}=z\\[10pt] \dfrac{dz}{dx}=g(x,y,z) \end{cases} \]

以及初值 \(y(x_0)=y_0\)\(z(x_0)=y'(x_0)=y_0'\equiv z_0\)

一般规律

\(m\) 阶常微分方程可以转化为 \(m\) 个一阶方程组成的方程组。转化的关键是引入中间变量表示各阶导数:

\[ y_1=y,\quad y_2=y',\quad y_3=y'',\quad\cdots,\quad y_m=y^{(m-1)} \]

然后方程组为

\[ \begin{cases} y_1'=y_2\\ y_2'=y_3\\ \vdots\\ y_m'=g(x,y_1,y_2,\cdots,y_m) \end{cases} \]

5 总结

5.1 方法对比

方法 类型 显式/隐式 局部误差 全局误差 特点
Euler 法 单步 显式 \(O(h^2)\) \(O(h)\) 最简单
向后 Euler 法 单步 隐式 \(O(h^2)\) \(O(h)\) A-稳定
梯形公式 单步 隐式 \(O(h^3)\) \(O(h^2)\) A-稳定,2 阶
改进 Euler 法 单步 显式 \(O(h^3)\) \(O(h^2)\) PEC 结构
2 阶 RK(中点) 单步 显式 \(O(h^3)\) \(O(h^2)\) 2 阶显式
4 阶 RK(经典) 单步 显式 \(O(h^5)\) \(O(h^4)\) 最常用,高精度
Adams-Bashforth 4 步 多步 显式 \(O(h^5)\) \(O(h^4)\) 需出发值,计算量小
Adams-Moulton 3 步 多步 隐式 \(O(h^5)\) \(O(h^4)\) 需迭代,稳定性好
Adams PEC/PMECME 多步 显-隐结合 \(O(h^5)\) \(O(h^4)\) 实用高效

5.2 方法选择建议

选择策略

  • 教学/简单问题:Euler 法或改进 Euler 法
  • 一般非刚性问题,追求精度:四阶 Runge-Kutta 方法
  • 长区间积分,节省计算量:Adams 预估-校正法(PMECME)
  • 刚性问题\(|\lambda|\) 很大,解有快慢变化):隐式方法(向后 Euler、梯形公式、Adams-Moulton)
  • 需要自适应步长:Runge-Kutta-Fehlberg 等嵌入式 RK 方法(课程未涉及,但工程常用)

单步法 vs 多步法

  • 单步法(RK 方法):自启动,易于变步长,适合自适应算法
  • 多步法(Adams 方法):每步计算量小,但需要出发值,变步长较复杂
  • 实际求解器中常常结合使用:用 RK 方法计算前几步,然后切换到 Adams 方法继续