这个问题是关于 scipy.integrate 模块中的 odeint 函数。
我根据以下原理模拟相互作用的星系:我让两个原子核在开普勒轨道上移动,然后我将星系中的每颗恒星都视为没有质量。
我在 1 个星系的引用系中工作,因此我使用两个经典牛顿重力 + 1 个离心力。
所有这些都与 odeint (scipy.integrate 模块)集成,效果很好。我在整合我的星星时遇到了速度问题: 每颗恒星需要大约 10-15 秒的时间进行约 100 个时间步长(约 10 亿年)的整合,但这相当于总共 1000 颗恒星需要几个小时的整合时间。据我的教授说,HIS 程序运行大约 5 分钟,完成了这些星星的数量。我什至不知道如何提高这个速度,因为我无法更改方程,而且 odeint 确实占用了 99% 的运行时间。
长话短说,我如何才能缩短 odeint 计算时间?
谢谢
最佳答案
odeint
是一个很好的通用 ode 积分器,但由于某种原因它可能没有使用解决您的问题的最佳方法。您可以尝试使用ode
1相反,因为您可以通过更改它使用的积分器来更多地控制它。如果问题不僵硬,那么通常使用 Runge-Kutta (4)5 方法(dopri5 使用ode
)是合理的,如果问题很僵硬,那么 BDF 方法通常是一个不错的选择。由于我没有对您描述的问题类型进行建模,因此我不知道您的问题是否僵硬,我建议您首先尝试 dopri5,然后再尝试 BDF 方法。
您的代码中也可能存在问题,导致右侧的评估效率不合理地低下,因此您可以尝试在那里做一些工作以加快执行速度。 ode
的另一个优点是,您可以为其提供一个函数,该函数可以给出精确的雅可比行列式,由于不使用近似值,因此可以大大提高速度。
关于python - 提高odeint : Gravity integration的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10627215/