速度verlet算法不节省能量

时间:2016-01-07 09:42:01

标签: java algorithm

我的印象是,如果正在建模的系统,算法应该节省能量。我正在模拟太阳能系统,这应该节省能源。该程序保留角动量并确实产生稳定的轨道,但总能量(动能+重力势)在某些基线附近振荡。振荡很重要。是否有可能发生这种情况的常见原因?

模型假设行星是点质量,圆形轨道(我也尝试过椭圆轨道,能量仍在振荡)并使用牛顿力学。我无法想象该计划的其他功能可能会影响结果。

如果只是预期能量会振荡,那会导致什么?

2 个答案:

答案 0 :(得分:1)

从评论中合并: 对于完全引力的N体问题,我认为任何数值积分器都不会是辛。即使对于绕中心轨道运行的单个点,Velocity Verlet也不是辛的(易于检查,因为它具有g = v ^ 2 / R的简单解析解)。因此,我建议尝试使用高阶积分器(例如Runge-Kutta),如果能量偏差几乎消失(意味着计算通常是正确的),您可以重新调整组合动能以保持总能量明确保存。具体来说,您计算更新的Ekin_actual和Ekin_desired = Etotal_initial - Epotential,并按sqrt(Ekin_desired / Ekin_actual)缩放所有速度

答案 1 :(得分:1)

查看Hairer等人撰写的Verlet-Störmer论文。 (Störmer/ Verlet方法说明的几何数值积分)。在线应该有几个来源。

简而言之,辛积分器保留了哈密顿量,因此保留了能量,但它是一个修正的哈密顿量。如果方法被正确初始化,则修改是O(h²)阶的扰动,其中h是步长。初始化不正确会产生O(h)的扰动,而观察到的振荡仍应具有O(h²)的振幅。

因此,由物理公式计算的观察到的振荡能量模式是完全正常的并且是预期的。如果能量(快速)偏离这种相对稳定的模式,则会观察到错误。

一个简单但效率稍低的方法来从订单2 Verlet方法获得一个4阶辛积分器来取代

Verlet(h)

通过

Verlet4(h) {
  Verlet(b0*h);
  Verlet(-b1*h);
  Verlet(b0*h);
}

其中b0=1/(2-2^(1/3))=1.35120719196…b1=2*b0-1=1.70241438392…。这被称为“组合方法”。