归一化单位,为啥我们在数值积分中使用它们? [关闭]
Posted
技术标签:
【中文标题】归一化单位,为啥我们在数值积分中使用它们? [关闭]【英文标题】:Why should I use normalised units in numerical integration? [closed]归一化单位,为什么我们在数值积分中使用它们? [关闭] 【发布时间】:2021-09-30 16:06:38 【问题描述】:我在模拟太阳系(太阳、地球和月亮)。当我第一次开始做这个项目时,我使用了基本单位:距离我使用米 [m],时间我使用秒 [s],速度/速度我使用米每秒 [m/s]。因为我在处理太阳系,所以数字很大,例如地球和太阳之间的距离是 150*10^9 m。
当我运行模拟时 - 数值积分(我使用的是 solve_ivp 方法,scipy 库中的函数) - 结果完全错误......这是地球和月球轨迹的示例。
但后来我从一个朋友那里得到一个建议,我应该使用标准化单位,距离天文单位 [AU] 和时间 [year] 年。模拟开始完美运行!
我的问题是:为什么会这样?为什么我从基础单元切换到标准单元后,一开始不工作并突然开始工作?为什么使用基本单位时计算错误?
【问题讨论】:
请更正和更新你的情节。这些单位实际上是米,还是天文单位 [AU]?用于积分的时间跨度是多少,你的粒子几乎没有移动,距离是半径的4e-11
,对应于地球轨道的0.0002
秒。
【参考方案1】:
大多数(如果不是所有)集成模块在以下情况下开箱即用效果最佳:
您的动态变量具有相同的数量级; 那个数量级是1; 动态的最小时间尺度也有数量级 1。这对于数量级不同且值和时间尺度通常在典型单位中很大的天文模拟通常会失败。
积分器出现上述行为的原因是他们使用step-size adaption,即调整积分步骤以将估计误差保持在定义的水平。 步长适应又受许多参数控制,如绝对容差、相对容差、最小时间步长等。 您通常可以调整这些参数,但如果您不这样做,则需要一些默认值,并且这些默认值是根据上述设置选择的。
离题
您可能会问自己:不能更动态地选择这些参数吗?作为集成模块的开发者和维护者,我大致预计引入这种自动化会产生以下后果:
大约千分之二的用户不会遇到像您这样的问题。 大约五万用户(包括上述用户)错过了了解集成商工作原理和阅读文档的基本知识的机会。 大约千分之一的用户会遇到比上述更难解决的自动化问题。 我需要引入新的参数来控制对于普通用户来说更难掌握的自动化。 我在设计和实施自动化方面花费了大量时间。【讨论】:
我想这个答案是对的,但它并没有从一开始就解释问题。从一开始:ODE 求解器,就像 solve_ivp 中的那些,必须选择能够“合理地”解决 ODE 的时间步。他们怎么做到的?在每一步,积分器都会估计给定步长 (lots of ways to do this) 引入的局部误差。然后他们选择引入比用户规定的更少的本地错误的步长......我已经用完了空间。但可能值得调整这个答案从一开始就解释 @nicholaswogan:我的空间已经用完了。 – 没错。我可以在这里写我自己的关于步长适应的教科书章节,但是其中很多已经存在(并且比这个问题的答案更容易找到)。我必须假设提问者/读者有一些背景知识,或者能够使用正确的关键字获得它。反正我给了一句话总结。以上是关于归一化单位,为啥我们在数值积分中使用它们? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章