我当时的印象是,如果被建模的系统确实这样做了,那么该算法应该可以节省能量。我在建立太阳系的模型,它应该能节约能源。该程序保留角动量并产生稳定的轨道,但总能量(动能+引力势)在某些基线附近振荡。振荡是显著的。是否有共同的原因可能会发生这种情况?
模型假设行星是点质量,圆形轨道(我也尝试过椭圆轨道,能量仍然振荡),并使用牛顿力学。我想不出程序的其他特性可能会影响到结果。
如果只是预期能量会振荡,是什么原因呢?
发布于 2016-01-10 12:51:06
从评论中合并:对于一个完整的引力N体问题,我不认为任何数值积分器都是辛的。速度Verlet是不辛的,即使一个点绕中心运行(很容易检验,因为它有一个简单的解析解,g= v^2/R)。因此,我建议尝试一个高阶积分器(例如Runge),如果能量偏差几乎消失(这意味着计算一般是正确的),你可以对合并的动能进行调整,以保持总能量显着地守恒。具体来说,您计算更新的Ekin_actual和Ekin_desired = Etotal_initial -E潜,并按sqrt(Ekin_desired / Ekin_actual)缩放所有速度。
发布于 2016-01-16 13:32:41
查阅由Hairer等人撰写的论文。(用St rmer/Verlet方法说明的几何数值积分)。网上应该有几个来源。
总之,辛积分器保留一个哈密顿量,从而保持能量,但它是一个修正的哈密顿量。如果该方法被正确初始化,则修改为O(H 2)阶的扰动,其中h是步骤大小。不正确的初始化会产生O(h)的扰动,而所观察到的振荡的振幅仍应为O(H)。
因此,由物理公式计算的振荡能量的观测模式是完全正常和预期的。如果能量(迅速)偏离这一相对稳定的模式,就会观察到一个误差。
从order 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…。这被称为“合成方法”。
https://stackoverflow.com/questions/34651818
复制相似问题