在C / C ++中寻找Runge-Kutta八阶


10

我想在使用Windows机器以C ++编写的天体力学/天体动力学应用程序中使用Runge-Kutta 8阶方法(89)。因此,我想知道是否有人知道有文档记录且可以免费使用的好的库/实现?只要用C编写就可以了,只要不存在任何编译问题即可。

到目前为止,我已经找到了这个库(mymathlib)。该代码似乎还可以,但是我还没有找到有关许可的任何信息。

您能通过揭示一些您可能知道并且适合我的问题的替代方法来帮助我吗?

编辑:
我看到确实没有像我期望的那样有太多的C / C ++源代码。因此,Matlab / Octave版本也可以(仍然必须免费使用)。

Answers:


8

这两个GNU科学图书馆(GSL)(C)和升压Odeint(C ++)功能,8阶龙格-库塔法。

两者都是开源的,在linux和mac下,它们应该可以直接从软件包管理器中获得。在Windows下,使用Boost而不是GSL可能会更容易。

GSL在GPL许可下发布,Boost Odeint在Boost许可下发布。

编辑:好,升压Odeint没有龙格-库塔89的方法,只有78,但它确实提供了一个配方制作任意龙格-库塔步进。

八阶方法相当高,最有可能对您的问题造成过大杀伤力。

Prince-Dormand是特定类型的Runge-Kutta,与顺序没有直接关系,但最常见的是45。Matlabs ode45是其推荐的ODE算法,是Prince-Dormand 45的实现。这与Boost Odeint Runge_Kutta_Dopri5中实现的算法相同。


1
谢谢你的答案。好吧,这现在令人尴尬,我什至在询问之前就已经看过Boost Odeint,只发现了“ runge_kutta_fehlberg78”。这是对的吗?实际上,我不知道在实践中使用方法之间的区别,但是我正在寻找RK89(在搜索互联网时也称为Dormand-Prince)。您能否对此事发表评论或扩大答案?谢谢。
James C

更新了帖子以回答您的问题。Prince-Dormand 45最有可能很好地解决您的问题。
LKlevin

15

如果您要长时间进行天体力学,那么使用经典的Runge-Kutta积分器将无法节省能量。在那种情况下,使用辛积分器可能会更好。Boost.odeint还实现了4阶辛格Runge-Kutta方案,该方案在较长的时间间隔内效果更好。据我所知,GSL没有实现任何辛方法。


谢谢你的答案。如果与地球卫星(低轨道以及更深的空间轨道)一起使用,四阶辛格Runge-Kutta会比RKF78产生更好的结果,也许在1-3个轨道上?
詹姆斯C

@JamesC是的。从长远来看,辛法会更好。
eccstartup

@eccstartup-您在这里会考虑多长时间?因为它可以,只要是围绕太阳行星的轨道一个或气象卫星围绕地球等一些轨道
林老师

@JamesC我没有发现这个大问题。但是对于我的模型问题,通过计算许多轨道,辛方法给出了非常完美的轨道。
eccstartup

因此,建议您编写一个隐式Runge-Kutta方法的版本,该方法包括许多具有较高阶数的辛方法。
eccstartup

4

总结几点:

  1. 如果它是对非耗散模型的长期集成,那么您正在寻找辛格积分器。
  2. 否则,由于它是运动方程,因此Runge-Kutta Nystrom方法将比转换为一阶系统更有效。由于DP,存在高阶RKN方法。有一些实现,如在这里朱莉娅他们记录这里是一个MATLAB一个
  3. 仅当您需要高精度解决方案时,才需要高阶Runge-Kutta方法。如果公差较低,则五阶RK可能会更快(对于相同的误差)。如果您需要经常解决这个问题,那么最好的办法就是测试一堆不同的方法。在这组关于三体问题的基准测试中,我们看到(对于相同的错误)高阶RK方法只是速度的边际改进,尽管当错误-> 0时,您可以看到对Dormand的改进已经超过了5倍-Prince 45(DP5),如果您要查看4位数的精度(尽管公差为此低得多。公差在任何问题上都是一个标准)。随着公差的降低,从高阶RK方法获得的改进会越来越小,但您可能需要开始使用更高的精度数字。
  4. Dormand-Prince阶7/8算法与Hairer dop853和DifferentialEquations.jl的DP853方法DP8(相同)具有不同的8阶表。后者853方法无法在Runge-Kutta方法的标准表格版本中实现,因为它的误差估算器是非标准的。但是这种方法效率更高,即使使用较旧的Fehlberg 7/8或DP 7/8方法,我也不推荐使用。
  5. 对于高阶RK方法,Verner的“有效”方法是黄金标准。这显示在我链接的基准中。您可以自己编写这些代码到Boost中,或者如果需要,可以使用实现它们的2个软件包之一(Mathematica或DifferentialEquations.jl)。

