为什么不经常使用高阶Runge–Kutta方法?


17

我只是想知道为什么几乎从未讨论过/没有采用过高阶(即大于4)的Runge-Kutta方法(至少据我所知)。我知道每步需要更多的计算时间(例如RK14和12阶嵌入步骤),但是使用更高阶的Runge–Kutta方法还有其他不利之处(例如稳定性问题)吗?当将其应用于极端时间尺度上具有高振动解的方程式时,这种高阶方法通常不是首选吗?


2
我认为这是一个非常主观的问题。正如您已经指出的,最大的缺点是计算成本。通常,我们尝试在准确性和计算时间之间取得平衡。在PDE中,当人们谈论高阶时,他们通常会考虑3阶或4阶。时间步长也保持相同的顺序。
维克拉姆

3
在PDE中,如果空间精度较差,那么用于时间依赖性的高阶精度方案将毫无意义。实际上,空间依赖性的精度通常约为2或3阶,尤其是在非结构化网格上工作时。人们需要以最低的成本控制全局错误截断,因此,在特定情况下,Runge-Kutta认为其准确性要高得多。
tqviet

@tqviet如果对空间导数使用最多8阶的向后或中心差分近似,则RK8是合适的,不是吗?通常,使用这种空间导数的高阶有限差分近似值是否存在精度或稳定性问题?
Mathews24 '16

1
@ Mathews24:我没有提到稳定性,这在很大程度上取决于方程式。当一个高度精确的方案被应用于空间依赖性,我们采用RK与至少精度的相同的顺序的时间依赖性,但稳定性条件可能需要的更小的值 Δt
tqviet

Answers:


17

使用五阶或更高阶的Runge-Kutta方法可得到数千篇论文和数百种代码。请注意,MATLAB中最常用的显式积分器是ODE45,它使用5阶Runge-Kutta方法改进了解决方案。

广泛使用的高阶Runge-Kutta方法的示例

的Dormand与王子给予5阶法纸有超过1700引文根据谷歌学术搜索。其中大多数是使用他们的方法解决某些问题的论文。 Cash-Karp方法论文被引用超过400。高于5的最常用的排序方法也许是Prince-Dormand的8阶方法,方法在Google Scholar上被引用超过400。我可以举很多其他的例子。并且请记住,使用这些方法的很多(如果不是大多数)人从不引用这些论文。

还应注意,高阶外推法和递延校正方法是Runge-Kutta方法

高阶方法和舍入误差

如果精度受舍入误差限制,则应使用高阶方法。这是因为高阶方法需要更少的步骤(即使每个步骤有更多的求值,也需要更少的函数求值),因此它们的舍入误差也更少。您可以通过简单的实验轻松地验证自己。对于数值分析的第一门课程来说,这是一个很好的作业问题。

十阶方法在双精度算术中非常有用。相反,如果我们只有Euler方法,那么舍入误差将是一个主要问题,对于许多高阶求解器就可以解决的问题,我们将需要非常高精度的浮点数。

高阶方法可能同样稳定

@RichardZhang引用了第二个Dahlquist壁垒,但这仅适用于多步方法。现在的问题张贴在这里是关于龙格-库塔法,并有,不仅是每一个订单的龙格-库塔法稳定版,而且B稳定版AB(稳定性属性一些非线性问题有用)。要了解这些方法,请参见例如Hairer&Wanner的文字。

天体力学中的高阶方法

你问

当将其应用于极端时间尺度上具有高振动解的方程式时,这种高阶方法通常不是首选吗?

你说的没错!天体力学就是一个很好的例子。我不是那个领域的专家。但本文中,例如,比较了天体力学方法,甚至不考虑订单比5降低它的结论的顺序11的方法或12往往是最有效的(具有8阶的王子Dormand方法也往往很高效)。


Ketchson:您能否提供有关此陈述的证据或解释:“高阶外推法和延期校正方法是Runge-Kutta方法”?特别是“延期校正方法”。谢谢。
tqviet

@David Ketcheson您可以讨论如果使用经过验证的(经过验证的)计算技术(例如向外舍入间隔或径向算术)将如何改变答案?如果使用高于双精度的向外四舍五入间隔或径向算法怎么办?随着Runge-Kutta顺序的增加,包装和依赖会发生什么,并且只是为了好玩,我们假设ODE非常僵硬。
Mark L. Stone,

@ MarkL.Stone这是一组完全不同的问题。如果您想问他们,请将其作为单独的问题发布。但是,我不是这些事情的专家,也无法回答。
David Ketcheson

1
@tqviet查看本文以获取解释。
David Ketcheson

