Skip to content

020 Improvements on the Euler Method 欧拉方法的改进

对于很多问题,欧拉方法需要很小的步长才能得到充分精确的结果。已经有大量研究致力于精度更高的方法。下面三节会讨论其中的一些方法。回到初值问题 是初值问题的解。8.1 节通过在 上积分将微分方程写作 欧拉公式是 上面的式子可以通过使用积分的左端点 来近似积分式 得到。其他定积分的近似方法就可以得到不同的数值解法。

改进的欧拉法

如果 中的定积分有更精确的近似,那么就可以得到初值问题 更精确的近似解。一种方式是使用两个端点的值的平均来近似,即 。在 这个区间上的积分近似如下图中的阴影所示。将 替换成近似 ,就可以得到如下公式

由于 右侧的 中的参数 是未知的,因此 是隐式定义。依赖于 的性质,可能求解 是非常困难的。如果将 代入 可以解决这个问题,因此 其中 被替换为

的显式定义,使用 时刻的数据来近似 。这个公式称为改进欧拉公式(improved Euler formula)或 Heun 公式(Heun formula)。改进的欧拉公式一个两阶段方法:先使用欧拉法计算 ,然后使用 来计算

欧拉公式 的局部截断误差正比于 ,而改进的欧拉公式 的局部截断误差正比于 。可以证明在有限的区间内,改进的欧拉公式的全局截断误差的上界是 的常量倍,因此这个方法是一个二阶方法。从 需要计算两次 ,运算量更大,效果是精度更高。

如果 只依赖于 而不依赖于 ,那么求解微分方程 简化为对 积分。这种情况下 变为 这正是数值积分中的梯形法则。

例 1 使用改进的欧拉公式 、步长 来估算初值问题 解的值。

解:为了清晰起见,这里给出一些详细步骤。对于问题 时,。当 时有 那么根据 第二步 代入公式 下表第四列和第五列是 区间上 时改进的欧拉方法的近似解。

Exact
0.0 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000
0.1 1.5952901 1.6076289 1.6079462 1.6088585 1.6090418
0.2 2.4644587 2.5011159 2.5020618 2.5047827 2.5053299
0.3 3.7390345 3.8207130 3.8228282 3.8289146 3.8301388
0.4 5.6137120 5.7754845 5.7796888 5.7917911 5.7942260
0.5 8.3766865 8.6770692 8.6849039 8.7074637 8.7120041
1.0 60.037126 64.382558 64.497931 64.830722 64.897803
1.5 426.40818 473.55979 474.83402 478.51588 479.25919
2.0 3029.3279 3484.1608 3496.6702 3532.8789 3540.2001

为了能够与欧拉方法有可比性,要注意改进的欧拉法每次迭代需要计算两次 的值,而欧拉法只需要一次。由于大部分的开销都是计算 ,因此要评估总的开销才能使得比较合理。对于给定 ,改进的欧拉法需要两倍的开销。因此改进欧拉法对于步长 的计算量和步长使用 的欧拉法大致一样。

上表第二列和第三列是欧拉法的估算值。改进的欧拉法使用步长 要比欧拉法使用步长 好很多。从 ,前者计算 160 次 的值,而后者计算 200 次 的值。值得注意的是,改进的欧拉法使用步长 甚至比欧拉法使用步长 还要略微好点,而后者需要 2000 次计算。也就是说,改进的欧拉法仅用了十二分之一的计算量就能得到一个差不多甚至略好的结果,可见改进的欧拉法十分高效。

步长的变化

在 8.1 节中,我们提到了在计算过程中调整步长的可能性,以便将局部截断误差保持在相对稳定的水平。目标是在尽量减少步数以节省计算量的同时,能够控制近似值的精度。下面讨论具体的操作方法。首先,选定一个误差容限(error tolerance,即可以接受的局部截断误差的上限。假设经过 步后,到了点 。选择一个步长 并计算出 。接下来,需要估计计算 时产生的误差。在不知道精确解的情况下,最好的办法是使用一种更精确的方法,从 出发重复计算。比如如果原始计算使用的是欧拉法,那么可以用改进的欧拉法重复该步骤。这两个计算值之间的差值就是对原始方法的误差的估算 。如果估算的误差大于误差容限 ,那么就调整步长并重新计算。高效调整步长的关键在于了解局部截断误差 是如何依赖于步长 的。对于欧拉法,局部截断误差与 成正比。因此,为了将估算误差降低至上界 ,将原始步长乘以 即可。

下面用一个例子说明这一过程,如下初值问题 假设误差容限 。可以验证,在步长 运行一步后,欧拉法和改进欧拉法得到的值分别为 1.5 和 1.595。因此,使用欧拉法的估算误差为 0.095。由于该误差大于容限 0.05,我们步长乘以 。保守起见向下取整,选择调整后的步长 。此时,利用欧拉公式得到 接着使用步长 的改进的欧拉方法得到 。于是,欧拉公式的估算误差变为 0.04655,略小于规定的容限。而基于精确解对比得到的实际误差稍大一些,为 0.05122。

我们可以在计算的每一步都遵循这个过程,从而在整个数值计算过程中使局部截断误差基本保持不变。现代求解微分方程的自适应代码就是以这种方式在运行过程中调整步长的,尽管通常使用比欧拉法和改进欧拉法更精确的公式。因此,这些算法能够仅在真正需要的地方使用极小的步长从而兼顾效率与精度。