我正在尝试实现一个C++代码来评估 ODE 的 N 体系统的解决方案。我从一个 2-body 问题开始,只是为了正确设置方法。我正在比较 4 阶段 Runge-Kutta (RK4)、4 阶段 Adams-Bashforth (AB4) 和速度 Verlet 方法的结果。我得到的解决方案对于我使用的每种方法都有正确的行为,但是一旦我检查了 Verlet 方法的能量守恒,我就会得到以下结果
据我从 Hairer、Lubich 和 Wanner 的文章中了解到,Stormer-Verlet 方法不能完全保存能量,这也应该适用于速度 Verlet。但我也知道 Verlet 应该特别适合这类问题,虽然我得到了 RK4 和 AB4 能量守恒的这些行为
在我看来,这比 Verlet 更好,至少它们不会随着时间的推移而不断增长。那么关于 Verlet 方法的工作原理,我是否遗漏了一些东西,或者它可能只是一些代码问题?
编辑 1
我有一些更新,我也在这里回答 Wolfgang Bangerth。上面的每张图片都来自一个时间步长, 使用迭代。顺便说一句,我意识到代码中存在问题。现在 Verlet 方法的能量是
这与前一个相同,但振荡更多。这种振荡通过减少时间步来减少(我尝试使用时间步,与固定的迭代次数有关以及关于分别围绕中心体运行)以及我之前使用的代码,两种情况下的斜率几乎相同(大约)。这张照片和上一张都来自例如。
编辑 2
好的,现在 Verlet 似乎工作正常。即使振荡显然不是以初始能量为中心,而且还有一点调制,它似乎会随着时间缓慢增长。我还检查了角动量,它应该比 Verlet 的能量守恒得更好,我想我可以这样认为(它实际上以负斜率振荡)。