2

我想补充一点,尽管Geoff Oxberry建议进行长期积分(使用辛积分器)是正确的,但在某些情况下它是行不通的。更具体地说,如果您具有耗散力,您的系统将不再保留能量,因此在这种情况下您将无法求助于辛格积分器。问这个问题的人是在谈论低地球轨道,而这些轨道表现出大量的大气阻力,这是一种耗散的力量,因此无法使用这种辛格积分器。

在这种特定情况下(对于无法使用/无法访问/不想使用辛积分器的情况),如果您需要长时间的精度和效率,我建议使用Bulirsch-Stoer积分器。根据经验,它可以很好地工作,并且在《数字食谱》中也推荐使用(Press等,2007)。


不,不建议使用数字食谱。特别是在大多数情况下,不建议使用Burlirsch-Stoer。这是本书的一个众所周知的问题。在此处查看来自该领域顶尖研究人员的大量建议:uwyo.edu/buerkle/misc/wnotnr.html。如果您想以此为基准,请参阅Hairer的第一本书,您会发现BS几乎永远做不到。只有当误差足够低时,高阶才更有效率,而我们(和其他机构)已经进行了基准测试,以一致地表明它仅对次浮点精度有效。
克里斯·拉卡卡斯

我不能过多地代表NR,因为我主要将其用于ODE,但是在我看来,您链接到的页面上的投诉很旧,并且在NR的作者的答复中得到了解决(页面结尾),但这是题外话。关于我在回答中提到的高精度的长期轨道积分(例如13至14位数字),长期以来证明了外推方法很好用(请参阅Montenbruck&Gill的数值积分一章)。最近的论文也使用了它,并且它向我和其他人证明了一种可靠且有效的方法。
viiv

M&G仅针对dop853进行测试,而更现代的高阶RK方法(例如由于Verner而产生的方法)效率更高。M&G似乎也只能使用功能评估来衡量,这是时间的弱项指标。它也不能与Runge-Kutta Nystrom方法相对应,该方法专门用于二阶ODE,并且比应用于二阶的一阶RK方法更有效。BS的13-14位数字在大多数问题上可能具有竞争力,但是它距离明显的选择还很遥远,而且我还没有看到一个工作精度图表,但最近的方法对此并不满意。
克里斯·拉卡卡斯

M&G确实对RKN进行了RKN的测试,而BS对RKN进行了其他测试(第123-132页和151-154页),并说它们是最有效的RK方法(即使引用了Verner,也不包括Verner)。BS被证明是有效的13-14位数字,这是我的主张,我已经看到它针对dop853,ABM(12),Taylor和标准RK8进行了测试,并且性能良好。我不得不承认,我还没有看到它再次经过RKN的测试,但是从M&G那里我可以看到它距离FILG11不远。我对Verner的RK确实很感兴趣,并且会在上面查看您的链接。您是否有一篇纸可以测试所有这些文件以查看?
viiv

我回去,并在重新跑了一堆基准DiffEqBenchmarks.jlodex不倾向于公平良好。因此,至少对于一阶ODE和公差而言>=1e-13,外推法似乎效果不佳,而且通常不甚接近。这与上面的主张是一致的。
克里斯·拉卡卡斯
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.