为什么我应该在数值积分中使用归一化单位?

Why should I use normalised units in numerical integration?

我正在模拟太阳系(太阳、地球和月球)。当我第一次开始做这个项目时,我使用了基本单位:米代表距离,秒代表时间,米每秒代表速度。因为我处理的是太阳系,数字很大,比如地球和太阳之间的距离是150·10⁹m。

当我用scipy.solve_ivp对系统进行数值积分时,结果是完全错误的。这是地球和月球轨迹的示例。

但后来我从朋友那里得到建议,我应该使用标准化单位:astronomical unit (AU) 表示距离,年表示时间。模拟开始完美运行!

我的问题是:为什么这是对像我这样的问题普遍有效的建议? (请注意,这与我已经解决的具体问题无关,而是解决方案有效的原因。)

大多数(如果不是全部)集成模块开箱即用,如果:

  • 你们的动态变量具有相同的数量级;
  • 那个数量级是1;
  • 你动态的最小时间尺度也有1个数量级。

对于天文模拟,这通常会失败,因为天文模拟的数量级不同,并且值和时间尺度在典型单位中通常很大。

积分器出现上述行为的原因是他们使用 step-size adaption,即调整积分步骤以将估计误差保持在定义的水平。 步长自适应又由许多参数控制,如绝对容差、相对容差、最小时间步长等。 您通常可以调整这些参数,但如果您不这样做,则需要一些默认值,这些默认值是根据上述设置选择的。

题外话

你可能会问自己:这些参数不能更动态地选择吗?作为集成模块的开发人员和维护人员,我大致预计引入此类自动化会产生以下后果:

  • 大约千分之二十的用户不会运行遇到像你这样的问题。
  • 大约五万名用户(包括上述用户)错过了学习有关集成商工作原理和阅读文档的基本知识的机会。
  • 大约千分之一的用户会 运行 遇到比上述问题更难解决的可怕的自动化问题。
  • 我需要引入新的参数来控制普通用户更难掌握的自动化。
  • 我花了很多时间设计和实现自动化。