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

计算科学 C++ 参考请求 图书馆 C 龙格库塔
2021-12-22 01:09:12

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

到目前为止,我已经找到了这个库 (mymathlib)代码看起来不错,但我没有找到任何关于许可的信息。

您能帮我透露一些您可能知道并适合我的问题的替代方案吗?

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

4个回答

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

GNU Scientific Library (GSL) (C) 和Boost Odeint ( C++) 都具有 8 阶 Runge-Kutta 方法。

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

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

编辑:好的,Boost Odeint 没有 Runge-Kutta 89 方法,只有 78,但它确实提供了制作任意 Runge-Kutta 步进器的配方

然而,八阶方法相当高,而且很可能对您的问题过度杀伤。

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

总结几点:

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

我想补充一点,虽然 Geoff Oxberry 建议的长期积分(使用辛积分器)是正确的,但在某些情况下它不会起作用。更具体地说,如果你有耗散力,你的系统不再保存能量,因此在这种情况下你不能求助于辛积分器。问这个问题的人说的是低地球轨道,这种轨道表现出很大的大气阻力,这是一种耗散力,无法使用这种辛积分器。

在那种特定情况下(以及对于您无法使用/无法访问/不想使用辛积分器的情况),如果您需要长时间的精度和效率,我建议您使用 Bulirsch-Stoer 积分器。根据经验,它运作良好,也被 Numerical Recipes 推荐(Press et al., 2007)。