跳转至

Chap 5: Initial-Value Problems for Ordinary Differential Equations⚓︎

3066 个字 预计阅读时间 15 分钟

Runge-Kutta Methods⚓︎

目标:一种具有高阶局部截断误差的单步方法,无需计算 \(f\) 的导数

思路:在这个单步方法中,我们考虑一条在点 \((t_i, w_i), (t_{i+1}, w_{i+1})\) 之间的线段的斜率。我们可以通过找到更好的斜率来改善结果。

观察欧拉法:

\[ \begin{cases} w_{i+1} & = w_i + h\Big[ \dfrac{1}{2} K_1 + \dfrac{1}{2} K_2 \Big] \\ K_1 & = f(t_i, w_i) \\ K_2 & = f(t_i + h, w_i + hK_1) \end{cases} \]

我们将其进一步泛化:

\[ \begin{cases} w_{i+1} & = w_i + h[\textcolor{red}{\lambda_1} K_1 + \textcolor{red}{\lambda_2} K_2 ] \\ K_1 & = f(t_i, w_i) \\ K_2 & = f(t_i + \textcolor{red}{p}h, w_i + \textcolor{red}{p}hK_1) \end{cases} \]

我们要找到 \(\lambda_1, \lambda_2, p\),使得该方法的局部阶段误差的阶数为 2

  1. 写出 \(K_2\) \((t_i, y_i)\) 上的泰勒展开式:

    \[ \begin{align} K_2 & = f(t_1 + ph, y_i + phK_1) \notag \\ & = f(t_i, y_i) + phf_t(t_i, y_i) + phK_1f_y(t_i, y_i) + O(h^2) \notag \\ & = y'(t_i) + phy''(t_i) + O(h^2) \notag \end{align} \]
  2. \(K_2\) 代入到第一个式子中:

    \[ \begin{align} w_{i+1} & = y_i + h\{\lambda_1 y'(t_i) + \lambda_2[y'(t_i) + phy''(t_i) + O(h^2)]\} \notag \\ & = y_i + (\lambda_1 + \lambda_2) hy'(t_i) + \lambda_2 ph^2 y''(t_i) + O(h^3) \notag \end{align} \]

    其中 \(y''(t) = f_y(t, y) + f_y(t, y) f(t, y)\)

  3. 找到 \(\lambda_1, \lambda_2, p\),使得 \(\tau_{i+1} = (y_{i+1} - w_{i+1}) / h = O(h^2)\)


\[ \begin{align} w_{i+1} & = y_i + (\lambda_1 + \lambda_2) hy'(t_i) + \lambda_2 ph^2 y''(t_i) + O(h^3) \notag \\ y_{i+1} & = y_i + hy'(t_i) + \dfrac{h^2}{2} y''(t_i) + O(h^3) \notag \end{align} \]

可以得到:\(\lambda_1 + \lambda_2 = 1, \lambda_2 + p = 1\)3 个未知数,2 个方程)

所以有无穷多个解。而由这两个方程得到的一系列方法被称为 2 阶龙格 - 库塔法(Runge-Kutta method of order 2)。

