我正在为模拟轨道物理(Kerbal Space Program,或 KSP)的游戏编写一个 mod。我试图在某些状态下模拟推力对航天器的影响,其中游戏仅将它们建模为开普勒轨道(这艘船“在轨道上”),并且我在数值稳定性方面遇到了一些困难——即使我没有没有施加任何推力,我最终会不断增加轨道的偏心率。
在“在轨”状态下,游戏中的航天器完全遵循开普勒轨道。轨道是在航天器上轨道时计算的,然后当它出轨时,游戏会计算当前时间的预期位置和速度,并设置航天器从那里做正常的牛顿事情。
目前,我的代码所做的只是计算航天器在当前时间的位置和速度(使用游戏自己的代码),然后调用游戏中已经存在的函数来计算具有该位置的物体的开普勒轨道和当前占主导地位的身体周围的速度 - 也就是说,它应该是无操作的。实际上,我看到轨道的偏心率在快速漂移,当然速度很快,这对于游戏目的来说是行不通的。这段代码在游戏中的每个物理时间步都被调用,这相当频繁 - 大约每秒 50 次 - 所以我怀疑我看到的是游戏中用于计算轨道位置和速度的代码,反之亦然不稳定。一世' 已经证实,在实际游戏过程中,将一艘船从轨道上取下然后放回轨道上会导致可观察到的轨道差异,并且我已经确认在我重新计算轨道后计算出的飞船位置/速度会发生变化。位置相对误差约为,速度的相对误差约为。
我不确定这里最好的解决方案是什么,而且我在数值计算方面的经验非常有限。我想知道解决这个问题的好方法可能是什么样的。据我所知,基本上有三类解决方案:
- 直接根据旧轨道参数和推力计算新轨道。不过,我不知道计算开普勒轨道上的增量有多么合理,而且我在网上找不到太多关于这样做的信息。
- 编写具有更好精度或更好数值稳定性的代码以进行轨道 -> pos/vee -> 轨道转换。不过,我不知道当你每秒这样做五十次时,任何稳定性有多合理。我找到了一些用于计算的代码,但我不知道它在快速/稳定/良好的频谱上的位置。
- 为飞船保留我自己的位置/速度值,不断更新它们,每隔一段时间重新计算轨道,以便玩家获得一些反馈。这将需要实施一个通用的二体问题解决方案,这听起来需要做很多工作。
这里有什么好的选择?