我见过一些较旧的书说,指定订单的显式Runge-Kutta方法的最小阶段数对于订单是未知的 。这仍然是真的吗?
有哪些库可以自动处理高阶Runge-Kutta方法?
我见过一些较旧的书说,指定订单的显式Runge-Kutta方法的最小阶段数对于订单是未知的 。这仍然是真的吗?
有哪些库可以自动处理高阶Runge-Kutta方法?
Answers:
仍然是这样。在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页
这是订单条件(累计)数量的表 每个订单所需 ; 该表比文献中提供的表更远,并且是使用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订单条件的功能。可能还有其他软件包,但是我知道以下内容(我都写了):
关于订单条件的另一个有趣的注释(在如此高的级别上变得很重要)是有两种导出它们的方法,它们为您提供了不同的(但在总体上是等效的)条件:一种是由于Butcher,另一种是由于Albrecht。
@DavidKetcheson的答案很重要:您总是可以使用外推法构建足够高阶的方法,这是一个非常悲观的界限,并且您总是可以做得更好,所有好的方法都是手工得出的(在某些计算机的帮助下)代数工具),没有下界是已知的,而最高阶的方法则归因于Feagin。给出一些评论,我想通过讨论该领域当前的最新状态来完善答案。
如果您想要一份RK表格概要,则可以在此Julia代码中找到一个。他们来自该论文的引用位于tableau构造函数的文档字符串中。DifferentialEquations.jl的开发人员文档列出了所有可用的表,您可以在此处看到所有这些表都已使用Travis和AppVeyor连续集成套件进行了测试,以确保不仅满足订单条件,而且实际上满足它们。达到要求的收敛(验证测试)。从这些中,您可以看到有:
(我可以找到已发表的内容)。再次,所有都是手工得出的。
收敛测试表明,某些推导的执行精度不够高,无法适用于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很高兴看到更多有关此方面的研究。