我看过的一些旧书说,指定订单的显式 Runge-Kutta 方法的最小阶段数对于订单是未知的. 这仍然是真的吗?
有哪些库可以自动处理高阶 Runge-Kutta 方法?
我看过的一些旧书说,指定订单的显式 Runge-Kutta 方法的最小阶段数对于订单是未知的. 这仍然是真的吗?
有哪些库可以自动处理高阶 Runge-Kutta 方法?
这仍然是正确的。在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 个节点的未标记有根树的数量。这是订单条件(累积)数量的表格每个订单都需要; 该表比文献中提供的表更进一步,并且是使用 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
较高值的条件数可以通过获取OEIS 序列 A000081的累积和来轻松计算。
对于非常高阶的方法,顺序条件的数量和复杂性变得无法手动处理。一些符号包(至少是 Mathematica)具有生成 Runge-Kutta 顺序条件的能力。可能还有其他一些软件包,但我知道以下内容(我都写过):
关于订单条件的另一个有趣的注意事项,在如此高的订单中变得很重要,有两种方法可以推导出它们,它们给你不同的(但总体上等价的)条件:一个是由于 Butcher,另一个是 Albrecht。
@DavidKetcheson 的回答很重要:您总是可以使用外推法构造足够高阶的方法,这是一个非常悲观的界限,您总是可以做得更好,所有好的方法都是手工推导出来的(在一些计算机的帮助下代数工具),没有已知的下界,最高阶的方法归功于费金。鉴于一些评论,我想通过讨论该领域当前最先进的画面来完善答案。
如果你想要一份 RK 表格概要,你可以在这个 Julia 代码中找到一个。他们来自的论文的引用在画面构造函数的文档字符串中。DifferentialEquations.jl 的开发人员文档列出了所有这些可供使用的表格,您可以在此处看到这些表格都使用 Travis 和 AppVeyor 持续集成套件进行了测试,以确保不仅满足订单条件,而且它们实际上达到要求的收敛(验证测试)。从这些可以看出有:
(我可以找到已发布的内容)。再一次,都是手工派生的。
收敛性测试表明,某些推导的精度不够高,无法处理超过 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,我很乐意看到更多的研究。