二体问题的能量守恒测试

计算科学 时间积分
2021-12-04 23:18:09

我正在尝试实现一个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。上面的每张图片都来自一个时间步长h=0.1, 使用1000000迭代。顺便说一句,我意识到代码中存在问题。现在 Verlet 方法的能量是

在此处输入图像描述

这与前一个相同,但振荡更多。这种振荡通过减少时间步来减少(我尝试使用时间步h=0.1,0.05,0.025,与固定的迭代次数有关N=1000000以及关于23,12,6分别围绕中心体运行)以及我之前使用的代码,两种情况下的斜率几乎相同(大约3×1012)。这张照片和上一张都来自h=0.1例如。

编辑 2

好的,现在 Verlet 似乎工作正常。即使振荡显然不是以初始能量为中心,而且还有一点调制,它似乎会随着时间缓慢增长。我还检查了角动量,它应该比 Verlet 的能量守恒得更好,我想我可以这样认为(它实​​际上以负斜率振荡1021)。

在此处输入图像描述

在此处输入图像描述

0个回答
没有发现任何回复~