我只是想知道为什么几乎从未讨论过/没有采用过高阶(即大于4)的Runge-Kutta方法(至少据我所知)。我知道每步需要更多的计算时间(例如RK14和12阶嵌入步骤),但是使用更高阶的Runge–Kutta方法还有其他不利之处(例如稳定性问题)吗?当将其应用于极端时间尺度上具有高振动解的方程式时,这种高阶方法通常不是首选吗?
我只是想知道为什么几乎从未讨论过/没有采用过高阶(即大于4)的Runge-Kutta方法(至少据我所知)。我知道每步需要更多的计算时间(例如RK14和12阶嵌入步骤),但是使用更高阶的Runge–Kutta方法还有其他不利之处(例如稳定性问题)吗?当将其应用于极端时间尺度上具有高振动解的方程式时,这种高阶方法通常不是首选吗?
Answers:
使用五阶或更高阶的Runge-Kutta方法可得到数千篇论文和数百种代码。请注意,MATLAB中最常用的显式积分器是ODE45,它使用5阶Runge-Kutta方法改进了解决方案。
该的Dormand与王子给予5阶法纸有超过1700引文根据谷歌学术搜索。其中大多数是使用他们的方法解决某些问题的论文。 Cash-Karp方法论文被引用超过400。高于5的最常用的排序方法也许是Prince-Dormand的8阶方法,该方法在Google Scholar上被引用超过400。我可以举很多其他的例子。并且请记住,使用这些方法的很多(如果不是大多数)人从不引用这些论文。
还应注意,高阶外推法和递延校正方法是Runge-Kutta方法。
如果精度受舍入误差限制,则应使用高阶方法。这是因为高阶方法需要更少的步骤(即使每个步骤有更多的求值,也需要更少的函数求值),因此它们的舍入误差也更少。您可以通过简单的实验轻松地验证自己。对于数值分析的第一门课程来说,这是一个很好的作业问题。
十阶方法在双精度算术中非常有用。相反,如果我们只有Euler方法,那么舍入误差将是一个主要问题,对于许多高阶求解器就可以解决的问题,我们将需要非常高精度的浮点数。
@RichardZhang引用了第二个Dahlquist壁垒,但这仅适用于多步方法。现在的问题张贴在这里是关于龙格-库塔法,并有,不仅是每一个订单的龙格-库塔法稳定版,而且B稳定版(稳定性属性一些非线性问题有用)。要了解这些方法,请参见例如Hairer&Wanner的文字。
你问
当将其应用于极端时间尺度上具有高振动解的方程式时,这种高阶方法通常不是首选吗?
你说的没错!天体力学就是一个很好的例子。我不是那个领域的专家。但本文中,例如,比较了天体力学方法,甚至不考虑订单比5降低它的结论的顺序11的方法或12往往是最有效的(具有8阶的王子Dormand方法也往往很高效)。
只要您使用标准的双精度浮点算术,就不需要非常高阶的方法来以合理的步骤数获得高精度的解决方案。在实践中,我发现解决方案的精度通常受双精度浮点表示形式的相对误差限制为1.0e-16,而不是RKF45所采取步骤的数量/长度。
如果您切换到高于双精度浮点算术方案,则使用10阶方法很值得。
只是为了增加Brian Borcher的出色回答,许多现实生活中的应用程序都接受高度刚性的ODE或DAE。直观地讲,这些问题会随着时间的推移而发生不平滑,突然的变化,因此,最好使用在短步长上精细分布的低阶多项式来建模,而不是在长步长上扩展高阶多项式。而且,稳定性通常需要使用隐式方法,对于这些方法,高阶方法的计算代价要陡得多。
更严格地说,对于刚性问题,高阶方法比低阶方法不稳定。例如,我们有用于线性多步法的Dahlquist势垒。
定理(第二达尔基斯特势垒)。A稳定的多步方法必须为阶
在RK公式中,可以为L稳定性做出类似(但更为复杂)的陈述。在所有情况下,顺序的增加通常并不总是导致更准确的解决方案。以下是Prothero和Robinson 1974年的开创性论文摘录:
在使用A稳定的一步法求解大型非线性非线性微分方程组时,我们发现
(a)一些A稳定的方法给出了高度不稳定的解,以及
(b)当方程为刚度通常似乎与所用方法的顺序无关。
有关此主题的更严格处理,请参见Hairer&Wanner的经典文章“解决常微分方程II:刚性和微分-代数问题”,1991年。
在实践中,几乎总是使用梯形法则或TR-BDF2公式(MATLAB中的ode23t和ode23tb函数)求解刚性方程。这两个都是隐式的二阶方法。当然,在稳定性不成问题的地方(即在非刚性方程式中),我们可以从多种选择中自由选择。RK45是最常见的选择。
在Julia软件DifferentialEquations.jl中,我们实现了许多高阶方法,包括Feagin方法。您可以在我们的方法列表中看到它,然后还有大量其他方法可以用作提供的表格。由于所有这些方法都组合在一起,因此您可以轻松地在它们之间进行基准测试。您可以在此处查看我在线获得的基准查看,并看到对许多不同算法进行基准测试非常简单。因此,如果您想花几分钟时间运行基准测试,那就去做吧。以下是结果摘要。
首先,需要注意的是,如果您查看每个基准测试,您会发现我们的DP5
(Dormand-Prince阶数5)和DP8
方法比Hairer Fortran代码(dopri5
和dop853
)要快,因此这些实现都进行了很好的优化。这些表明,正如在另一个线程中指出的那样,过度使用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方法。它们很好,收敛测试可以在任意精度数上工作,等等,但是要使它们正常工作,您需要要求一些相当低的公差。例如,我发现在未发布的基准测试中,公差在方面Feagin14
优于Vern9
(9阶Verner Efficient Method)1e-30
。对于具有混沌动力学的应用程序(例如在Pleides或三体天体物理学中的问题),由于敏感的依赖性(混沌系统中的错误会迅速复合),您可能需要这种准确性。但是,大多数人都可能使用双精度浮点数进行计算,而我还没有找到一个基准,可以证明它们在此公差范围内的表现优于其他基准。
此外,Feagin方法没有内插法。因此,我要做的就是简单地对它们进行三阶Hermite插值,以使它存在(并且效果很好)。但是,如果没有标准插值功能,则可以执行递归Hermite方法(使用此插值获取中点,然后执行5阶插值等),以获得高阶插值,但是这样做非常昂贵,并且结果插值不一定具有低的原则截断误差项(因此,只有在dt
确实很小的情况下才是好的,这与我们想要的情况完全相反!)。因此,如果您需要非常好的插值来匹配您的精度,则至少需要返回到Vern9
。
请注意,外推方法只是用于生成任意阶Runge-Kutta方法的算法。但是,对于它们的顺序,它们采取了比必要步骤更多的步骤,并且具有较高的原则截断误差系数,因此,在给定的顺序下,它们的效率不如最佳化的RK方法。但是,根据先前的分析,这意味着存在一个容差极低的域,这些方法将比“已知” RK方法做得更好。但是在我运行的每个基准测试中,似乎我都还没有达到这么低的水平。
选择确实与稳定性问题无关。实际上,如果您查看DifferentialEquations.jl tableaus(您可以只plot(tab)
针对稳定区域),您会发现大多数方法都具有可疑的相似稳定区域。这实际上是一个选择。通常,在推导方法时,作者通常会执行以下操作:
为什么最后一个条件?好吧,因为该方法在执行PI控制的自适应步长选择时总是很稳定,所以对于“足够好”的稳定性区域来说是一个很好的标准。因此,稳定区域都趋于相似并非偶然。
每种方法的选择都需要权衡。最高阶的RK方法在较低的容差下根本不那么有效,这既是因为难以优化系数的选择,也不是因为函数求值的数量越来越大(当涉及插值时,其增长速度甚至更快)。但是,如果公差变得足够低,它们就会胜出,但是所需的公差可能会远远低于“标准”应用程序(即,实际上仅适用于混沌系统)。