MathLabs

应用与计算数学

微分方程的数值解法

当没有精确公式时,通过欧拉法、龙格库塔法等逐步方法来近似求解的技术。

直观一步一步地逼近一条曲线

物理、工程和金融中出现的大多数微分方程都没有用初等函数写出的封闭解。数值方法用一系列逐步计算出的近似值y0,y1,y2,…y_0, y_1, y_2, \ldots来代替精确曲线y(t)y(t),每一步只利用方程在该点给出的斜率f(t,y)f(t,y)。步长hh越小,折线就越贴近真实曲线——但更小的步长也意味着更多的计算量,因此每种方法都要在精度和成本之间取舍。

交互式图像展示了当步长缩小时割线收敛为切线的过程,说明了欧拉法背后的线性近似思想。
从割线收敛到t0t_0处的切线:欧拉法的一步正是沿着这个切线方向前进hh的距离,然后再重新计算斜率。

中学欧拉法

定义: 欧拉法(显式)

给定初值问题y′=f(t,y)y' = f(t, y),其中y(t0)=y0y(t_0) = y_0,选取步长hh并令tn=t0+nht_n = t_0 + nh。欧拉法用更新公式yn+1=yn+hf(tn,yn)y_{n+1} = y_n + h f(t_n, y_n)推进近似值,对n=0,1,2,…n=0,1,2,\ldots重复此过程。

y′=f(t,y),y(t0)=y0y' = f(t, y), \qquad y(t_0) = y_0

这里f(t,y)f(t,y)是给定的斜率函数,hh是固定步长,yny_n是经过nn步后对真值y(tn)y(t_n)的近似。每一步只是沿着f(t,y)f(t,y)在当前点给出的切线方向水平前进hh,然后在新点重新计算斜率——从几何上看,这就是一条逼近曲线的折线。

yn+1=yn+hf(tn,yn)y_{n+1} = y_n + h f(t_n, y_n)
y′=f(t,y)y'=f(t,y)的逐步解法比较
方法每步计算ff的次数整体误差阶数是否适合刚性方程
显式欧拉法1O(h)O(h)否(需要非常小的hh)
经典RK4法4O(h4)O(h^4)否(对刚性问题仍需较小的hh)
隐式欧拉法1次(还需解一个方程)O(h)O(h)是(对任意h>0h>0都是A-稳定的)

大学收敛性:各方法有多准确

设f(t,y)f(t,y)关于yy是利普希茨连续的,利普希茨常数为LL,且精确解在[t0,T][t_0, T]上满足∣y′′(t)∣≤M|y''(t) | \le M。那么步长为hh、共nn步之后的整体误差en=y(tn)−yne_n = y(t_n) - y_n满足∣en∣≤hM2L(eL(tn−t0)−1)|e_n| \le \frac{hM}{2L}\left(e^{L(t_n-t_0)}-1\right)。

为什么成立?

每一步欧拉法都会因把泰勒级数截断到一次项而产生大小为O(h2)O(h^2)的局部误差,而到达固定时刻TT大约需要(T−t0)/h(T-t_0)/h步,这些局部误差可能不断累积。该定理说明这种累积并不严重:利普希茨条件保证微小的局部误差不会以快于指数的速度被放大,因此整体误差只降为关于步长的一阶量O(h)O(h)——比局部误差低一阶,这是单步法的典型规律。

证明

把一步中产生的局部误差写成用泰勒展开推进的精确解与欧拉更新之差。泰勒定理给出对某个介于tnt_n与tn+1t_{n+1}之间的ξn\xi_n有y(tn+1)=y(tn)+hf(tn,y(tn))+h22y′′(ξn)y(t_{n+1}) = y(t_n) + h f(t_n, y(t_n)) + \frac{h^2}{2} y''(\xi_n)成立,于是局部截断误差为τn=h22y′′(ξn)\tau_n = \frac{h^2}{2} y''(\xi_n),由假设∣y′′(t)∣≤M|y''(t) | \le M可知它被h2M2\frac{h^2 M}{2}所界定。

从这个精确的泰勒展开中减去欧拉更新yn+1=yn+hf(tn,yn)y_{n+1} = y_n + h f(t_n, y_n)。记en=y(tn)−yne_n = y(t_n) - y_n,两边之差给出en+1=en+h[f(tn,y(tn))−f(tn,yn)]+τne_{n+1} = e_n + h\left[f(t_n, y(t_n)) - f(t_n, y_n)\right] + \tau_n。利普希茨条件把方括号中的项界定为L∣en∣L|e_n|,于是∣en+1∣≤(1+hL)∣en∣+h2M2|e_{n+1}| \le (1+hL)|e_n| + \frac{h^2 M}{2}。