12

只要您使用标准的双精度浮点算术,就不需要非常高阶的方法来以合理的步骤数获得高精度的解决方案。在实践中,我发现解决方案的精度通常受双精度浮点表示形式的相对误差限制为1.0e-16,而不是RKF45所采取步骤的数量/长度。

如果您切换到高于双精度浮点算术方案,则使用10阶方法很值得。


5
我认为这个答案有误导性。高阶方法产生的舍入误差要小得多,而低阶方法则在所需精度高或时间间隔长时,舍入误差占主导。请参阅下面的答案。
David Ketcheson

2
关键是,在双精度浮点中,您甚至无法表示相对精度高于1.0e-16的解决方案。在许多实际情况下,较旧的RKF45可以在您感兴趣的时间内使您达到该精度水平,而无需执行任何小步骤。对于刚性系统或需要辛积分器的情况,这可能不是一个好的选择,但是在这些情况下,高阶Runge Kutta方法也不是一个好的解决方案。我同意,在很长的一段时间内,较高阶的Runge Kutta方法会有意义。
Brian Borchers

10

只是为了增加Brian Borcher的出色回答,许多现实生活中的应用程序都接受高度刚性的ODE或DAE。直观地讲,这些问题会随着时间的推移而发生不平滑,突然的变化,因此,最好使用在短步长上精细分布的低阶多项式来建模,而不是在长步长上扩展高阶多项式。而且,稳定性通常需要使用隐式方法,对于这些方法,高阶方法的计算代价要陡得多。

更严格地说,对于刚性问题,高阶方法比低阶方法不稳定。例如,我们有用于线性多步法的Dahlquist势垒。

