昆仑山:眼中无形心中有穴之穴人合一

夫君子之行,静以修身,俭以养德;非澹泊无以明志,非宁静无以致远。夫学须静也,才须学也;非学无以广才,非志无以成学。怠慢则不能励精,险躁则不能冶性。年与时驰,意与岁去,遂成枯落,多不接世。悲守穷庐,将复何及!

 

9.7一阶常微分方程组的四阶龙格-库塔方法

一阶常微分方程组的四阶龙格-库塔方法 详细讲解与推导

各位同学,今天我们系统讲解一阶常微分方程组的数值解法,核心是经典四阶龙格-库塔(Runge-Kutta, RK)方法的推广、推导与应用。我会从最基础的标量方程出发,逐步推广到方程组,讲透公式的来龙去脉、推导逻辑与应用要点。

一、基础铺垫:从标量方程到方程组的核心逻辑

我们之前已经系统学习了单个一阶常微分方程初值问题的数值解法,其标准形式为:

\[\begin{cases} y'(x) = f(x, y(x)) \\ y(x_0) = y_0 \end{cases} \]

针对这个问题,我们推导了经典四阶龙格-库塔方法,它是一种单步、自启动、整体截断误差为\(O(h^4)\)的高精度方法,公式为:

\[\begin{cases} y_{n+1} = y_n + \frac{h}{6}\left(k_1 + 2k_2 + 2k_3 + k_4\right) \\ k_1 = f(x_n, y_n) \\ k_2 = f\left(x_n + \frac{h}{2}, y_n + \frac{h}{2}k_1\right) \\ k_3 = f\left(x_n + \frac{h}{2}, y_n + \frac{h}{2}k_2\right) \\ k_4 = f\left(x_n + h, y_n + hk_3\right) \end{cases} \]

其中\(h = x_{n+1} - x_n\)为求解步长,\(k_1\sim k_4\)是区间\([x_n, x_{n+1}]\)上4个不同点处的斜率值。

现在我们要解决的核心问题是:当我们有多个相互耦合的一阶常微分方程(即一阶方程组)时,这个方法还能用吗?答案是:完全可以,核心是「向量形式的不变性」

1.1 一阶方程组初值问题的标准形式

我们考察含\(N\)个未知函数\(y_1(x), y_2(x), \dots, y_N(x)\)的一阶方程组,其一般形式为:

\[y_i'(x) = f_i\left(x, y_1(x), y_2(x), \dots, y_N(x)\right), \quad i=1,2,\dots,N \]

对应的初始条件为:

\[y_i(x_0) = y_i^0, \quad i=1,2,\dots,N \]

这里每个方程的右端项\(f_i\),都依赖于自变量\(x\)所有未知函数,这就是方程组的「耦合性」,也是我们需要解决的核心问题。

1.2 方程组的向量形式改写

为了把标量方程的解法直接推广过来,我们引入向量记号,将所有未知函数、右端项都写成\(N\)维列向量:

  • 未知函数向量:\(\boldsymbol{y}(x) = \left(y_1(x), y_2(x), \dots, y_N(x)\right)^T\)
  • 初始值向量:\(\boldsymbol{y}_0 = \left(y_1^0, y_2^0, \dots, y_N^0\right)^T\)
  • 右端向量值函数:\(\boldsymbol{f}(x, \boldsymbol{y}) = \left(f_1(x,\boldsymbol{y}), f_2(x,\boldsymbol{y}), \dots, f_N(x,\boldsymbol{y})\right)^T\)

此时,一阶方程组的初值问题,就可以写成和标量方程形式完全一致的向量形式:

\[\begin{cases} \boldsymbol{y}'(x) = \boldsymbol{f}(x, \boldsymbol{y}(x)) \\ \boldsymbol{y}(x_0) = \boldsymbol{y}_0 \end{cases} \tag{1} \]

这一步改写是整个推广的核心:标量\(y\)变成了向量\(\boldsymbol{y}\),标量函数\(f\)变成了向量值函数\(\boldsymbol{f}\),但方程的数学结构没有任何变化。

二、一阶方程组四阶龙格-库塔方法的详细推导

2.1 龙格-库塔方法的核心本质

首先我们要明确:龙格-库塔方法的本质,是用区间内多个点的斜率的加权平均,来代替泰勒展开中的高阶导数项,从而在不求解\(f\)的高阶偏导数的前提下,获得高阶精度。

对于标量方程,我们通过泰勒展开对比,确定了四阶RK方法的参数,使得局部截断误差为\(O(h^5)\),整体误差为\(O(h^4)\)。对于向量形式的方程(1),所有的向量加法、数乘运算都是良定义的,向量值函数的泰勒展开对每个分量都可以独立进行,因此标量的RK公式可以直接推广到向量形式。

2.2 向量形式的四阶RK公式推导

我们直接对标量的四阶RK公式做向量推广,得到向量形式的四阶RK公式:

\[\boldsymbol{y}_{n+1} = \boldsymbol{y}_n + \frac{h}{6}\left(\boldsymbol{k}_1 + 2\boldsymbol{k}_2 + 2\boldsymbol{k}_3 + \boldsymbol{k}_4\right) \tag{2} \]

其中每个\(\boldsymbol{k}_i\)都是和\(\boldsymbol{y}\)同维度的\(N\)维向量,定义为:

\[\begin{cases} \boldsymbol{k}_1 = \boldsymbol{f}(x_n, \boldsymbol{y}_n) \\ \boldsymbol{k}_2 = \boldsymbol{f}\left(x_n + \frac{h}{2}, \boldsymbol{y}_n + \frac{h}{2}\boldsymbol{k}_1\right) \\ \boldsymbol{k}_3 = \boldsymbol{f}\left(x_n + \frac{h}{2}, \boldsymbol{y}_n + \frac{h}{2}\boldsymbol{k}_2\right) \\ \boldsymbol{k}_4 = \boldsymbol{f}\left(x_n + h, \boldsymbol{y}_n + h\boldsymbol{k}_3\right) \end{cases} \tag{3} \]

接下来我们严格证明:这个向量形式的公式,对每个分量都保持四阶精度,即局部截断误差为\(O(h^5)\)

证明:局部截断误差的阶数分析

局部截断误差的定义:假设\(\boldsymbol{y}_n = \boldsymbol{y}(x_n)\)是精确值,那么局部截断误差为\(\boldsymbol{T}_n = \boldsymbol{y}(x_{n+1}) - \boldsymbol{y}_{n+1}\),我们需要证明\(\boldsymbol{T}_n\)的每个分量都是\(O(h^5)\)

首先,对\(\boldsymbol{y}(x)\)的第\(i\)个分量\(y_i(x)\),在\(x_n\)处做泰勒展开:

\[y_i(x_{n+1}) = y_i(x_n) + h y_i'(x_n) + \frac{h^2}{2!} y_i''(x_n) + \frac{h^3}{3!} y_i'''(x_n) + \frac{h^4}{4!} y_i''''(x_n) + O(h^5) \tag{4} \]

我们将公式(2)(3)的\(y_{n+1,i}\)\(\boldsymbol{y}_{n+1}\)的第\(i\)个分量)也做泰勒展开,和(4)式对比。

  1. 一阶导数项:\(y_i'(x_n) = f_i(x_n, \boldsymbol{y}(x_n)) = f_i(x_n, \boldsymbol{y}_n) = k_{1,i}\)\(\boldsymbol{k}_1\)的第\(i\)个分量),对应(4)式的\(h y_i'(x_n)\)项。

  2. 二阶导数项:对\(y_i'(x)\)求全导数,得到

    \[y_i''(x) = \frac{d}{dx}f_i(x,\boldsymbol{y}(x)) = \frac{\partial f_i}{\partial x} + \sum_{j=1}^N \frac{\partial f_i}{\partial y_j} \cdot y_j'(x) = \frac{\partial f_i}{\partial x} + \sum_{j=1}^N \frac{\partial f_i}{\partial y_j} f_j(x,\boldsymbol{y}) \]

    现在展开\(\boldsymbol{k}_2\)的第\(i\)个分量:

    \[k_{2,i} = f_i\left(x_n + \frac{h}{2}, \boldsymbol{y}_n + \frac{h}{2}\boldsymbol{k}_1\right) \]

    对多元函数\(f_i\)做泰勒展开,保留到\(h^2\)项:

    \[k_{2,i} = f_i(x_n, \boldsymbol{y}_n) + \frac{h}{2}\frac{\partial f_i}{\partial x} + \sum_{j=1}^N \frac{h}{2}k_{1,j} \frac{\partial f_i}{\partial y_j} + O(h^2) \]

    代入\(k_{1,j}=f_j(x_n,\boldsymbol{y}_n)\),得到:

    \[k_{2,i} = k_{1,i} + \frac{h}{2}\left( \frac{\partial f_i}{\partial x} + \sum_{j=1}^N \frac{\partial f_i}{\partial y_j} f_j \right) + O(h^2) = k_{1,i} + \frac{h}{2}y_i''(x_n) + O(h^2) \]

  3. 同理,展开\(\boldsymbol{k}_3\)\(\boldsymbol{k}_4\)的分量:

    \[k_{3,i} = f_i\left(x_n + \frac{h}{2}, \boldsymbol{y}_n + \frac{h}{2}\boldsymbol{k}_2\right) = k_{1,i} + \frac{h}{2}y_i''(x_n) + \frac{h^2}{4}\sum_{j=1}^N \frac{\partial f_i}{\partial y_j} y_j''(x_n) + O(h^2) \]

    \[k_{4,i} = f_i\left(x_n + h, \boldsymbol{y}_n + h\boldsymbol{k}_3\right) = k_{1,i} + h y_i''(x_n) + \frac{h^2}{2}\sum_{j=1}^N \frac{\partial f_i}{\partial y_j} y_j''(x_n) + O(h^2) \]

  4. \(k_{1,i}\sim k_{4,i}\)代入\(y_{n+1,i}\)的表达式:

    \[y_{n+1,i} = y_{n,i} + \frac{h}{6}\left(k_{1,i} + 2k_{2,i} + 2k_{3,i} + k_{4,i}\right) \]

    把上面的展开式代入后合并同类项,我们会发现:

    • \(h^0\)项:\(y_{n,i} = y_i(x_n)\),和(4)式完全匹配;
    • \(h^1\)项:\(\frac{h}{6}(k_{1,i} + 2k_{1,i} + 2k_{1,i} + k_{1,i}) = h k_{1,i} = h y_i'(x_n)\),和(4)式完全匹配;
    • \(h^2\)项:\(\frac{h}{6}\left(2\cdot \frac{h}{2}y_i'' + 2\cdot \frac{h}{2}y_i'' + h y_i''\right) = \frac{h^2}{2}y_i''(x_n)\),和(4)式完全匹配;
    • 继续展开到\(h^4\)项,经典四阶RK的参数会让\(h^3\)\(h^4\)项和泰勒展开式完全匹配,最终的差值仅为\(O(h^5)\)

由此我们证明了:向量形式的四阶龙格-库塔方法,对每个未知函数的分量,都保持了和标量情形一致的四阶精度,局部截断误差为\(O(h^5)\),整体截断误差为\(O(h^4)\)

2.3 二元方程组的特例(N=2)

为了让大家更直观地理解计算过程,我们看最常用的二元一阶方程组的情形,这也是教材中给出的例子。

对于含两个未知函数\(y(x), z(x)\)的一阶方程组:

\[\begin{cases} y'(x) = f(x, y, z) \\ z'(x) = g(x, y, z) \\ y(x_0) = y_0,\ z(x_0) = z_0 \end{cases} \]

此时向量\(\boldsymbol{y}(x) = \begin{pmatrix} y(x) \\ z(x) \end{pmatrix}\)\(\boldsymbol{f}(x,\boldsymbol{y}) = \begin{pmatrix} f(x,y,z) \\ g(x,y,z) \end{pmatrix}\),我们把向量形式的RK公式拆成分量形式,就得到:

步长推进公式

\[\begin{cases} y_{n+1} = y_n + \frac{h}{6}\left(K_1 + 2K_2 + 2K_3 + K_4\right) \\ z_{n+1} = z_n + \frac{h}{6}\left(L_1 + 2L_2 + 2L_3 + L_4\right) \end{cases} \]

斜率项计算公式

\[\begin{cases} K_1 = f(x_n, y_n, z_n), & L_1 = g(x_n, y_n, z_n) \\ K_2 = f\left(x_n + \frac{h}{2}, y_n + \frac{h}{2}K_1, z_n + \frac{h}{2}L_1\right), & L_2 = g\left(x_n + \frac{h}{2}, y_n + \frac{h}{2}K_1, z_n + \frac{h}{2}L_1\right) \\ K_3 = f\left(x_n + \frac{h}{2}, y_n + \frac{h}{2}K_2, z_n + \frac{h}{2}L_2\right), & L_3 = g\left(x_n + \frac{h}{2}, y_n + \frac{h}{2}K_2, z_n + \frac{h}{2}L_2\right) \\ K_4 = f\left(x_n + h, y_n + hK_3, z_n + hL_3\right), & L_4 = g\left(x_n + h, y_n + hK_3, z_n + hL_3\right) \end{cases} \]

计算流程

这是一个严格顺序计算的单步法:

  1. \(x_n\)处的\(y_n, z_n\),计算\(K_1, L_1\)
  2. \(K_1, L_1\)计算\(K_2, L_2\)
  3. \(K_2, L_2\)计算\(K_3, L_3\)
  4. \(K_3, L_3\)计算\(K_4, L_4\)
  5. 代入推进公式,得到\(x_{n+1}\)处的\(y_{n+1}, z_{n+1}\)

整个过程只需要前一个节点的数值,不需要更早的节点,因此是自启动的,这是单步法对比多步法的核心优势。

三、方法的核心特点与适用场景

  1. 形式通用性:无论是单个方程、二元方程组还是\(N\)维方程组,公式的向量形式完全一致,编程实现时可以统一处理,只需要修改向量的维度和右端函数的定义。
  2. 精度可控:经典四阶RK方法的整体精度为\(O(h^4)\),在工程计算、科学仿真中是精度与计算量平衡最优的方法之一。
  3. 单步自启动:仅需要上一个节点的数值即可推进计算,适合变步长计算,也方便处理间断、非线性等复杂问题。
  4. 数值稳定性:经典四阶RK方法具有较好的绝对稳定性,对于非刚性方程组,步长选择合理的情况下可以获得稳定的数值解。
  5. 适用范围:可直接推广到高阶常微分方程的初值问题——任何高阶ODE都可以通过引入辅助变量,转化为一阶方程组,再用本方法求解。

四、知识点归纳总结表

分类 核心内容 详细说明
问题形式 一阶方程组初值问题的标量形式 \(y_i'(x) = f_i(x,y_1,\dots,y_N),\ y_i(x_0)=y_i^0,\ i=1,2,\dots,N\)
一阶方程组初值问题的向量形式 \(\boldsymbol{y}'(x)=\boldsymbol{f}(x,\boldsymbol{y}(x)),\ \boldsymbol{y}(x_0)=\boldsymbol{y}_0\),与标量ODE形式完全一致
核心思想 标量→向量的推广逻辑 标量RK公式的所有运算在向量意义下良定义,保持公式形式不变,仅将标量替换为向量
RK方法的本质 用区间内多个点的斜率加权平均,替代泰勒展开的高阶导数,实现高精度单步求解
N维方程组四阶RK公式 步长推进公式 \(\boldsymbol{y}_{n+1} = \boldsymbol{y}_n + \frac{h}{6}\left(\boldsymbol{k}_1 + 2\boldsymbol{k}_2 + 2\boldsymbol{k}_3 + \boldsymbol{k}_4\right)\)
斜率向量计算公式 \(\boldsymbol{k}_1 = \boldsymbol{f}(x_n, \boldsymbol{y}_n)\)
\(\boldsymbol{k}_2 = \boldsymbol{f}\left(x_n + \frac{h}{2}, \boldsymbol{y}_n + \frac{h}{2}\boldsymbol{k}_1\right)\)
\(\boldsymbol{k}_3 = \boldsymbol{f}\left(x_n + \frac{h}{2}, \boldsymbol{y}_n + \frac{h}{2}\boldsymbol{k}_2\right)\)
\(\boldsymbol{k}_4 = \boldsymbol{f}\left(x_n + h, \boldsymbol{y}_n + h\boldsymbol{k}_3\right)\)
二元方程组特例(N=2) 步长推进公式 \(y_{n+1} = y_n + \frac{h}{6}(K_1+2K_2+2K_3+K_4)\)
\(z_{n+1} = z_n + \frac{h}{6}(L_1+2L_2+2L_3+L_4)\)
斜率项计算公式 \(K_1=f(x_n,y_n,z_n),\ L_1=g(x_n,y_n,z_n)\)
\(K_2=f(x_n+h/2,y_n+hK_1/2,z_n+hL_1/2),\ L_2=g(x_n+h/2,y_n+hK_1/2,z_n+hL_1/2)\)
\(K_3=f(x_n+h/2,y_n+hK_2/2,z_n+hL_2/2),\ L_3=g(x_n+h/2,y_n+hK_2/2,z_n+hL_2/2)\)
\(K_4=f(x_n+h,y_n+hK_3,z_n+hL_3),\ L_4=g(x_n+h,y_n+hK_3,z_n+hL_3)\)
精度与误差 局部截断误差 每个分量的局部截断误差为\(O(h^5)\)
整体截断误差 每个分量的整体截断误差为\(O(h^4)\)
方法特点 计算特性 单步法、自启动、顺序计算,适合变步长求解
适用场景 非刚性一阶方程组、高阶ODE转化的一阶方程组,工程与科学计算的通用求解方法

化高阶方程为一阶方程组 详细讲解、推导与证明

各位同学,我们上一讲系统学习了一阶常微分方程组的四阶龙格-库塔求解方法,而工程与科学计算中,我们遇到的更多是高阶常微分方程(组)的初值问题。今天这一讲,我们就彻底解决这个核心问题:如何将高阶方程等价转化为一阶方程组,从而直接应用已掌握的数值解法。我们会从一般理论、等价性证明、特例推导、应用拓展四个维度,把这个知识点讲透。


一、核心思想与理论基础

1.1 高阶ODE初值问题的标准形式

我们考察m阶显式常微分方程的初值问题,其标准形式为:

\[\begin{cases} y^{(m)}(x) = f\left(x, y(x), y'(x), \dots, y^{(m-1)}(x)\right) \tag{1} \\ y(x_0) = y_0,\ y'(x_0) = y_0',\ \dots,\ y^{(m-1)}(x_0) = y_0^{(m-1)} \tag{2} \end{cases} \]

这里有两个不可缺少的前提:

  1. 显式要求:最高阶导数\(y^{(m)}\)已被单独解出,等于关于自变量\(x\)和所有低于m阶导数的函数\(f\),这是转化的基础;
  2. 初值完备性:m阶方程需要m个独立初始条件才能保证解的存在唯一性,这里恰好给出了0阶到m-1阶导数在初始点\(x_0\)的取值,满足解的唯一性要求。

1.2 变量替换的核心规则

我们的目标是把m阶方程转化为m个一阶方程组成的方程组,核心设计思路是:引入m个新的未知函数,分别对应原函数\(y\)的0阶到m-1阶导数,即:

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

这个替换不是随意的,有两个严谨的设计逻辑:

  1. 导数递推性:前m-1个新变量的导数,恰好是下一个新变量。例如\(y_1' = y' = y_2\)\(y_2' = y'' = y_3\),……,\(y_{m-1}' = y^{(m-1)} = y_m\),直接得到m-1个一阶方程;
  2. 最高阶导数的替换:最后一个新变量\(y_m\)的导数,就是原方程的最高阶导数\(y^{(m)}\)。根据原方程,\(y^{(m)} = f(x, y, y', \dots, y^{(m-1)})\),将所有导数替换为对应的新变量,即可得到第m个一阶方程。

1.3 转化后的一阶方程组与初值条件

通过上述替换,原m阶方程转化为如下一阶方程组:

\[\begin{cases} y_1' = y_2 \\ y_2' = y_3 \\ \quad \vdots \\ y_{m-1}' = y_m \\ y_m' = f(x, y_1, y_2, \dots, y_m) \end{cases} \tag{3} \]

对应的初始条件也直接转化为新变量在\(x_0\)处的取值:

\[y_1(x_0) = y_0,\quad y_2(x_0) = y_0',\quad \dots,\quad y_m(x_0) = y_0^{(m-1)} \tag{4} \]

至此,我们得到了和上一讲完全一致的一阶方程组初值问题标准形式,可以直接套用四阶龙格-库塔方法求解。


二、严谨证明:两个初值问题的等价性

教材中提到“不难证明初值问题是彼此等价的”,这里我们给出双向严格证明——这是数值求解的理论基础:只有等价,求解转化后的方程组得到的才是原高阶方程的解。

定理:原m阶ODE初值问题(记为问题A),与转化后的一阶方程组初值问题(记为问题B)完全等价,即:问题A的解一定是问题B的解,问题B的解也一定是问题A的解。

证明1:问题A的解是问题B的解

\(y(x)\)是问题A的解,即满足:

  1. \(y^{(m)}(x) = f(x, y, y', \dots, y^{(m-1)})\)
  2. \(y(x_0)=y_0, y'(x_0)=y_0', \dots, y^{(m-1)}(x_0)=y_0^{(m-1)}\)

按替换规则构造函数组:\(y_1(x)=y(x), y_2(x)=y'(x), \dots, y_m(x)=y^{(m-1)}(x)\)

  • 对前m-1个函数,显然有\(y_i'(x) = (y^{(i-1)}(x))' = y^{(i)}(x) = y_{i+1}(x)\)\(i=1,2,\dots,m-1\)),满足前m-1个一阶方程;
  • 对第m个函数,\(y_m'(x) = (y^{(m-1)}(x))' = y^{(m)}(x) = f(x, y, y', \dots, y^{(m-1)}) = f(x, y_1, y_2, \dots, y_m)\),满足第m个一阶方程;
  • 初始条件:\(y_i(x_0) = y^{(i-1)}(x_0) = y_0^{(i-1)}\)\(i=1,2,\dots,m\)),完全满足问题B的初始条件。

因此,构造的函数组\(\{y_1(x), y_2(x), \dots, y_m(x)\}\)是问题B的解,第一部分得证。

证明2:问题B的解是问题A的解

设函数组\(\{y_1(x), y_2(x), \dots, y_m(x)\}\)是问题B的解,即满足:

  1. \(y_1'=y_2, y_2'=y_3, \dots, y_{m-1}'=y_m, y_m'=f(x,y_1,\dots,y_m)\)
  2. \(y_1(x_0)=y_0, y_2(x_0)=y_0', \dots, y_m(x_0)=y_0^{(m-1)}\)

\(y(x) = y_1(x)\),证明\(y(x)\)是问题A的解:

  • 由递推关系依次求导可得:
    \(y'(x) = y_1'(x) = y_2(x)\)
    \(y''(x) = y_2'(x) = y_3(x)\)
    ……
    \(y^{(m-1)}(x) = y_{m-1}'(x) = y_m(x)\)
    \(y^{(m)}(x) = y_m'(x)\)
  • 代入第m个方程,得\(y^{(m)}(x) = f(x, y_1, y_2, \dots, y_m) = f(x, y(x), y'(x), \dots, y^{(m-1)}(x))\),满足原m阶方程;
  • 初始条件验证:
    \(y(x_0) = y_1(x_0) = y_0\)
    \(y'(x_0) = y_2(x_0) = y_0'\)
    ……
    \(y^{(m-1)}(x_0) = y_m(x_0) = y_0^{(m-1)}\)
    完全满足问题A的初始条件。

因此,\(y(x)=y_1(x)\)是问题A的解,第二部分得证。

综上,两个初值问题完全等价,转化过程是严谨、无理论误差的。


三、核心特例:二阶ODE的转化与四阶RK方法的应用

二阶常微分方程是工程中最常见的高阶方程(如牛顿第二定律、振动方程、电路微分方程等),我们单独展开详细推导,这也是教材的核心内容。

3.1 二阶ODE初值问题的转化

二阶显式ODE初值问题的标准形式为:

\[\begin{cases} y''(x) = f(x, y(x), y'(x)) \\ y(x_0) = y_0,\quad y'(x_0) = y_0' \end{cases} \]

按照替换规则,引入2个新变量(为和教材符号一致,令\(z(x)=y'(x)\)):

\[y_1 = y(x),\quad y_2 = z(x) = y'(x) \]

转化后的一阶方程组初值问题为:

\[\begin{cases} y' = z \\ z' = f(x, y, z) \\ y(x_0) = y_0,\quad z(x_0) = y_0' \end{cases} \]

这正是上一讲中讲到的二元一阶方程组,可直接套用二元形式的四阶龙格-库塔公式。

3.2 代入四阶RK公式的详细推导

上一讲中,二元方程组的四阶RK公式为:

\[\begin{cases} y_{n+1} = y_n + \frac{h}{6}\left(K_1 + 2K_2 + 2K_3 + K_4\right) \\ z_{n+1} = z_n + \frac{h}{6}\left(L_1 + 2L_2 + 2L_3 + L_4\right) \end{cases} \]

其中斜率项的通用计算公式为:

\[\begin{cases} K_1 = f_1(x_n, y_n, z_n), & L_1 = f_2(x_n, y_n, z_n) \\ K_2 = f_1\left(x_n + \frac{h}{2}, y_n + \frac{h}{2}K_1, z_n + \frac{h}{2}L_1\right), & L_2 = f_2\left(x_n + \frac{h}{2}, y_n + \frac{h}{2}K_1, z_n + \frac{h}{2}L_1\right) \\ K_3 = f_1\left(x_n + \frac{h}{2}, y_n + \frac{h}{2}K_2, z_n + \frac{h}{2}L_2\right), & L_3 = f_2\left(x_n + \frac{h}{2}, y_n + \frac{h}{2}K_2, z_n + \frac{h}{2}L_2\right) \\ K_4 = f_1\left(x_n + h, y_n + hK_3, z_n + hL_3\right), & L_4 = f_2\left(x_n + h, y_n + hK_3, z_n + hL_3\right) \end{cases} \]

对于转化后的二阶方程,第一个方程的右端项\(f_1(x,y,z) = z\),第二个方程的右端项\(f_2(x,y,z) = f(x,y,z)\),代入后可大幅简化公式。

步骤1:推导\(K_1\sim K_4\)的简化形式

  • \(K_1 = f_1(x_n, y_n, z_n) = z_n\)
  • \(K_2 = f_1\left(x_n + \frac{h}{2}, y_n + \frac{h}{2}K_1, z_n + \frac{h}{2}L_1\right) = z_n + \frac{h}{2}L_1\)
  • \(K_3 = f_1\left(x_n + \frac{h}{2}, y_n + \frac{h}{2}K_2, z_n + \frac{h}{2}L_2\right) = z_n + \frac{h}{2}L_2\)
  • \(K_4 = f_1\left(x_n + h, y_n + hK_3, z_n + hL_3\right) = z_n + hL_3\)

步骤2:消去K项,推导\(y_{n+1}\)的简化公式

\(K_1\sim K_4\)代入\(y_{n+1}\)的推进公式:

\[\begin{align*} y_{n+1} &= y_n + \frac{h}{6}\left(K_1 + 2K_2 + 2K_3 + K_4\right) \\ &= y_n + \frac{h}{6}\left[ z_n + 2\left(z_n + \frac{h}{2}L_1\right) + 2\left(z_n + \frac{h}{2}L_2\right) + \left(z_n + hL_3\right) \right] \\ &= y_n + \frac{h}{6}\left[ 6z_n + h(L_1 + L_2 + L_3) \right] \\ &= y_n + h z_n + \frac{h^2}{6}\left(L_1 + L_2 + L_3\right) \end{align*} \]

\(z_{n+1}\)的公式保持不变,仍为:

\[z_{n+1} = z_n + \frac{h}{6}\left(L_1 + 2L_2 + 2L_3 + L_4\right) \]

步骤3:推导\(L_1\sim L_4\)的简化形式

\(K_1\sim K_4\)代入\(L_1\sim L_4\)的公式,得到仅含\(y_n, z_n\)\(L\)项的表达式:

  • \(L_1 = f(x_n, y_n, z_n)\)
  • \(L_2 = f\left(x_n + \frac{h}{2}, y_n + \frac{h}{2}z_n, z_n + \frac{h}{2}L_1\right)\)
  • \(L_3 = f\left(x_n + \frac{h}{2}, y_n + \frac{h}{2}z_n + \frac{h^2}{4}L_1, z_n + \frac{h}{2}L_2\right)\)
  • \(L_4 = f\left(x_n + h, y_n + h z_n + \frac{h^2}{2}L_2, z_n + hL_3\right)\)

这个简化后的公式,专门针对二阶ODE,减少了一半的斜率计算量,在工程计算中极具实用性。

3.3 二阶ODE的RK求解流程

  1. 给定初始条件\(y(x_0)=y_0, y'(x_0)=y_0'\),令\(z_0 = y_0'\),确定步长\(h\)和求解区间;
  2. 对每个节点\(x_n\)
    1. 计算\(L_1 = f(x_n, y_n, z_n)\)
    2. 计算\(L_2 = f\left(x_n + \frac{h}{2}, y_n + \frac{h}{2}z_n, z_n + \frac{h}{2}L_1\right)\)
    3. 计算\(L_3 = f\left(x_n + \frac{h}{2}, y_n + \frac{h}{2}z_n + \frac{h^2}{4}L_1, z_n + \frac{h}{2}L_2\right)\)
    4. 计算\(L_4 = f\left(x_n + h, y_n + h z_n + \frac{h^2}{2}L_2, z_n + hL_3\right)\)
    5. 计算\(y_{n+1} = y_n + h z_n + \frac{h^2}{6}(L_1 + L_2 + L_3)\)
    6. 计算\(z_{n+1} = z_n + \frac{h}{6}(L_1 + 2L_2 + 2L_3 + L_4)\)
  3. 重复步骤2,直到求解到目标区间终点。

四、拓展:高阶方程组的转化

教材中提到“高阶微分方程组的初值问题,原则上总可以归结为一阶方程组来求解”,这里补充通用转化规则:

对于由\(k\)个ODE组成的方程组,若第\(i\)个方程的阶数为\(m_i\),总阶数为\(M = m_1 + m_2 + \dots + m_k\),只需引入\(M\)个新变量,分别对应每个未知函数的0阶到\(m_i-1\)阶导数,即可转化为\(M\)个一阶方程组成的方程组。

示例:两个二阶方程组成的方程组
原初值问题:

\[\begin{cases} y'' = f(x, y, y', z, z') \\ z'' = g(x, y, y', z, z') \\ y(x_0)=y_0,\ y'(x_0)=y_0' \\ z(x_0)=z_0,\ z'(x_0)=z_0' \end{cases} \]

总阶数为\(2+2=4\),引入4个新变量:\(y_1=y, y_2=y', y_3=z, y_4=z'\),转化后的一阶方程组为:

\[\begin{cases} y_1' = y_2 \\ y_2' = f(x, y_1, y_2, y_3, y_4) \\ y_3' = y_4 \\ y_4' = g(x, y_1, y_2, y_3, y_4) \end{cases} \]

初始条件为:\(y_1(x_0)=y_0,\ y_2(x_0)=y_0',\ y_3(x_0)=z_0,\ y_4(x_0)=z_0'\)


五、知识点归纳总结表

分类 核心内容 详细说明
核心目标 高阶ODE的数值求解 所有高阶ODE(组)的初值问题,均可等价转化为一阶方程组,直接套用一阶方程组的数值解法(如龙格-库塔)
转化前提 显式高阶ODE 最高阶导数可单独解出,形式为\(y^{(m)}=f(x,y,y',\dots,y^{(m-1)})\),且初始条件完备(m阶方程对应m个初始条件)
通用替换规则 m阶方程→m维一阶方程组 引入新变量:\(y_1=y,\ y_2=y',\ \dots,\ y_m=y^{(m-1)}\)
转化后方程组:\(y_1'=y_2,\ y_2'=y_3,\ \dots,\ y_{m-1}'=y_m,\ y_m'=f(x,y_1,\dots,y_m)\)
初值条件转化 一一对应映射 \(y_1(x_0)=y_0,\ y_2(x_0)=y_0',\ \dots,\ y_m(x_0)=y_0^{(m-1)}\),与原初始条件完全等价
等价性结论 双向等价 原高阶问题的解,与转化后一阶方程组的解完全一致,转化过程无理论误差
二阶ODE特例 转化后的RK简化公式 推进公式:
\(y_{n+1} = y_n + h z_n + \frac{h^2}{6}(L_1+L_2+L_3)\)
\(z_{n+1} = z_n + \frac{h}{6}(L_1+2L_2+2L_3+L_4)\)
其中\(z=y'\)\(L_1\sim L_4\)为对应斜率项
高阶方程组转化 总阶数=一阶方程组维数 k个方程组成的高阶方程组,总阶数为\(M=\sum m_i\),转化为M维一阶方程组
核心优势 解法通用性 转化后可统一使用一阶方程组的所有成熟数值解法,无需为高阶方程单独推导公式

补充注意事项

  1. 对于隐式高阶ODE,需先将最高阶导数解出,转化为显式形式后再进行替换;
  2. 转化后一阶方程组的维数等于原问题的总阶数,总阶数越高,计算量越大;
  3. 若原高阶方程为刚性方程,转化后的一阶方程组也为刚性方程组,需使用专门的刚性求解方法,不可直接使用显式龙格-库塔方法。


最后补充一点:教材的标题提到了「刚性方程组」,这里做一个简单铺垫:当方程组的解包含变化速度差异极大的多个分量时,就是刚性方程组。经典四阶RK方法的绝对稳定性区间有限,求解刚性方程组时需要极小的步长,计算量极大,此时需要专门的刚性求解方法(如向后差分法、隐式RK方法等)。而今天讲解的显式四阶RK方法,是求解非刚性一阶方程组最基础、最常用的方法,是整个常微分方程数值解法的核心基础。

刚性方程组(Stiff Equations) 系统讲解、理论推导与数值求解

各位同学,我们前两讲系统学习了一阶方程组的四阶龙格-库塔解法,以及高阶方程向一阶方程组的等价转化。今天我们要解决数值求解常微分方程组中最具挑战性的一类问题——刚性方程组(Stiff Equations,也译作病态方程组)。这类问题在化学反应动力学、电路仿真、自动控制、流体力学等工程与科学领域无处不在,也是常规数值方法失效的核心场景。我们将从问题本质、示例解析、严格定义、数值困难、适用解法五个维度,把这个知识点讲深讲透。


一、刚性问题的核心本质:变化尺度的极端矛盾

我们先从最直观的物理本质切入:
刚性问题的核心,是微分方程组的解中,同时包含变化速度差异极大的多个分量——快速衰减的快变分量,和缓慢变化的慢变分量,二者的时间尺度相差多个数量级,给数值求解带来了不可调和的矛盾。

这里先明确两个核心概念:

  1. 时间常数:对于指数衰减项\(e^{\lambda x}\)(其中\(\lambda\)为特征值,且\(\text{Re}(\lambda)<0\),保证解衰减),定义时间常数\(\tau = -\frac{1}{\text{Re}(\lambda)}\)\(\tau\)越小,分量衰减越快;\(\tau\)越大,分量变化越慢。
  2. 稳态解:当\(x\to+\infty\)时,快变分量完全衰减,解收敛到的极限值,称为稳态解。我们数值求解的核心目标,往往是得到解收敛到稳态的全过程,尤其是慢变分量的演化规律。

常规显式数值方法(如我们之前讲的四阶龙格-库塔)的步长,必须被最快的快变分量约束,以保证数值稳定性;但我们需要计算的区间长度,由最慢的慢变分量决定。这就导致了“极小步长+超长计算区间”的矛盾,计算量呈指数级增长,甚至完全无法完成计算——这就是刚性问题的核心困境。


二、刚性问题示例:教材案例的深度解析

我们以教材中给出的线性方程组(9.59)为例,做完整的推导与分析,彻底理解刚性的表现。

2.1 问题给出

给定一阶线性常系数方程组初值问题:

\[\begin{cases} u'(x) = -1000.25 u(x) + 999.75 v(x) + 0.5 \\ v'(x) = 999.75 u(x) - 1000.25 v(x) + 0.5 \\ u(0) = 1,\quad v(0) = -1 \end{cases} \]

2.2 系数矩阵与特征值计算

方程组的齐次部分系数矩阵为:

\[\boldsymbol{A} = \begin{pmatrix} -1000.25 & 999.75 \\ 999.75 & -1000.25 \end{pmatrix} \]

我们求解矩阵\(\boldsymbol{A}\)的特征值,特征方程为\(|\lambda \boldsymbol{I} - \boldsymbol{A}|=0\)

\[\begin{vmatrix} \lambda + 1000.25 & -999.75 \\ -999.75 & \lambda + 1000.25 \end{vmatrix} = 0 \]

展开行列式,由平方差公式化简得:

\[(\lambda + 0.5)(\lambda + 2000) = 0 \]

因此得到两个特征值:

\[\lambda_1 = -0.5,\quad \lambda_2 = -2000 \]

2.3 解析解与分量分析

通过解析方法求解,得到方程组的准确解为:

\[\begin{cases} u(x) = -e^{-0.5x} + e^{-2000x} + 1 \\ v(x) = -e^{-0.5x} - e^{-2000x} + 1 \end{cases} \]

我们对解的两个分量做拆解分析:

  1. 快变分量\(e^{-2000x}\),对应特征值\(\lambda_2=-2000\),时间常数\(\tau_2 = -\frac{1}{\lambda_2} = 0.0005\)
    \(x=0.005\)(即\(10\tau_2\))时,\(e^{-2000\times0.005}=e^{-10}\approx4.5\times10^{-5}\),已经几乎衰减为0,对解无影响。
  2. 慢变分量\(e^{-0.5x}\),对应特征值\(\lambda_1=-0.5\),时间常数\(\tau_1 = -\frac{1}{\lambda_1} = 2\)
    \(x=20\)(即\(10\tau_1\))时,\(e^{-0.5\times20}=e^{-10}\approx4.5\times10^{-5}\),才衰减到可忽略,解收敛到稳态解\(u(x)\to1, v(x)\to1\)

2.4 刚性矛盾的量化分析

我们用经典四阶龙格-库塔方法求解这个问题,会遇到核心矛盾:

  • 四阶显式龙格-库塔方法的绝对稳定区间为:对于线性模型方程\(y'=\lambda y\),步长\(h\)必须满足\(|h\lambda| < 2.78\),才能保证数值解稳定。
  • 最严格的约束来自绝对值最大的特征值\(\lambda_2=-2000\),因此步长必须满足:

    \[h < \frac{2.78}{|\lambda_2|} = 0.00139 \]

  • 而我们需要计算到\(x=20\)才能让解收敛到稳态,因此需要的计算步数超过14000步。

这里的本质问题是:快变分量在x=0.005之后就完全消失,却在整个计算区间内严格限制了步长的最大值,我们用极小步长做了上万步无效计算,只为满足早已不存在的稳定性约束——这就是刚性问题最典型的数值困境。

2.5 刚性比计算

我们定义刚性比量化刚性的严重程度,对于这个例子:

\[s = \frac{\max|\text{Re}(\lambda_j)|}{\min|\text{Re}(\lambda_j)|} = \frac{2000}{0.5} = 4000 \]

通常\(s\geq10\)即可判定为刚性方程组,\(s=4000\)属于强刚性问题,常规显式方法完全不适用。


三、刚性方程组的严格数学定义

3.1 线性常系数刚性方程组的定义

线性常系数一阶方程组的标准形式为:

\[\begin{cases} \frac{d\boldsymbol{y}(x)}{dx} = \boldsymbol{A}\boldsymbol{y}(x) + \boldsymbol{g}(x) \\ \boldsymbol{y}(0) = \boldsymbol{y}_0 \end{cases} \]

其中\(\boldsymbol{y}(x)\in\mathbb{R}^N\)\(\boldsymbol{A}\in\mathbb{R}^{N\times N}\)为系数矩阵,\(\boldsymbol{g}(x)\)为非齐次项。

通解结构

该方程组的通解由齐次通解和非齐次特解组成:

\[\boldsymbol{y}(x) = \sum_{j=1}^N c_j e^{\lambda_j x} \boldsymbol{\phi}_j + \boldsymbol{\psi}(x) \]

其中\(\lambda_j = \alpha_j + i\beta_j\)为矩阵\(\boldsymbol{A}\)的特征值,\(\boldsymbol{\phi}_j\)为对应特征向量,\(c_j\)为由初始条件确定的常数,\(\boldsymbol{\psi}(x)\)为非齐次特解(稳态解)。

刚性定义(定义9.13)

若线性微分方程组满足以下两个条件:

  1. 系数矩阵\(\boldsymbol{A}\)的所有特征值的实部均小于0,即\(\text{Re}(\lambda_j) < 0\ (j=1,2,\dots,N)\)(保证解衰减收敛到稳态);
  2. 特征值实部的绝对值的最大值与最小值之比远大于1,即:

    \[s = \frac{\max_{1\leq j\leq N} |\text{Re}(\lambda_j)|}{\min_{1\leq j\leq N} |\text{Re}(\lambda_j)|} \gg 1 \]

则称该方程组为刚性方程组\(s\)称为刚性比

  • 工程判定标准:通常\(s\geq10\)即可判定为刚性问题;
  • 刚性比\(s\)越大,刚性越严重,数值求解难度越高。

3.2 非线性刚性方程组的定义

对于一般的非线性一阶方程组:

\[\boldsymbol{y}'(x) = \boldsymbol{f}(x, \boldsymbol{y}(x)),\quad \boldsymbol{y}(x_0)=\boldsymbol{y}_0 \]

我们通过局部线性化,将线性刚性的定义推广到非线性情形。

局部线性化与雅可比矩阵

将右端向量值函数\(\boldsymbol{f}(x,\boldsymbol{y})\)在点\((x, \boldsymbol{y}(x))\)处做泰勒展开,保留一阶项,得到局部线性化方程,其中核心是雅可比矩阵

\[\boldsymbol{J}(x) = \frac{\partial \boldsymbol{f}}{\partial \boldsymbol{y}} \in \mathbb{R}^{N\times N},\quad J_{ij}(x) = \frac{\partial f_i}{\partial y_j} \]

非线性刚性定义

若在求解区间内,雅可比矩阵\(\boldsymbol{J}(x)\)满足以下两个条件:

  1. 所有特征值\(\lambda_j(x)\)的实部均小于0,即\(\text{Re}(\lambda_j(x)) < 0\ (j=1,2,\dots,N)\)
  2. 局部刚性比远大于1:

    \[s(x) = \frac{\max_{1\leq j\leq N} |\text{Re}(\lambda_j(x))|}{\min_{1\leq j\leq N} |\text{Re}(\lambda_j(x))|} \gg 1 \]

则称该非线性方程组为刚性方程组\(s(x)\)称为局部刚性比

注:非线性方程组的刚性是局部性质,在求解区间的不同位置,刚性比可能不同。


四、刚性方程组数值求解的核心理论壁垒

为什么常规显式方法不适合求解刚性问题?这里介绍数值分析领域的核心定理——Dahlquist 壁垒定理,它彻底解释了显式方法的局限性。

4.1 A-稳定性的概念

若一个数值方法的绝对稳定区间包含整个左半复平面(即对于所有\(\text{Re}(\lambda)<0\)的模型方程,无论步长\(h\)取多大,数值解都稳定),则称该方法是A-稳定的。

A-稳定的方法,步长完全不受稳定性约束,只需要满足精度要求,完美解决了刚性问题的核心矛盾。

4.2 Dahlquist 壁垒定理

  1. 所有显式数值方法(包括显式龙格-库塔、显式线性多步法),都不是A-稳定的
    这意味着显式方法的绝对稳定区间一定是有限的,步长必然被快变分量约束,无法解决刚性问题。
  2. 隐式线性多步法中,A-稳定的方法最高阶数为2,且梯形法的误差常数最小,是二阶A-稳定方法中的最优选择。
    这意味着,想要用线性多步法获得高于二阶的精度,就必须放弃A-稳定性,无法用大步长求解刚性问题。

这个定理直接决定了:我们之前学的所有显式方法,都无法有效求解刚性方程组;想要高精度求解刚性问题,必须使用专门的刚性求解方法。


五、刚性方程组的适用数值解法

根据教材内容和工程实践,我们总结三类最常用的刚性方程组求解方法:

5.1 基础A-稳定隐式方法

这类方法是刚性求解的基础,适合简单刚性问题,核心是A-稳定,步长不受稳定性限制。

  1. 向后欧拉法(隐式欧拉法)
    公式:\(\boldsymbol{y}_{n+1} = \boldsymbol{y}_n + h \boldsymbol{f}(x_{n+1}, \boldsymbol{y}_{n+1})\)
    特点:一阶精度,A-稳定,无条件稳定,每一步需要求解非线性方程组。
  2. 梯形法
    公式:\(\boldsymbol{y}_{n+1} = \boldsymbol{y}_n + \frac{h}{2}\left[ \boldsymbol{f}(x_n, \boldsymbol{y}_n) + \boldsymbol{f}(x_{n+1}, \boldsymbol{y}_{n+1}) \right]\)
    特点:二阶精度,A-稳定,误差常数最小,是低阶刚性求解的最优选择。

5.2 吉尔(Gear)方法

吉尔方法也称为向后差分公式(BDF, Backward Differentiation Formulas),是专门为刚性问题设计的高阶线性多步法,也是目前刚性求解最主流的方法之一。

  • 核心特点:放弃全平面的A-稳定性,采用更宽松的刚性稳定条件,在保证对刚性问题稳定的前提下,实现了1~6阶的高阶精度;
  • 工程应用:MATLAB的刚性求解器ode15s,核心就是变阶数的BDF方法,是求解刚性问题的首选工具。

5.3 隐式龙格-库塔法(IRK)

隐式龙格-库塔法是单步隐式方法,完美解决了多步法的自启动问题,同时实现了高阶精度与A-稳定性。

  • 核心特点:单步、自启动、高阶精度、A-稳定,适合高精度刚性问题求解;
  • 常用类型:对角隐式龙格-库塔法(DIRK)、SDIRK方法,在保持A-稳定的同时,降低了非线性方程组的求解难度,工程应用广泛。

六、知识点归纳总结表

分类 核心内容 详细说明
刚性问题本质 变化尺度的极端矛盾 解中同时包含快变分量和慢变分量,二者时间常数相差多个数量级,导致数值求解的步长约束与计算区间约束的矛盾
核心概念 时间常数 对于衰减分量\(e^{\lambda x}\)\(\text{Re}(\lambda)<0\)),时间常数\(\tau = -\frac{1}{\text{Re}(\lambda)}\)\(\tau\)越小,分量衰减越快
稳态解 \(x\to+\infty\)时,快变分量完全衰减,解收敛到的极限值,是数值求解的核心目标
刚性比 线性系统:$s = \frac{\max
刚性判定标准 线性系统 1. 所有特征值实部\(\text{Re}(\lambda_j)<0\);2. 刚性比\(s\gg1\),工程上\(s\geq10\)即判定为刚性
非线性系统 1. 雅可比矩阵所有特征值实部\(\text{Re}(\lambda_j(x))<0\);2. 局部刚性比\(s(x)\gg1\)
数值求解核心困难 显式方法的局限性 1. 步长被快变分量的稳定性约束,必须取极小值;2. 计算区间由慢变分量决定,长度极大,导致步数爆炸、计算量剧增
核心理论壁垒 Dahlquist 壁垒定理 1. 所有显式方法都不是A-稳定的;2. A-稳定的隐式线性多步法最高阶数为2,梯形法为最优
适用求解方法 基础隐式方法 向后欧拉法(一阶,A-稳定)、梯形法(二阶,A-稳定),适合简单刚性问题
吉尔方法(BDF) 1~6阶刚性稳定线性多步法,工程最主流的刚性求解方法,MATLAB ode15s的核心算法
隐式龙格-库塔法(IRK) 单步、自启动、高阶、A-稳定,适合高精度刚性问题求解
工程应用场景 常见领域 化学反应动力学、电路仿真、自动控制系统、流体力学、生物动力学等包含多时间尺度过程的领域

补充说明

在实际工程计算中,我们不需要手动实现这些复杂的刚性求解算法,成熟的数学软件都提供了专门的刚性求解器:

  • MATLAB:ode15s(变阶BDF,首选)、ode23s(低阶Rosenbrock方法)等;
  • Python:scipy.integrate.solve_ivp中的method='BDF'method='Radau'
  • Fortran/C++:LSODE、CVODE等成熟的刚性求解库。

我们需要做的,是识别出刚性问题,选择合适的刚性求解器,而不是强行用显式方法求解,导致计算量爆炸甚至结果发散。

posted on 2026-03-08 00:00  Indian_Mysore  阅读(1)  评论(0)    收藏  举报

导航