由于e0=0e_0 = 0(初值是精确的),用归纳法展开这个递推式,利用等比数列求和公式得到∣en∣≤h2M2∑k=0n−1(1+hL)k=hM2L[(1+hL)n−1]|e_n| \le \frac{h^2M}{2}\sum_{k=0}^{n-1}(1+hL)^k = \frac{hM}{2L}\left[(1+hL)^n - 1\right]。最后,由于对任意实数xx都有1+x≤ex1+x\le e^x,所以(1+hL)n≤eLhn=eL(tn−t0)(1+hL)^n \le e^{Lhn} = e^{L(t_n-t_0)},这就把上界变成了∣en∣≤hM2L(eL(tn−t0)−1)|e_n| \le \frac{hM}{2L}\left(e^{L(t_n-t_0)}-1\right)——恰好是所要证明的不等式,并且当tnt_n固定时显然是O(h)O(h)。

经典四阶龙格库塔法由阶段k1=f(tn,yn)k_1 = f(t_n, y_n)、k2=f(tn+h2,yn+h2k1)k_2 = f\left(t_n+\frac{h}{2}, y_n+\frac{h}{2}k_1\right)、k3=f(tn+h2,yn+h2k2)k_3 = f\left(t_n+\frac{h}{2}, y_n+\frac{h}{2}k_2\right)、k4=f(tn+h,yn+hk3)k_4 = f(t_n+h, y_n+hk_3)及更新公式yn+1=yn+h6(k1+2k2+2k3+k4)y_{n+1} = y_n + \frac{h}{6}(k_1+2k_2+2k_3+k_4)定义,每步的局部截断误差为O(h5)O(h^5),在与之前相同的利普希茨假设下,经过nn步后的整体误差为O(h4)O(h^4)。

为什么成立?

RK4在精心选择的中间点上每步计算四次斜率,而不是一次,然后按权重1,2,2,11,2,2,1(分母为66)取加权平均。这多做的工作换来了比欧拉法高三阶的精度:展开式与真解的泰勒级数一直匹配到h4h^4项,而不是只到一次项为止。

证明

把每个阶段在(tn,yn)(t_n, y_n)附近做泰勒展开。由于k1=f(tn,yn)=y′(tn)k_1=f(t_n,y_n)=y'(t_n),而k2,k3k_2, k_3是在中点用沿前一阶段方向偏移半步的yny_n来计算ff的,把y′=fy'=f、y′′=ft+fyfy''=f_t+f_yf、y′′′=ftt+2ftyf+fyyf2+fy(ft+fyf)y'''=f_{tt}+2f_{ty}f+f_{yy}f^2+f_y(f_t+f_yf)的链式法则代入每个kik_i,就得到关于hh的四个多项式,它们与y′(tn),y′′(tn),y′′′(tn)y'(t_n), y''(t_n), y'''(t_n)在每个阶段能看到的阶数内一致。

构造加权组合16(k1+2k2+2k3+k4)\frac{1}{6}(k_1+2k_2+2k_3+k_4)并乘以hh,这个和中h1,h2,h3h^1, h^2, h^3与h4h^4的系数恰好就是泰勒展开y(tn+h)=y(tn)+hy′(tn)+h22y′′(tn)+h36y′′′(tn)+h424y(4)(tn)+⋯y(t_n+h) = y(t_n) + hy'(t_n) + \frac{h^2}{2}y''(t_n) + \frac{h^3}{6}y'''(t_n) + \frac{h^4}{24}y^{(4)}(t_n) + \cdots中直到h4h^4项的系数——这正是RK4表的系数c=(0,12,12,1)c=(0,\frac12,\frac12,1)和b=(16,13,13,16)b=(\frac16,\frac13,\frac13,\frac16)被选定要满足的经典阶条件。

由于两个级数在h4h^4之前都一致,它们可能不同的第一项是O(h5)O(h^5)项,因此每步的局部截断误差为O(h5)O(h^5)。与欧拉的情形一样,利用ff上的利普希茨条件,把这些局部误差在到达固定时刻所需的n≈(T−t0)/hn\approx (T-t_0)/h步上累积起来,恰好损失hh的一次幂,得到整体误差O(h4)O(h^4)。

进阶刚性方程与隐式方法

当一个微分方程混合了差异极大的时间尺度时,就称其为刚性方程:解的某些分量衰减极快,而另一些分量变化缓慢,这迫使显式方法为了保持数值稳定而不得不采用极小的步长,即便精度本身允许更大的步长。对于简单的测试方程y′=λyy'=\lambda y(其中λ<0\lambda<0),欧拉法只有在∣1+hλ∣≤1|1+h\lambda|\le 1成立时才稳定,即h≤2∣λ∣h \le \frac{2}{|\lambda|}成立时,因此一个绝对值很大的负λ\lambda(快速衰减模式)会迫使hh变得极小。

