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


9

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

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


“自动使用”是什么意思?
David Ketcheson 2014年

@DavidKetcheson生成系数并检查其属性。我不能完全想象,假设有多少条件和变量,有人会单纯地手工推导高阶方法。
Kirill 2014年

我不知道有任何软件可以生成这样的系数。我在网上看到了高级RK方法,例如Terry Feagin开发的那些方法。描述获得系数为10阶的过程中,纸张是在这里。看起来自动化方法不太容易实现,我怀疑它们是否存在。(作为一个旁注,我从未见过9阶RK,总是(7)8或(8)10。不确定RK9是否也存在!)
Etienne Pellegrini

(7)8,(8)9,(8)10,(10)12和(12)14 在DifferrntialEquations.jl中都具有实现。然后,您可以尝试解决一些问题。我将进行详细评估。
克里斯·拉卡卡斯

请注意,在浮点精度内,高于8阶通常无效。Verner方法确实非常好,但是FSAL最多只能使用6种方法。Feagin没有插值。
克里斯·拉卡卡斯

Answers:


14

界线

仍然是这样。在Butcher的书的第196页中,其内容如下:在1985年的一篇论文中,Butcher表明,您需要11个阶段才能获得8阶,这很明显。对于10级订单,Hairer派生了17个阶段的方法族,但尚不清楚是否可以做得更好。在Hairer,Norsett和Wanner卷的第II.5节中提供了相同的信息。后面的参考还介绍了一些用于开发高阶对(直到8阶)的技术。

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

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

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

这是订单条件(累计)数量的表 ñ 每个订单所需 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| 20300
14| 53264

软件

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

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

关于订单条件的另一个有趣的注释(在如此高的级别上变得很重要)是有两种导出它们的方法,它们为您提供了不同的(但在总体上是等效的)条件:一种是由于Butcher,另一种是由于Albrecht


5

@DavidKetcheson的答案很重要:您总是可以使用外推法构建足够高阶的方法,这是一个非常悲观的界限,并且您总是可以做得更好,所有好的方法都是手工得出的(在某些计算机的帮助下)代数工具),没有下界是已知的,而最高阶的方法则归因于Feagin。给出一些评论,我想通过讨论该领域当前的最新状态来完善答案。

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

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

(我可以找到已发表的内容)。再次,所有都是手工得出的。

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

如果您需要一堆稳定性图,则可以plot(tableau)使用Plots.jl配方。可以在Peter Stone的网站上找到很多这样的笔记,这些笔记很多(请点击下面的命令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很高兴看到更多有关此方面的研究。

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.