MINIBLOG

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

常微分方程初值问题的数值解法(Euler 方法, 常见单步法)


问题概述

考虑一阶常微分方程初值问题(IVP):

{y′(x)=f(x,y(x)),x∈[a,b]y(a)=y0\begin{cases} y'(x) = f(x, y(x)), & x \in [a, b] \\ y(a) = y_0 \end{cases}{y′(x)=f(x,y(x)),y(a)=y0​​x∈[a,b]

当无法求出显示解析解时,数值解法的核心思想是将自变量离散化:

a=x0<x1<⋯<xN=b,h=xk+1−xka = x_0 < x_1 < \cdots < x_N = b, \quad h = x_{k+1} - x_ka=x0​<x1​<⋯<xN​=b,h=xk+1​−xk​

并构造递推计算格式,由已知的 (xn,yn)(x_n, y_n)(xn​,yn​) 逐步推进得到近似值 yn+1≈y(xn+1)y_{n+1} \approx y(x_{n+1})yn+1​≈y(xn+1​)。


数学基础

以下定义适用于一般数值格式 yn+1=G(yn+1,yn,⋯ ,yn−k)y_{n+1} = G(y_{n+1}, y_n, \cdots, y_{n-k})yn+1​=G(yn+1​,yn​,⋯,yn−k​),其中 yny_nyn​ 为近似值,y(xn)y(x_n)y(xn​) 为准确值。

截断误差

定义(局部参考值):

将计算格式中除 yn+1y_{n+1}yn+1​ 自身外的所有历史值替换为准确值,即:

y~n+1=G(y~n+1,y(xn),⋯ ,y(xn−k))\tilde{y}_{n+1} = G(\tilde{y}_{n+1}, y(x_n), \cdots, y(x_{n-k}))y~​n+1​=G(y~​n+1​,y(xn​),⋯,y(xn−k​))

定义(局部截断误差):

ln+1=y(xn+1)−y~n+1l_{n+1} = y(x_{n+1}) - \tilde{y}_{n+1}ln+1​=y(xn+1​)−y~​n+1​

描述单步计算引入的误差大小。

定义(总体截断误差):

en+1=y(xn+1)−yn+1e_{n+1} = y(x_{n+1}) - y_{n+1}en+1​=y(xn+1​)−yn+1​

描述误差累积导致的当前总偏差。

精度、相容性与稳定性

定义(精度阶数):

若局部截断误差 ln+1=O(hp+1)l_{n+1} = O(h^{p+1})ln+1​=O(hp+1),则称该方法具有 ppp 阶精度。

定义(相容性):

若 h→0h \to 0h→0 时局部截断误差趋于 000,则称方法相容。

定义(绝对稳定性):

对模型方程 y′=λy (λ∈C)y' = \lambda y\ (\lambda \in \mathbb{C})y′=λy (λ∈C),设数值方法的单步格式为:

yn+1=R(λh) yny_{n+1} = R(\lambda h)\, y_nyn+1​=R(λh)yn​

若有:

∣R(λh)∣≤1\bigl|R(\lambda h)\bigr| \leq 1​R(λh)​≤1

则称该方法对 hhh 与 λ\lambdaλ 绝对稳定,并称

S={z∈C:∣R(z)∣≤1}\mathcal{S} = \bigl\{ z \in \mathbb{C} : \bigl|R(z)\bigr| \leq 1 \bigr\}S={z∈C:​R(z)​≤1}

为绝对稳定区域。

显式、隐式与单步、多步

定义(显式 / 隐式):

若格式中 GGG 不依赖 yn+1y_{n+1}yn+1​,即:

yn+1=G(yn,⋯ ,yn−k)y_{n+1} = G(y_n, \cdots, y_{n-k})yn+1​=G(yn​,⋯,yn−k​)

则称显式方法;反之,右端含 yn+1y_{n+1}yn+1​ 需解方程的称为隐式方法。

定义(单步 / 多步):

若 k=0k=0k=0,即格式仅依赖 yny_nyn​(及 yn+1y_{n+1}yn+1​),则称单步法;若依赖更多历史值,则称多步法。


Euler 方法

计算公式推导

Euler 方法的迭代格式为:

yn+1=yn+hf(xn,yn),n=0,1,⋯ ,N−1y_{n+1} = y_n + h f(x_n, y_n), \quad n = 0, 1, \cdots, N-1yn+1​=yn​+hf(xn​,yn​),n=0,1,⋯,N−1

法一(Taylor 展开):

将 y(x)y(x)y(x) 在 xnx_nxn​ 处展开:

y(xn+1)=y(xn)+hy′(xn)+h22y′′(xn)+O(h3)y(x_{n+1}) = y(x_n) + h y'(x_n) + \frac{h^2}{2} y''(x_n) + O(h^3)y(xn+1​)=y(xn​)+hy′(xn​)+2h2​y′′(xn​)+O(h3)

代入 y′=f(x,y)y' = f(x, y)y′=f(x,y),截断至线性项:

yn+1=yn+hf(xn,yn),n=0,1,⋯ ,N−1y_{n+1} = y_n + h f(x_n, y_n), \quad n = 0, 1, \cdots, N-1yn+1​=yn​+hf(xn​,yn​),n=0,1,⋯,N−1

法二(数值积分的左矩形公式):

y(xn+1)−y(xn)=∫xnxn+1f(ξ,y(ξ)) dξ≈hf(xn,y(xn))y(x_{n+1}) - y(x_n) = \int_{x_n}^{x_{n+1}} f(\xi, y(\xi)) \, d\xi \approx h f(x_n, y(x_n))y(xn+1​)−y(xn​)=∫xn​xn+1​​f(ξ,y(ξ))dξ≈hf(xn​,y(xn​))

导出相同的迭代格式。

注:公式中 yny_nyn​ 是近似值,不可写成 y(xn+1)=y(xn)+hf(xn,y(xn))y(x_{n+1}) = y(x_n) + h f(x_n, y(x_n))y(xn+1​)=y(xn​)+hf(xn​,y(xn​))。

误差分析

局部截断误差:

由 Taylor 展开:

y(xn+1)=y(xn)+hf(xn,y(xn))+h22y′′(xn)+O(h3)y(x_{n+1}) = y(x_n) + h f(x_n, y(x_n)) + \frac{h^2}{2} y''(x_n) + O(h^3)y(xn+1​)=y(xn​)+hf(xn​,y(xn​))+2h2​y′′(xn​)+O(h3)

对于显式 Euler 方法:

yn+1=yn+hf(xn,yn)y_{n+1} = y_n + h f(x_n, y_n)yn+1​=yn​+hf(xn​,yn​)

其局部参考值为:

y~n+1=y(xn)+hf(xn,y(xn))\tilde{y}_{n+1} = y(x_n) + h f(x_n, y(x_n))y~​n+1​=y(xn​)+hf(xn​,y(xn​))

故:

ln+1=y(xn+1)−y~n+1=h22y′′(xn)+O(h3)=O(h2)l_{n+1} = y(x_{n+1}) - \tilde{y}_{n+1} = \frac{h^2}{2} y''(x_n) + O(h^3) = O(h^2)ln+1​=y(xn+1​)−y~​n+1​=2h2​y′′(xn​)+O(h3)=O(h2)

从而 Euler 方法具有 1 阶精度。

总体截断误差:

假设 f(x,y)f(x,y)f(x,y) 对 yyy 满足 Lipschitz 条件,Lipschitz 常数为 LLL:

∣f(x,u)−f(x,v)∣≤L∣u−v∣|f(x, u) - f(x, v)| \leq L |u - v|∣f(x,u)−f(x,v)∣≤L∣u−v∣

则有总体误差递推:

∣en+1∣=∣y(xn+1)−yn+1∣≤∣y(xn+1)−y~n+1∣+∣y~n+1−yn+1∣≤O(h2)+∣y(xn)−yn∣+h∣f(xn,y(xn))−f(xn,yn)∣≤O(h2)+(1+hL)∣en∣\begin{aligned} |e_{n+1}| &= |y(x_{n+1}) - y_{n+1}| \\ &\leq |y(x_{n+1}) - \tilde{y}_{n+1}| + |\tilde{y}_{n+1} - y_{n+1}| \\ &\leq O(h^2) + |y(x_n) - y_n| + h|f(x_n, y(x_n)) - f(x_n, y_n)| \\ &\leq O(h^2) + (1 + hL)|e_n| \end{aligned}∣en+1​∣​=∣y(xn+1​)−yn+1​∣≤∣y(xn+1​)−y~​n+1​∣+∣y~​n+1​−yn+1​∣≤O(h2)+∣y(xn​)−yn​∣+h∣f(xn​,y(xn​))−f(xn​,yn​)∣≤O(h2)+(1+hL)∣en​∣​

反复递推得:

∣en+1∣≤O(h2)∑j=0n(1+hL)j=O(h2)⋅(1+hL)n+1−1hL=O(h)⋅(1+hL)n+1−1L\begin{aligned} |e_{n+1}| &\leq O(h^2) \sum_{j=0}^{n} (1+hL)^j \\ &= O(h^2) \cdot \frac{(1+hL)^{n+1} - 1}{hL} \\ &= O(h) \cdot \frac{(1+hL)^{n+1} - 1}{L} \end{aligned}∣en+1​∣​≤O(h2)j=0∑n​(1+hL)j=O(h2)⋅hL(1+hL)n+1−1​=O(h)⋅L(1+hL)n+1−1​​

由于 (1+hL)n≤enhL=eL(xn−x0)≤eL(b−a)(1+hL)^n \leq e^{nhL} = e^{L(x_n - x_0)} \leq e^{L(b-a)}(1+hL)n≤enhL=eL(xn​−x0​)≤eL(b−a) 有界,因此:

∣en+1∣=O(h)|e_{n+1}| = O(h)∣en+1​∣=O(h)

总体截断误差为 O(h)O(h)O(h),比局部误差低一阶。

稳定性分析

对模型方程 y′=λyy' = \lambda yy′=λy,Euler 格式为:

yn+1=(1+λh)yny_{n+1} = (1 + \lambda h) y_nyn+1​=(1+λh)yn​

绝对稳定要求误差不衰减:

∣1+λh∣≤1|1 + \lambda h| \leq 1∣1+λh∣≤1

当 λ<0\lambda < 0λ<0 为实数时,稳定步长满足:

h≤−2λh \leq -\frac{2}{\lambda}h≤−λ2​

步长过大将导致数值不稳定。

算法实现

def euler(f, a, b, y0, N):
    """
    显式 Euler 方法
    """
    h = (b - a) / (N - 1)
    x = a
    y = [0.0] * N
    y[0] = y0
    for i in range(1, N):
        y[i] = y[i-1] + h * f(x, y[i-1])
        x += h
    return y

注:若仅需终点值而非整条轨迹,可将 y 降为标量变量,空间复杂度降至 O(1)O(1)O(1)。


向后 Euler 方法

计算公式推导

将 y(x)y(x)y(x) 在 xn+1x_{n+1}xn+1​ 处反向 Taylor 展开:

y(xn)=y(xn+1)−hy′(xn+1)+h22y′′(xn+1)+O(h3)y(x_n) = y(x_{n+1}) - h y'(x_{n+1}) + \frac{h^2}{2} y''(x_{n+1}) + O(h^3)y(xn​)=y(xn+1​)−hy′(xn+1​)+2h2​y′′(xn+1​)+O(h3)

整理得 向后 Euler 公式:

yn+1=yn+hf(xn+1,yn+1)y_{n+1} = y_n + h f(x_{n+1}, y_{n+1})yn+1​=yn​+hf(xn+1​,yn+1​)

等价于用数值积分的右矩形公式近似 ∫xnxn+1f dξ\int_{x_n}^{x_{n+1}} f \, d\xi∫xn​xn+1​​fdξ。

隐式迭代求解

向后 Euler 公式需求解一个隐式方程,故采用迭代方式。以显式 Euler 提供初值:

{yn+1(0)=yn+hf(xn,yn)yn+1(k+1)=yn+hf(xn+1,yn+1(k)),k=0,1,⋯\begin{cases} y_{n+1}^{(0)} = y_n + h f(x_n, y_n) \\ y_{n+1}^{(k+1)} = y_n + h f(x_{n+1}, y_{n+1}^{(k)}), \quad k = 0, 1, \cdots \end{cases}{yn+1(0)​=yn​+hf(xn​,yn​)yn+1(k+1)​=yn​+hf(xn+1​,yn+1(k)​),k=0,1,⋯​

注:

  1. 上述只是 xn→xn+1x_n \to x_{n+1}xn​→xn+1​ 的一步迭代,直到隐式方程近似满足后再进行下一步迭代。
  2. 实际实现中常设置最大迭代次数 M 与阈值 eps 双重退出条件。

收敛性分析

由

∣yn+1(k+1)−yn+1(k)∣=h∣f(xn+1,yn+1(k))−f(xn+1,yn+1(k−1))∣≤hL∣yn+1(k)−yn+1(k−1)∣|y_{n+1}^{(k+1)} - y_{n+1}^{(k)}| = h |f(x_{n+1}, y_{n+1}^{(k)}) - f(x_{n+1}, y_{n+1}^{(k-1)})| \leq hL |y_{n+1}^{(k)} - y_{n+1}^{(k-1)}|∣yn+1(k+1)​−yn+1(k)​∣=h∣f(xn+1​,yn+1(k)​)−f(xn+1​,yn+1(k−1)​)∣≤hL∣yn+1(k)​−yn+1(k−1)​∣

知,当 0<hL<10 < hL < 10<hL<1 时迭代收敛。

误差与稳定性

Taylor 展开易证局部截断误差同样为 O(h2)O(h^2)O(h2),即 1 阶精度。

对模型方程 y′=λyy' = \lambda yy′=λy:

yn+1=11−hλyny_{n+1} = \frac{1}{1 - h\lambda} y_nyn+1​=1−hλ1​yn​

绝对稳定条件:

1∣1−hλ∣≤1\frac{1}{|1 - h\lambda|} \leq 1∣1−hλ∣1​≤1

也即 Re⁡(λ)<0\operatorname{Re}(\lambda) < 0Re(λ)<0,故向后 Euler 在左半平面无条件绝对稳定。但需注意兼顾迭代收敛条件 0<hL<10 < hL < 10<hL<1。

算法实现

def backward_euler(f, a, b, y0, N, M=100, eps=1e-10):
    """
    向后 Euler 方法
    """
    h = (b - a) / (N - 1)
    x = a
    y = [0.0] * N
    y[0] = y0
    for i in range(1, N):
        # 初始值:显式 Euler
        y[i] = y[i-1] + h * f(x, y[i-1])
        yt = y[i]
        for k in range(M):
            y[i] = y[i-1] + h * f(x + h, y[i])
            if abs(y[i] - yt) < eps:
                break
            yt = y[i]
        x += h
    return y

梯形公式

计算公式推导

将 Euler 与向后 Euler 取平均,或使用数值积分的梯形积分公式可得以下梯形公式:

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

为单步隐式方法。

隐式迭代求解

以显式 Euler 提供初值,迭代格式为:

{yn+1(0)=yn+hf(xn,yn)yn+1(k+1)=yn+h2[f(xn,yn)+f(xn+1,yn+1(k))]\begin{cases} y_{n+1}^{(0)} = y_n + h f(x_n, y_n) \\ y_{n+1}^{(k+1)} = y_n + \dfrac{h}{2} \Big[ f(x_n, y_n) + f(x_{n+1}, y_{n+1}^{(k)}) \Big] \end{cases}⎩⎨⎧​yn+1(0)​=yn​+hf(xn​,yn​)yn+1(k+1)​=yn​+2h​[f(xn​,yn​)+f(xn+1​,yn+1(k)​)]​

注: 上述也只是 xn→xn+1x_n \to x_{n+1}xn​→xn+1​ 的一步迭代,直到隐式方程近似满足后再进行下一步迭代。

收敛性分析

由

∣yn+1(k+1)−yn+1(k)∣≤hL2∣yn+1(k)−yn+1(k−1)∣|y_{n+1}^{(k+1)} - y_{n+1}^{(k)}| \leq \frac{hL}{2} |y_{n+1}^{(k)} - y_{n+1}^{(k-1)}|∣yn+1(k+1)​−yn+1(k)​∣≤2hL​∣yn+1(k)​−yn+1(k−1)​∣

知,当 0<hL2<10 < \dfrac{hL}{2} < 10<2hL​<1 时收敛,步长限制比向后 Euler 放宽一倍。

误差分析

对 y′(x)y'(x)y′(x) 在 xnx_nxn​ 处 Taylor 展开:

y′(xn+t)=y′(xn)+ty′′(xn)+t22y′′′(xn)+O(t3)y'(x_n + t) = y'(x_n) + t y''(x_n) + \frac{t^2}{2} y'''(x_n) + O(t^3)y′(xn​+t)=y′(xn​)+ty′′(xn​)+2t2​y′′′(xn​)+O(t3)

精确积分:

∫xnxn+1y′(x) dx=hy′(xn)+h22y′′(xn)+h36y′′′(xn)+O(h4)\int_{x_n}^{x_{n+1}} y'(x) \, dx = h y'(x_n) + \frac{h^2}{2} y''(x_n) + \frac{h^3}{6} y'''(x_n) + O(h^4)∫xn​xn+1​​y′(x)dx=hy′(xn​)+2h2​y′′(xn​)+6h3​y′′′(xn​)+O(h4)

梯形近似:

h2[y′(xn)+y′(xn+1)]=hy′(xn)+h22y′′(xn)+h34y′′′(xn)+O(h4)\frac{h}{2} \Big[ y'(x_n) + y'(x_{n+1}) \Big] = h y'(x_n) + \frac{h^2}{2} y''(x_n) + \frac{h^3}{4} y'''(x_n) + O(h^4)2h​[y′(xn​)+y′(xn+1​)]=hy′(xn​)+2h2​y′′(xn​)+4h3​y′′′(xn​)+O(h4)

从而局部截断误差:

ln+1=y(xn+1)−y~n+1=∫xnxn+1y′(x) dx−h2[y′(xn)+y′(xn+1)]+h2[y′(xn+1)−f(xn+1,y~n+1)]=−h312y′′′(xn)+O(h4)+h2[f(xn+1,y(xn+1))−f(xn+1,y~n+1)]≤−h312y′′′(xn)+O(h4)+hL2ln+1\begin{aligned} l_{n+1} &= y(x_{n+1}) - \tilde{y}_{n+1} \\ &= \int_{x_n}^{x_{n+1}} y'(x) \, dx - \frac{h}{2} \Big[ y'(x_n) + y'(x_{n+1}) \Big] + \frac{h}{2} \Big[ y'(x_{n+1}) - f(x_{n+1}, \tilde{y}_{n+1}) \Big] \\ &= -\frac{h^3}{12} y'''(x_n) + O(h^4) + \frac{h}{2} \Big[ f(x_{n+1}, y(x_{n+1})) - f(x_{n+1}, \tilde{y}_{n+1}) \Big] \\ &\leq -\frac{h^3}{12} y'''(x_n) + O(h^4) + \frac{hL}{2} l_{n+1} \end{aligned}ln+1​​=y(xn+1​)−y~​n+1​=∫xn​xn+1​​y′(x)dx−2h​[y′(xn​)+y′(xn+1​)]+2h​[y′(xn+1​)−f(xn+1​,y~​n+1​)]=−12h3​y′′′(xn​)+O(h4)+2h​[f(xn+1​,y(xn+1​))−f(xn+1​,y~​n+1​)]≤−12h3​y′′′(xn​)+O(h4)+2hL​ln+1​​

也即:

ln+1(1+O(h))=−h312y′′′(xn)+O(h4)l_{n+1}\Big(1 + O(h)\Big) = -\frac{h^3}{12}y'''(x_n) + O(h^4)ln+1​(1+O(h))=−12h3​y′′′(xn​)+O(h4)

由于 1/(1+O(h))=1+O(h)1/(1+O(h)) = 1 + O(h)1/(1+O(h))=1+O(h),所以:

ln+1=−h312y′′′(xn)+O(h4)l_{n+1} = -\frac{h^3}{12}y'''(x_n) + O(h^4)ln+1​=−12h3​y′′′(xn​)+O(h4)

梯形公式具有 2 阶精度。

注:可能不太严谨。进一步可证明其总体截断误差为 O(h2)O(h^2)O(h2)。

算法实现

def trapezoidal(f, a, b, y0, N, M=100, eps=1e-10):
    """
    梯形公式
    """
    h = (b - a) / (N - 1)
    hh = h * 0.5
    x = a
    y = [0.0] * N
    y[0] = y0
    f0 = f(a, y0)          # 当前步 f(x_n, y_n)
    for i in range(1, N):
        # 初始值:显式 Euler
        y[i] = y[i-1] + h * f0
        yt = y[i]
        for k in range(M):
            f1 = f(x + h, y[i])
            y[i] = y[i-1] + hh * (f0 + f1)
            if abs(y[i] - yt) < eps:
                break
            yt = y[i]
        f0 = f(x + h, y[i])  # 为下一步缓存
        x += h
    return y

改进 Euler 方法

计算公式与推导

在梯形公式中,仅执行一次迭代,可以将隐式化为显式格式,也即改进 Euler 方法:

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

记:

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

这其实是 2 阶 Runge-Kutta 方法的一种形式。

误差分析

由于:

y~n+1=y(xn)+h2f(xn,y(xn))+h2f[xn+1,y(xn)+hf(xn,y(xn))]=y(xn)+h2f(xn,y(xn))+h2[f(xn,y(xn))+fxh+fyfh]+O(h3)=y(xn)+hf(xn,y(xn))+h22(fx+fyf)+O(h3)\begin{aligned} \tilde{y}_{n+1} &= y(x_n) + \frac{h}{2} f(x_n, y(x_n)) + \frac{h}{2} f[x_{n+1}, y(x_n)+hf(x_n, y(x_n))] \\ &= y(x_n) + \frac{h}{2} f(x_n, y(x_n)) + \frac{h}{2} [f(x_n, y(x_n)) + f_x h + f_y f h] + O(h^3) \\ &= y(x_n) + h f(x_n, y(x_n)) + \frac{h^2}{2}(f_x + f_y f) + O(h^3) \end{aligned}y~​n+1​​=y(xn​)+2h​f(xn​,y(xn​))+2h​f[xn+1​,y(xn​)+hf(xn​,y(xn​))]=y(xn​)+2h​f(xn​,y(xn​))+2h​[f(xn​,y(xn​))+fx​h+fy​fh]+O(h3)=y(xn​)+hf(xn​,y(xn​))+2h2​(fx​+fy​f)+O(h3)​

其中 fx,fy,ff_x, f_y, ffx​,fy​,f 均在 (xn,y(xn))(x_n, y(x_n))(xn​,y(xn​)) 处取值。

注意到 y′′(xn)=fx(xn,y(xn))+fy(xn,y(xn))f(xn,y(xn))y''(x_n) = f_x(x_n, y(x_n)) + f_y(x_n, y(x_n)) f(x_n, y(x_n))y′′(xn​)=fx​(xn​,y(xn​))+fy​(xn​,y(xn​))f(xn​,y(xn​)),从而有:

y(xn+1)=y(xn)+hf(xn,y(xn))+h22(fx+fyf)+O(h3)y(x_{n+1}) = y(x_n) + h f(x_n, y(x_n)) + \frac{h^2}{2}(f_x + f_y f) + O(h^3)y(xn+1​)=y(xn​)+hf(xn​,y(xn​))+2h2​(fx​+fy​f)+O(h3)

于是:

ln+1=y(xn+1)−y~n+1=O(h3)l_{n+1} = y(x_{n+1}) - \tilde{y}_{n+1} = O(h^3)ln+1​=y(xn+1​)−y~​n+1​=O(h3)

故改进 Euler 具有 2 阶精度,且为单步显式。

算法实现

def improved_euler(f, a, b, y0, N):
    """
    改进 Euler 方法
    """
    h = (b - a) / (N - 1)
    hh = h * 0.5
    x = a
    y = [0.0] * N
    y[0] = y0
    f0 = f(a, y0)
    for i in range(1, N):
        # 预测步(显式 Euler)
        y_pred = y[i-1] + h * f0
        # 校正步(梯形公式一次迭代)
        f1 = f(x + h, y_pred)
        y[i] = y[i-1] + hh * (f0 + f1)
        # 更新导数值用于下一步
        f0 = f1
        x += h
    return y

注:每步仅需 2 次 fff 求值,无需求解隐式方程,计算效率显著高于梯形公式的迭代求解。


方法对比与复杂度分析

方法类型局部截断误差总体截断误差精度稳定条件(λ<0\lambda < 0λ<0)每步求值次数
Euler显式单步O(h2)O(h^2)O(h2)O(h)O(h)O(h)1 阶h≤−2/λh \leq -2/\lambdah≤−2/λ1
向后 Euler隐式单步O(h2)O(h^2)O(h2)O(h)O(h)O(h)1 阶Re⁡(λ)<0\operatorname{Re}(\lambda) < 0Re(λ)<0迭代求解
梯形公式隐式单步O(h3)O(h^3)O(h3)O(h2)O(h^2)O(h2)2 阶Re⁡(λ)<0\operatorname{Re}(\lambda) < 0Re(λ)<0迭代求解
改进 Euler显式单步O(h3)O(h^3)O(h3)O(h2)O(h^2)O(h2)2 阶有条件稳定2

注: 对于刚性方程(λ\lambdaλ 绝对值很大),显式方法受稳定性限制需极小步长,计算代价剧增;隐式方法稳定性好,允许大步长,虽每步需迭代,但总体效率反而更高。

目录
  • 问题概述
  • 数学基础
    • 截断误差
    • 精度、相容性与稳定性
    • 显式、隐式与单步、多步
  • Euler 方法
    • 计算公式推导
    • 误差分析
    • 稳定性分析
    • 算法实现
  • 向后 Euler 方法
    • 计算公式推导
    • 隐式迭代求解
    • 收敛性分析
    • 误差与稳定性
    • 算法实现
  • 梯形公式
    • 计算公式推导
    • 隐式迭代求解
    • 收敛性分析
    • 误差分析
    • 算法实现
  • 改进 Euler 方法
    • 计算公式与推导
    • 误差分析
    • 算法实现
  • 方法对比与复杂度分析
© 2026 miniyuan. All rights reserved.
Go to miniyuan's GitHub repo