构造 9 阶或更高阶的显式 Runge Kutta 方法

计算科学 龙格库塔
2021-11-30 04:55:51

我看过的一些旧书说,指定订单的显式 Runge-Kutta 方法的最小阶段数对于订单是未知的9. 这仍然是真的吗?

有哪些库可以自动处理高阶 Runge-Kutta 方法?

2个回答

界限

这仍然是正确的。Butcher 的书中,第 196 页,它说如下:在1985 年的一篇论文中,Butcher 表明您需要 11 个阶段才能获得订单 8,这很尖锐。对于 10 阶,Hairer 导出了一系列 17 阶段方法,但不知道是否可以做得更好。Hairer, Norsett, & Wanner vol.的第 II.5 节给出了相同的信息。后一个参考还介绍了一些用于开发高阶对(最多 8 阶)的技术。

任何订单所需的最小阶段数都有一个上限,因为您可以通过外推来构建它们。这已经为人所知很长时间了。请参阅我最近的这篇论文以获得解释。然而,这个界限在顺序上是二次的,而且肯定是相当悲观的。 下面讨论的 nodepy 软件可以为这些方法生成精确的系数,也可以为任何阶的延迟校正方法(Runge-Kutta 方法)生成精确系数。

我相信@Etienne 说手工构建的最高阶方法归功于 Terry Feagin 是正确的。关于他的其他评论,本文包含一些 9(8) 对:

JH Verner,具有低阶阶的高阶显式 Runge-Kutta 对,应用数值数学,第 22 卷,第 1-3 期,1996 年 11 月,第 345-357 页

订购新条件的数量n等于具有 n 个节点的未标记有根树的数量这是订单条件(累积)数量的表格N每个订单都需要p; 该表比文献中提供的表更进一步,并且是使用 nodepy 生成的:

p | N
-----
1 | 1
2 | 2
3 | 4
4 | 8
5 | 17
6 | 37
7 | 85
8 | 200
9 | 486
10| 1205
11| 3047
12| 7813
13| 20299
14| 53272

较高值的条件数N可以通过获取OEIS 序列 A000081的累积和来轻松计算

软件

对于非常高阶的方法,顺序条件的数量和复杂性变得无法手动处理。一些符号包(至少是 Mathematica)具有生成 Runge-Kutta 顺序条件的能力。可能还有其他一些软件包,但我知道以下内容(我都写过):

  • nodepy:一个 Python 包,可以为任意顺序的顺序条件生成符号表达式和代码。它还包括用于检查这些条件、计算误差系数等的 Python 代码。
  • RK-Opt:一个 MATLAB 包,除其他外,它可以找到高阶 Runge-Kutta 方法,其系数针对几个不同的目的进行了优化。它目前无法处理 9 阶显式 RK(对于 stage-order-one 方法它上升到 8th order,对于具有更高 stage order 的方法它上升到 10 order)。如果您对此感兴趣,我可以很容易地添加 9 阶(及更高阶)条件。

关于订单条件的另一个有趣的注意事项,在如此高的订单中变得很重要,有两种方法可以推导出它们,它们给你不同的(但总体上等价的)条件:一个是由于 Butcher,另一个是 Albrecht

@DavidKetcheson 的回答很重要:您总是可以使用外推法构造足够高阶的方法,这是一个非常悲观的界限,您总是可以做得更好,所有好的方法都是手工推导出来的(在一些计算机的帮助下代数工具),没有已知的下界,最高阶的方法归功于费金。鉴于一些评论,我想通过讨论该领域当前最先进的画面来完善答案。

如果你想要一份 RK 表格概要,你可以在这个 Julia 代码中找到一个。他们来自的论文的引用在画面构造函数的文档字符串中。DifferentialEquations.jl 的开发人员文档列出了所有这些可供使用的表格,您可以在此处看到这些表格都使用 Travis 和 AppVeyor 持续集成套件进行了测试,以确保不仅满足订单条件,而且它们实际上达到要求的收敛(验证测试)。从这些可以看出有:

  • 5 阶 9 方法
  • 6阶10种方法
  • 2命令12方法
  • 1阶14法

(我可以找到已发布的内容)。再一次,都是手工派生的。

收敛性测试表明,某些推导的精度不够高,无法处理超过 64 位的数字(它们被这样评论所以这是一个需要注意的有趣的怪癖:在这些高阶下,您通常只会得到“误差x”满足顺序条件的系数,但是当使用任意精度算术时,您实际上可以检测到这些界限。因此,您执行系数的精度确实很重要,您应该选择它来覆盖您希望测试的精度(/当然是使用)。

如果你想要一堆稳定性图,你可以plot(tableau)使用 Plots.jl 配方。可以在 Peter Stone 的网站上找到一组很好的笔记,其中有很多这样的记录(转到下面并单击说 order 10 方案,你会得到一堆 PDF)。在开发DifferentialEquations.jl 时,我创建了一组表格来系统地处理测试问题/查看分析指标以查看哪些应该包含在主库中。我在这里做了一些简短的笔记从主库中包含的算法可以看出,我发现值得的是 Verner 和 Feagin 方法。Verner 9 阶方法是最高阶方法,其插值也匹配阶数。这是需要认识到的:Feagin 方法没有匹配的插值(尽管您可以引导 Hermite,但这确实效率低下)。

由于它们都是通过非常有效的实现来实现的,因此您可以自己玩弄它们,看看不同的特性实际上有多么重要。这是一个 Jupyter 笔记本,它显示了 Feagin 方法的使用请注意,收敛图确实会1e-48出错。仅当您确实需要非常低的容差时,高阶方法才比低阶方法更有效。您可以在 DiffEqBenchmarks.jl找到一些使用其中一些的基准,尽管使用它们时通常是 9 阶 Verner 方法,并且通常表明基准不在这种高阶有效的状态下。

因此,如果您想尝试并使用一些高阶方法,我发现 RK-Opt 是推导某些方法的好工具(正如@DavidKetcheson 所提到的),DifferentialEquations.jl 具有所有已发布的方法(我认为? ) 实施,以便您可以轻松地对它们进行测试/基准测试。但是,除非您找到可以放弃的假设,否则从我的测试中,我无法找到能够击败 Verner(订单 6-9)和 Feagin(订单 10+)方法的东西。不过,YMMV,我很乐意看到更多的研究。