首先,让我们确定它们是一个不错的选择。SciMLBenchmarks可能是目前最全面的现代方法。这使用了DifferentialEquations.jl中可用的大量方法。让我们检查一下非刚性 ODE:
为了确保这一点,让我们看看一些针对 MATLAB、Python 和 R的基准测试,看看这些实现是如何优化的,比 MATLAB/Python/R 中的实现高出 50 倍以上。因此,对于快速实现,Runge-Kutta 方法似乎在非刚性 ODE 上表现良好,而且考虑到多步方法的成本/错误真正具有竞争力时,这种情况非常罕见。
为什么?
是什么补偿了计算成本增加了 7 倍?
有两个主要因素。其中之一是稳定性。显式的 Adams-Bashforth 方法非常不稳定,随着它们有序增长而失去稳定性,因此它们在实践中不是很有竞争力。
因此,使用多步方法的非刚性 ODE 优化软件通常不使用 Adams-Bashforth 方法,而是使用Adams-Bashforth-Moulton 系数。
但是等等,ABM 是隐含的,这是否意味着它适用于僵硬的方程?不,这是一个非常简单的观点。事实上,刚性方程也有显式积分器,因此“隐式 = 刚性”的观点过于简单。相反,隐式方法可用于非刚性方程,方法是使用不太稳定的方法来求解非线性系统。即你作弊一点,不要使用牛顿(更稳定),而是使用定点迭代(带有预测校正器)形式。但是,一旦您进入这种形式,更新需要求解定点迭代,因此“多步方法只需一次f
调用即可更新”从方程中看起来是正确的,但在实践中并不正确。因此,微积分变得更加模糊。即使这样,
到 5 阶时,您就处于像欧拉方法一样的稳定性……因此,虽然像CVODE
亚当斯系数、VCABM
、ode113
等的方法在技术上都可以达到 13 阶,并且只需很少的函数迭代就可以迈出巨大的步伐,但实际上这不会发生往往是因为稳定性的限制。
作为参考,请查看 Dormand-Prince 8/7 方法的稳定区域:
这个实际上并没有在实践中使用(与普遍看法相反,Dormand-Prince 8/7 方法不是 dop853 中使用的方法,而是一种不同的画面,仅在软件本身中有详细记录,但我离题了),但它的稳定区域仍然大很多。这意味着,如果事情开始变得有点稳定,它可能会采取更大的成本措施。
但是所有这些其他数字是什么?这将我们带到第二个主要因素:截断误差的主要系数。与大多数数学家所希望的相反,数值 ODE 求解的目的不是使。事实上,恰恰相反:你想让尽可能大(以达到你希望的容错为准)。因此,考虑渐近过于简单。Runge-Kutta 世界的人注意到,如果你优化截断误差的前导系数,那么即使不为零,最大误差项仍然很小,这可以允许采取更大的步长。的确,Δt→0ΔtO(Δtn)ΔtDormand-Prince 方法(ode45 背后的画面)是这些“领先的截断误差优化”方法之一。(实际上,它做了一个假设并在该约束下进行了优化,而 Tsitouras 在 2011 年放松了这一约束并创建了一个系数降低 20% 的画面,如果你回过头来查看基准,你会发现这Tsit5
就是平均表现略好于DP5
,但这是细节)。但无论如何,与此相比,多步方法具有相当大的前导系数值,这意味着要达到容错能力,它们可能需要更小的,因此最终需要更多的工作。Δt
这两个因素共同构成了一些重要因素。还有一些其他细节也很重要,但我认为你可以为此贡献大部分行为。
ode15s
现在,为什么 BDF 方法CVODE
适用于刚性方程?不会应用相同的前导截断错误参数吗?是的,确实如此,但是这些方法在刚性方程上进行了优化,因为它们采取的步骤很小。这是另一个完全不同的故事。