定理(第二达尔基斯特势垒)。A稳定的多步方法必须为阶[R2

在RK公式中,可以为L稳定性做出类似(但更为复杂)的陈述。在所有情况下,顺序的增加通常并不总是导致更准确的解决方案。以下是Prothero和Robinson 1974年的开创性论文摘录:

在使用A稳定的一步法求解大型非线性非线性微分方程组时,我们发现
(a)一些A稳定的方法给出了高度不稳定的解,以及
(b)当方程为刚度通常似乎与所用方法的顺序无关。

有关此主题的更严格处理,请参见Hairer&Wanner的经典文章“解决常微分方程II:刚性和微分-代数问题”,1991年。

在实践中,几乎总是使用梯形法则或TR-BDF2公式(MATLAB中的ode23t和ode23tb函数)求解刚性方程。这两个都是隐式的二阶方法。当然,在稳定性不成问题的地方(即在非刚性方程式中),我们可以从多种选择中自由选择。RK45是最常见的选择。


很有意思。对于为什么阶数必须小于或等于2才能成为A稳定的多步方法,是否有任何(直观的)解释?只是为了澄清一下,当您说可以对RK公式做出类似的陈述时,它是否再次成为2阶?
Mathews24 '16

但是对于Runge-Kutta方法,存在任意顺序的A稳定方法。
David Ketcheson

@DavidKetcheson是的,但是它们不是稳定的A(即L稳定)。当用于解决DAE时,它们存在很多问题,例如,模拟简单的晶体管电路。实际上,TR因在SPICE中引起人为的振铃而臭名昭著,这正是促使TR-BDF2发展的原因。
理查德·张

@DavidKetcheson供参考,请参阅doi.org/10.1090/S0025-5718-1974-0331793-2。对于DAE,A稳定性的概念还不够强大,而高阶A稳定方法在用于解决DAE时通常会产生怪异的结果。
理查德·张

可以,但是问题不在于DAE或多步方法。
David Ketcheson

9

基准设置

在Julia软件DifferentialEquations.jl中,我们实现了许多高阶方法,包括Feagin方法。您可以在我们的方法列表中看到它,然后还有大量其他方法可以用作提供的表格。由于所有这些方法都组合在一起,因此您可以轻松地在它们之间进行基准测试。您可以在此处查看我在线获得的基准查看,并看到对许多不同算法进行基准测试非常简单。因此,如果您想花几分钟时间运行基准测试,那就去做吧。以下是结果摘要。

首先,需要注意的是,如果您查看每个基准测试,您会发现我们的DP5(Dormand-Prince阶数5)和DP8方法比Hairer Fortran代码(dopri5dop853)要快,因此这些实现都进行了很好的优化。这些表明,正如在另一个线程中指出的那样,过度使用Dormand-Prince方法是因为这些方法已经被编写,而不是因为它们仍然是最好的。因此,最优化的实现之间的真正比较是Tsitorous方法,Verner方法和来自DifferentialEquations.jl的Feagin方法之间。

结果

通常,在给定的公差范围内,高于7的数量级的方法会增加计算成本,通常不会被数量级所抵消。原因之一是低阶方法的系数选择得到了优化(它们的“原理截断误差系数”很小,当您的非对称性不小的时候更重要)。您可以看到,在许多问题中,例如 Verner Efficient 6和7方法效果非常好,但是类似Verner Efficient 8的方法斜率较低。这是因为较高阶的“增益”是在较低的容差下复合的,因此始终存在较高阶的方法会更有效的容差。

但是,问题是,有多低?在一个经过优化的实现中,由于两个原因,该值变得很低。第一个原因是因为低阶方法实现了称为FSAL的东西(第一个与最后一个相同)。此属性意味着低阶方法会在下一个步骤中重复使用上一步的功能评估,从而有效地减少了一个功能评估。如果使用得当,那么像五阶方法(Tsitorous或Dormand-Prince)之类的东西实际上将进行5次函数求值,而不是表格建议的6次。对于Verner 6方法也是如此。

另一个原因是由于插值。使用非常高阶方法的原因之一是减少了步骤,并简单地对中间值进行插值。但是,为了获得中间值,内插函数可能需要比用于该步骤的函数更多的函数求值。如果您看一下Verner方法,则需要8个额外的函数求值才能使用Order 8方法获得Order 8插值。很多时候,低阶方法提供“自由”插值,例如,大多数5阶方法具有4阶自由插值(无额外的函数求值)。因此,这意味着如果您需要中间值(如果使用高阶方法,则需要一个良好的绘图),这会带来一些额外的隐藏成本。这些插补值对于事件处理和求解延迟微分方程确实非常重要,您会明白为什么要增加插补成本。

那么Feagin方法呢?

因此,您会发现基准测试中可疑地缺少了Feagin方法。它们很好,收敛测试可以在任意精度数上工作,等等,但是要使它们正常工作,您需要要求一些相当低的公差。例如,我发现在未发布的基准测试中,公差在方面Feagin14优于Vern9(9阶Verner Efficient Method)1e-30。对于具有混沌动力学的应用程序(例如在Pleides或三体天体物理学中的问题),由于敏感的依赖性(混沌系统中的错误会迅速复合),您可能需要这种准确性。但是,大多数人都可能使用双精度浮点数进行计算,而我还没有找到一个基准,可以证明它们在此公差范围内的表现优于其他基准。

此外,Feagin方法没有内插法。因此,我要做的就是简单地对它们进行三阶Hermite插值,以使它存在(并且效果很好)。但是,如果没有标准插值功能,则可以执行递归Hermite方法(使用此插值获取中点,然后执行5阶插值等),以获得高阶插值,但是这样做非常昂贵,并且结果插值不一定具有低的原则截断误差项(因此,只有在dt确实很小的情况下才是好的,这与我们想要的情况完全相反!)。因此,如果您需要非常好的插值来匹配您的精度,则至少需要返回到Vern9

关于外推的注意事项

请注意,外推方法只是用于生成任意阶Runge-Kutta方法的算法。但是,对于它们的顺序,它们采取了比必要步骤更多的步骤,并且具有较高的原则截断误差系数,因此,在给定的顺序下,它们的效率不如最佳化的RK方法。但是,根据先前的分析,这意味着存在一个容差极低的域,这些方法将比“已知” RK方法做得更好。但是在我运行的每个基准测试中,似乎我都还没有达到这么低的水平。

关于稳定性的注意事项

选择确实与稳定性问题无关。实际上,如果您查看DifferentialEquations.jl tableaus(您可以只plot(tab)针对稳定区域),您会发现大多数方法都具有可疑的相似稳定区域。这实际上是一个选择。通常,在推导方法时,作者通常会执行以下操作:

  1. 找到最低的主截断误差系数(即下一个阶项的系数)
  2. 受订单限制
  3. 并使稳定区域接近Dormand-Prince Order 5方法的稳定区域。

为什么最后一个条件?好吧,因为该方法在执行PI控制的自适应步长选择时总是很稳定,所以对于“足够好”的稳定性区域来说是一个很好的标准。因此,稳定区域都趋于相似并非偶然。

结论

每种方法的选择都需要权衡。最高阶的RK方法在较低的容差下根本不那么有效,这既是因为难以优化系数的选择,也不是因为函数求值的数量越来越大(当涉及插值时,其增长速度甚至更快)。但是,如果公差变得足够低,它们就会胜出,但是所需的公差可能会远远低于“标准”应用程序(即,实际上仅适用于混沌系统)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.