注:修改后的欧拉法就是龙格 - 库塔法的一种特殊情况(\(p = 1, \lambda_1 = \lambda_2 = \dfrac{1}{2}\)


计算更高精度:

\[ \begin{cases} w_{i+1} & = y_i + h[\textcolor{red}{\lambda_1} K_1 + \textcolor{red}{\lambda_2} K_2 + \dots + \textcolor{red}{\lambda_m} K_m] \\ K_1 & = f(t_i, w_i) \\ K_2 & = f(t_i + \textcolor{red}{\alpha_2} h, w_i + \textcolor{red}{\beta_{21}} hK_1) \\ K_3 & = f(t_i + \textcolor{red}{\alpha_3} h, w_i + \textcolor{red}{\beta_{31}} hK_1 + \textcolor{red}{\beta_{32}} hK_2) \\ \dots \\ K_m & = f(t_i + \textcolor{red}{\alpha_m} h, w_i + \textcolor{red}{\beta_{m1}} hK_1 + \textcolor{red}{\beta_{m2}} hK_2 + \dots + \textcolor{red}{\beta_{m, m-1}} hK_{m-1}) \\ \end{cases} \]

最受欢迎的是经典的 4 阶龙格 - 库塔法:

\[ \begin{cases} w_{i+1} & = w_i + \dfrac{h}{6}(K_1 + 2K_2 + 2K_3 + K_4) \\ K_1 & = f(t_i, w_i) \\ K_2 & = f(t_i + \dfrac{h}{2}, w_i + \dfrac{h}{2} K_1) \\ K_3 & = f(t_i + \dfrac{h}{2}, w_i + \dfrac{h}{2} K_2) \\ K_4 & = f(t_i + h, w_i + hK_3) \end{cases} \]

  • 在使用龙格 - 库塔法时,主要的计算量在于求解 \(f\)。布彻已经建立了每步求解次数与局部截断误差 (LTE) 阶数之间的关系:

    每步求解次数 2 3 4 5-7 8-9 n≥10
    最佳可能的 LTE \(O(h^2)\) \(O(h^3)\) \(O(h^4)\) \(O(h^{n-1})\) \(O(h^{n-2})\) \(O(h^{n-3})\)
  • 因为龙格 - 库塔法时基于泰勒展开式的,所以 \(y\) 不得不足够平滑,以获取在高阶方法下的更高的精度。通常低阶方法相比高阶方法会采用更小的步幅。

Multistep Methods⚓︎

思路:使用 \(y, y'\) 在多个网格点 (mesh points) 上的线性组合,以得到更好的近似值 \(y(t_{i+1})\)

\[ w_{i+1} = \textcolor{red}{a_{m-1}} w_i + \textcolor{red}{a_{m-2}} w_{i-1} + \dots + \textcolor{red}{a_0} w_{i+1-m} + h[\textcolor{red}{b_m} f_{i+1} + \textcolor{red}{b_{m-1}} f_i + \dots + \textcolor{red}{b_0} f_{i+1-m}] \]

具体方法:从积分中获取。在 \([t_i, t_{i+1}]\) 上对 \(y'(t) = f(t, y)\) 进行积分,得到:

\[ y(t_{i+1}) - y(t_i) = \int_{t_i}^{t_{i+1}} f(t, y(t)) dt \]

关键是近似计算积分。不同的近似方法会得到不同的差分方程。

Adams-Bashforth Explicit \(m\)-step Technique⚓︎

使用牛顿后向差分公式,在 \((t_i, f_i), (t_{i-1}, f_{i-1}), \dots, (t_{i+1-m}, f_{i+1-m})\) 上对 \(f\) 进行插值,并得到 \(P_{m-1}(t)\)。或者令 \(t = t_i + sh, s \in [0, 1]\),我们有:

\[ \int_{t_i}^{t_{i+1}} f(t, y(t)) dt = h \int_0^1 P_{m-1}(t_i + sh) ds + h \int_0^1 (t_i + sh) ds \]

最后得到显式公式:\(w_{i+1} = w_i + h\int_0^1 P_{m-1}(t_i + sh)ds\)

定义

多步法的局部截断误差为:

\[ \tau_{i+1}(h) = \dfrac{y_{i+1} - (a_{m-1}y_i + \dots + a_0 y_{i+1-m})}{h} - [b_m f_{i+1} + \dots + b_0 f_{i+1-m}] \]

其中 \(i = m-1, m, \dots, n - 1\)

例子

请求出 Adams-Bashforth 2 步显式法。

使用牛顿后向差分公式,在 \((t_i, f_i), (t_{i-1}, f_{i-1})\) 上对 \(f\) 插值:

\[ P_1(t_i + sh) = f_i + s \nabla f_i = f_i + s(f_i - f_{i-1}) \]

得到 \(w_{i+1} = w_i + h \int_0^1 [f_i + s(f_i - f_{i-1})] ds = w_i + \dfrac{h}{2} (3f_i - f_{i-1})\)

局部截断误差为:

\[ \begin{align} \tau_{i+1} & = \dfrac{y(t_{i+1}) - w_{i+1}}{h} = \int_0^1 R_1 (t_i + sh) ds \notag \\ & = \int_0^1 \dfrac{d^2 f(\xi_i, t(\xi_i))}{dt^2} \dfrac{1}{2!} sh(s+1)h ds = \dfrac{5}{12} h^2 y'''(\widetilde{\xi_i}) \notag \end{align} \]

一般来说,对于 \(\tau = A_mh^my^{(m+1)}(\xi_i)\)\(A_m\) 和系数 \(f_i, f_{i-1}, f_{i+1-m}\) 能从表格中找到。

Adams-Bashforth 4 步显式法:\(w_{i+1} = w_i + \dfrac{5}{24} (55f_i - 59 f_{i-1} + 37 f_{i-2} - 9f_{i-3})\)

Adams-Moulton Implicit \(m\)-step Technique⚓︎

使用牛顿前向差分公式,在 \((t_{i+1}, \textcolor{red}{f_{i+1}}), (t_i, f_i), \dots, (t_{i+1-m}, f_{i+1-m})\) 上对 \(f\) 进行插值,并得到 \(P_m(t)\)。类似的,我们可以得到一组 \(\tau_{i+1} = B_m h^{m+1} y^{(m+2)} (\xi_i)\) 的隐式公式。

Adams-Moulton 3 步隐式法:\(w_{i+1} = w_i + \dfrac{h}{24} (9 f_{i+1} + 19 f_i - 5 f_{i-1} + f_{i-2})\)

Adams Predictor-Corrector System⚓︎

  1. 龙格 - 库塔法计算前 \(m\) 个初始值
  2. Adams-Bashforth 显式法进行预测
  3. Adams-Moulton 隐式法进行纠正

  • 对于上述步骤用到的三个公式,它们的局部截断误差的阶数必须相同。
  • 最受欢迎的系统是将 4 Adams-Bashforth 法作为预测器,将 1 次迭代下的 Adams-Moulton 法作为纠正器,而起始值通过 4 阶龙格 - 库塔法获得。

Derive from Taylor Expansion⚓︎

\[ w_{i+1} = \textcolor{red}{a_{m-1}}w_i + \textcolor{red}{a_{m-2}}w_{i-1} + \dots + \textcolor{red}{a_0}w_{i+1-m} + h[\textcolor{red}{b_{m}}f_{i+1} + \textcolor{red}{b_{m-1}}f_i + \dots + \textcolor{red}{b_0}f_{i+1-m}] \]

思路:扩展在关于 \(t_i\) 的泰勒级数里的 \(y_{i-1}, \dots, y_{i+1-m}\) \(f_{i+1}, f_{i-1}, \dots, f_{i+1-m}\),并让 \(h^k\) 的系数相等,以获得 \(a_0, \dots, a_{m-1}\) \(b_0, \dots, b_m\)

例子

请求出形如以下形式的 4 阶公式:

\[ w_{i+1} = \textcolor{red}{a_2}w_i + \textcolor{red}{a_1}w_{i-1} + \textcolor{red}{a_0}w_{i-2} + h[\textcolor{red}{b_3}f_i + \textcolor{red}{b_2}f_{i-1} + \textcolor{red}{b_1}f_{i-2} + \textcolor{red}{b_0}f_{i-3}] \]

\(t_i\) 处扩展 \(y_{i-1}, y_{i-2}, f_{i-1}, f_{i-2}, f_{i-3}\) \(y(t_{i+1})\)

假设 \(w_i = y_i\) 的情况下,\(\tau_{i+1} = \dfrac{y_{i+1} - w_{i+1}}{h} = O(h^4)\)

\[ \begin{align} y_{i-1} = & y_i - hy_i' + \dfrac{1}{2} h^2 y_i'' - \dfrac{1}{6}h^3 y_i''' + \dfrac{1}{24}h^4 y_i^{(4)} + O(h^5) \notag \\ y_{i-2} = & y_i - 2hy_i' + 2 h^2 y_i'' - \dfrac{4}{3}h^3 y_i''' + \dfrac{2}{3}h^4 y_i^{(4)} + O(h^5) \notag \\ f_{i-1} = & y_i' - hy_i'' + \dfrac{1}{2}h^2 y_i''' - \dfrac{1}{6}h^3y_i^{(4)} + O(h^4) \notag \\ f_{i-2} = & y_i' - 2hy_i'' + 2h^2 y_i''' - \dfrac{4}{3}h^3y_i^{(4)} + O(h^4) \notag \\ f_{i-3} = & y_i' - 3hy_i'' + \dfrac{9}{2}h^2 y_i''' - \dfrac{9}{2}h^3y_i^{(4)} + O(h^4) \notag \\ \end{align} \]

$$$ y(t_{i+1}) = y_i + hy_i' + \dfrac{1}{2}h^2y_i'' + \dfrac{1}{6}h^3 y_i''' + \dfrac{1}{24}h^4 y_i^{(4)} + O(h^5) $

5 个方程,7 个未知量。

  • \(a_0 = a_1 = 0\) -> Adams-Bashforth 显式
  • \(f_{i+1}\) 替换 \(f_{i-1}\),并令 \(a_0 = a_1 = 0\) -> Adams-Bashforth 隐式
  • \(w_{i-3}\) 替换 \(f_{i-3}\),我们能得到另一组阶数为 4 的方法,包括了显式 Milne 法:

    \[ w_{i+1} = w_{i-3} + \dfrac{4h}{3}(2f_i - f_{i-1} + 2f_{i-2}) \]

    其截断误差为 \(\dfrac{14}{45}h^4y^{(5)}(\xi_i), \xi_i \in (t_{i-3}, t_{i+1})\)

  • \(a_0 = 0, a_1 = 1\) -> Simpson 隐式法

    \[ w_{i+1} = w_{i-1} + \dfrac{h}{3}(f_{i+1} + 4f_i + f_{i-1}) \]

    其截断误差为 \(-\dfrac{h^4}{90}y^{(5)}(\xi_i), \xi_i \in (t_{i-1}, t_{i+1})\)

Higher-Order Equations and Systems of Differential Equations⚓︎

m-th Order System of 1st-Order IVP⚓︎

\[ \begin{cases} u_1'(t) = f_1(t, u_1(t), \dots, u_m(t)) \\ \dots \\ u_m'(t) = f_m(t, u_1(t), \dots, u_m(t)) \end{cases} \]

初始条件为:\(u_1(a) = \alpha_1, u_2(a) = \alpha_2, \dots, u_m(a) = \alpha_m\)

\(\bm{y} = \begin{bmatrix}u_1 \\ \vdots \\ u_m\end{bmatrix}, \bm{f} = \begin{bmatrix}f_1 \\ \vdots \\ f_m\end{bmatrix}, \bm{\alpha} = \begin{bmatrix}\alpha_1 \\ \vdots \\ \alpha_m\end{bmatrix}\),可以得到:\(\begin{cases}\bm{y}'(t) = \bm{f}(t, \bm{y}) \\ \bm{y}(a) = \bm{\alpha}\end{cases}\)

Higher-Order Differential Equation⚓︎

\[ \begin{cases} y^{(m)}(t) = f(t, y, y', \dots, y^{(m-1)}), a \le t \le b \\ y(a) = \alpha_1, y'(a) = \alpha_2, \dots, y^{(m-1)}(a) = \alpha_m \end{cases} \]

思路:将高阶的微分方程归约到一个 1 阶的微分方程组。

\(u_1(t) = y(t), u_2(t) = y'(t), \dots, u_m(t) = y^{(m-1)}(t)\),得到:

\[ \begin{cases} u_1' = y' = u_2 \\ u_2' = y'' = u_3 \\ \vdots \\ u_{m-1}' = y^{(m-1)} = u_m \\ u_m' = y^{(m)} = f(x, u_1, \dots, u_m) \end{cases} \]

初始条件为 \(u_1(a) = \alpha_1, u_2(a) = \alpha_2, \dots, u_m(a) = \alpha_m\)

例子

使用欧拉法求解以下 IVP\(h = 0.1\)

\[ \begin{align} & y'' - 2y' + y = te^t - 1.5t + 1 \quad \text{for } 0 \le t \le 0.2 \notag \\ & y(0) = 0, y'(0) = -0.5 \notag \end{align} \]

\(u_1(t) = y(t), u_2(t) = y'(t)\),得到:

\[ \begin{cases} u_1'(t) = u_2(t) \\ u_2'(t) = te^t - 1.5t + 1 - u_1(t) + 2u_2(t) \end{cases} \]

初始条件为 \(u_1(0) = 0, u_2(0) = -0.5\)

根据

\[ \begin{align} w_{i+1} & = w_1 + h\Big[\dfrac{1}{2}K_1 + \dfrac{1}{2}K_2\Big] \notag \\ K_1 & = f(t_i, w_i) \notag \\ K_2 & = f(t_i + h, w_i + hK_1) \notag \end{align} \]

,计算:

精确解为:\(y(t) = \dfrac{t^3 e^t}{6} - te^t + 2e^t - 1.5t - 2\)

Stability⚓︎

定义

当局部截断误差为 \(\tau_i(h)\) 的一步微分方程法满足下面的条件时,我们认为它和近似得到的微分方程是一致的(consistent):

\[ \lim\limits_{h \rightarrow 0} \max\limits_{1 \le i \le n} |\tau_i(h)| = 0 \]

对于多步法,还要求对于 \(i = 1, 2, \dots, m-1\),有 \(\lim\limits_{h \rightarrow 0}|w_i - y_i| = 0\)

定义

当满足下面的条件时,我们认为一步微分方程法关于近似得到的微分方程收敛(convergent):

\[ \lim\limits_{h \rightarrow 0} \max\limits_{1 \le i \le n} |w_i - y_i| = 0 \]

多步法和上面的一样。

定义

将某个方法用在一个简单的检验方程(test equation) 上:\(y' = \lambda y, y(0) = \alpha\),其中 \(\text{Re}(\lambda) < 0\)。假设摄入误差仅在初始点被引入。如果这个初始误差在特定步幅 \(h\) 上被缩小的话,那么该方法关于 \(H = \lambda h\) 绝对稳定的(absolutely stable)。所有 \(H\) 构成的集合称为绝对稳定性区域(the region of absolute stability)。

\(A\) 的绝对稳定性区域大于 \(B\) 时,称法 \(A\) 比法 \(B\) 更稳定

例子

例子

考虑欧拉显式法 \(w_{i+1} = w_i + hf_i\)

\[ w_{i+1} = w_i + h\lambda w_i = \alpha(1 + H)^{i+1} \]
\[ \alpha^* = \alpha + \varepsilon \Rightarrow w_{i+1}^* = \alpha^* (1 + H)^{i+1} \Rightarrow \varepsilon_{i+1} = w_{i+1}^* - w_{i+1} = (1 + H)^{i + 1}\varepsilon \]

因此要想保证误差减小,必须满足 \(|1 + H| < 1\)

考虑欧拉隐式法 \(w_{i+1} = w_i + hf_{i+1}\)

\[ w_{i+1} = \Big(\dfrac{1}{1 - H}\Big)w_i \Rightarrow \varepsilon_{i+1} = \Big(\dfrac{1}{1 - H}\Big)^{i+1} \varepsilon \]

因此要想保证误差减小,必须满足 \(|1 - H| < 1\)

注:它是无条件稳定的 (unconditionally stable)

考虑 2 Runge-Kutta 隐式法:

\[ \begin{cases} w_{i+1} = w_i + hK_1 \\ K_1 = f(t_i + \dfrac{h}{2}, w_i + \dfrac{h}{2}K_1) \end{cases} \]

可以得到 \(K_1 = \dfrac{\lambda w_i}{1 - \frac{\lambda h}{2}} \Rightarrow w_{i+1} = \Big(\dfrac{2+H}{2-H}\Big)w_i \Rightarrow \Big|\dfrac{2+H}{2-H}\Big| < 1\)

注:它是无条件稳定的 (unconditionally stable)

补充:1-4 阶的 Runge-Kutta 显式法

\[ \begin{cases} w_{i+1} & = w_i + \dfrac{h}{6} (K_1 + 2K_2 + 2K_3 + 2K_4) \\ K_1 & = f(t_i, w_i) \\ K_2 & = f(t_i + \dfrac{h}{2}, w_i + \dfrac{h}{2} K_1) \\ K_3 & = f(t_i + \dfrac{h}{2}, w_i + \dfrac{h}{2} K_2) \\ K_4 & = f(t_i + h, w_i + \dfrac{h}{2} K_3) \\ \end{cases} \]
\[ \begin{align} K_1 & = \lambda w_i \notag \\ K_2 & = \lambda w_i (1 + \dfrac{H}{2}) \notag \\ K_3 & = \lambda w_i (1 + \dfrac{H}{2} + \dfrac{H^2}{4}) \notag \\ K_4 & = \lambda w_i (1 + H + \dfrac{H^2}{2} + \dfrac{H^3}{4}) \notag \\ w_{i+1} & = w_i \Big(1 + H + \dfrac{H^2}{2} + \dfrac{H^3}{6} + \dfrac{H^4}{24}\Big) \end{align} \]

考虑以下 IVP 组(刚性组 (stiff system)

\[ \begin{cases} u_1' & = 9u_1 + 24u_2 + 5 \cos t - \dfrac{1}{3} \sin t, \quad u_1(0) = \dfrac{4}{3} \\ u_2' & = -24u_1 - 51u_2 - 9 \cos t + \dfrac{1}{3} \sin t, \quad u_1(0) = \dfrac{2}{3} \end{cases} \]

如何选择步幅 \(h\),以保证应用欧拉显式法之后的稳定性?

唯一解为:\(\begin{cases}u_1(t) = 2e^{-3t} - e^{-39t} + \dfrac{1}{3} \cos t \\ u_2(t) = -e^{-3t} + 2e^{-39t} - \dfrac{1}{3} \cos t\end{cases}\)

矩阵 \(\begin{bmatrix}9 & 24 \\ -24 & 51\end{bmatrix}\) 的特征值为 \(\lambda_1 = -3, \lambda_2 = -39\)

\(-2 < \lambda h < 0 \Rightarrow h < \dfrac{2}{39} \approx 0.051\)

评论区

如果大家有什么问题或想法,欢迎在下方留言~