yn+1=yn+hf(tn+1,yn+1)y_{n+1} = y_n + h f(t_{n+1}, y_{n+1})

像后退(隐式)欧拉法yn+1=yn+hf(tn+1,yn+1)y_{n+1} = y_n + h f(t_{n+1}, y_{n+1})这样的隐式方法,每一步都需要求解一个关于yn+1y_{n+1}的方程(当ff非线性时通常用牛顿法),但作为回报,它们在这个测试方程上对任意步长都保持稳定——这种性质称为A-稳定性——这正是化学反应动力学、电路仿真和控制理论中出现的刚性系统所需要的。

大学实际应用与典型例题

微分方程数值积分器是仿真软件的计算支柱:它们仅利用支配方程和初始条件,把一个物理或金融系统的状态向前推进。电路仿真软件用它们预测电压和电流,天体力学软件用它们推演卫星轨道,化学工程师用刚性求解器建模快速反应网络,量化金融则用它们模拟利率和期权定价模型。

例题: 用欧拉法求RC电路的放电过程

RC电路中的电容器按dVdt=−V\frac{dV}{dt} = -V放电(时间以RCRC为单位),初始电压为V(0)=5V(0)=5。用步长为h=0.1h=0.1的欧拉法估计V(0.2)V(0.2)。

解答

这里f(t,V)=−Vf(t,V) = -V,因此更新公式在h=0.1h=0.1下就是Vn+1=Vn−hVn=(1−h)VnV_{n+1} = V_n - hV_n = (1-h)V_n。

第一步:V1=V0−hV0=5−0.1(5)=4.5V_1 = V_0 - h V_0 = 5 - 0.1(5) = 4.5。

第二步:V2=V1−hV1=4.5−0.1(4.5)=4.05V_2 = V_1 - hV_1 = 4.5 - 0.1(4.5) = 4.05,所以欧拉法的估计值为V(0.2)≈4.05V(0.2)\approx 4.05。

精确解为V(t)=5e−tV(t) = 5e^{-t},给出5e−0.2≈4.09375e^{-0.2}\approx 4.0937,因此两步之后的欧拉估计值大约偏差0.0440.044——这与随hh成比例缩小的一阶整体误差O(h)O(h)相符。

例题: 为什么快速反应会迫使步长变得极小

一个简化的化学反应动力学模型有一个由y′=−50(y−cos⁡t)y' = -50(y-\cos t)(y(0)=0y(0)=0)支配的快速衰减的瞬态。求出使显式欧拉法保持数值稳定的最大步长,并说明改用隐式欧拉法后会有什么变化。

解答

在快速瞬态附近,方程的行为类似于线性测试方程y′≈−50yy'\approx -50y,因此相关的值是λ=−50\lambda=-50。显式欧拉法恰好在∣1+hλ∣≤1|1+h\lambda|\le 1成立时稳定,当λ=−50\lambda=-50时这变为∣1−50h∣≤1|1-50h|\le 1,也就是0≤h≤0.040\le h\le 0.04——即便解的缓慢部分在此区间内几乎不变,这仍是一个非常小的上限。

如果选择的hh大于0.040.04,尽管真实解光滑且有界,数值解却会开始振幅不断增长的振荡:这是稳定性失败,而不是精度失败,因为在大得多的hh下局部截断误差其实仍是可以接受的。

改用隐式欧拉法yn+1=yn+hf(tn+1,yn+1)y_{n+1} = y_n + h f(t_{n+1}, y_{n+1})后,同一测试方程的稳定性条件变为∣11−hλ∣≤1\left|\frac{1}{1-h\lambda}\right|\le 1,当λ<0\lambda<0时对任意h>0h>0都成立:该方法是A-稳定的,因此步长可以完全根据需要多精确地跟踪解的缓慢部分来选择,而不必受快速瞬态的限制。

用欧拉法,设y′=yy'=y,y(0)=1y(0)=1,步长为h=0.5h=0.5,一步之后的近似值y1y_1是多少?

经典四阶龙格库塔法(RK4)的整体精度阶数是多少?

将显式欧拉法应用于刚性微分方程时,如果步长只是略微超过稳定阈值,通常会发生什么?

以下哪一项是数值微分方程求解器的典型实际应用?

参考文献

  1. J. C. Butcher (2016). Numerical Methods for Ordinary Differential Equations
  2. E. Hairer, S. P. Norsett, G. Wanner (1993). Solving Ordinary Differential Equations I: Nonstiff Problems