java - Velocity verlet 算法不节约能量

标签 java algorithm

我的印象是,如果被建模的系统确实如此,算法应该能够节约能源。我正在模拟太阳系,它应该节约能源。该程序保留了角动量并确实产生了稳定的轨道,但总能量(动能 + 重力势能)围绕某个基线振荡。振荡是显着的。是否有可能发生这种情况的常见原因?

模型假设行星是质点、圆形轨道(我也试过椭圆轨道,能量仍然振荡)并使用牛顿力学。我想不出该程序的哪些其他功能可能会影响结果。

如果只是预期能量会振荡,那是什么原因造成的??

最佳答案

查看 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...。这称为“组合方法”。

关于java - Velocity verlet 算法不节约能量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34651818/

相关文章:

java - Google App Engine + JSF 2 给出错误

java - arraylist如何在序列化后保存数据

algorithm - 在给定字符串排列的排序列表中查找给定排列的索引

c++ - 如何创建用于噪声生成的哈希函数

java - 在骰子值上找到可能的节点

c# - 如何按递增顺序从数组创建整体列表(子列表)

java - Spring Security 和 Angular 6 HTTPS 请求

java - Hibernate validator 总是说集合为空

Java - 使用预共享公钥对流量进行非对称加密,没有信任存储的麻烦

c++ - 如何从阻力网络中去除循环