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