首页 文章

提高odeint的速度:重力积分

提问于
浏览
2

这个问题是关于scipy.integrate模块中的odeint函数 .

我正在按照以下原则模拟相互作用的星系:我让两个原子核在开普勒轨道上移动,然后我让星系中的每个恒星都没有质量 .

我在1个星系的参考系中工作,所以我使用了两个经典的牛顿重力1离心力 .

所有这些都与odeint(scipy.integrate模块)集成在一起,效果很好 . 我有一个问题,速度odeint是整合我的星星tho:每个明星需要大约10-15秒集成在大约100个时间步(约10亿年),但这相当于几个小时集成为总共1000颗星 . 据我的教授说,HIS程序运行大约5分钟,做了那么多的星星 . 我甚至不知道如何提高速度,因为我不能改变方程式,而odeint实际上占用了99%的运行时间 .

长话短说,如何才能提高我的odeint计算时间?

谢谢

1 回答

  • 2

    odeint 是一个很好的通用ode集成商,但由于某些原因,它可能没有使用最佳方法解决您的问题 . 您可以尝试使用 ode 1,因为您可以通过更改它使用的集成器来更多地控制它 . 如果问题不严重,那么使用Runge-Kutta(4)5方法(dopri5使用 ode )通常是合理的,如果问题很严重,那么BDF方法通常是一个不错的选择 . 因为我不知道你的问题是否僵硬,我建议你先尝试dopri5然后再尝试BDF方法 .

    您的代码中也可能存在一个问题,即右侧的评估不合理地效率低下,因此您可能会尝试在那里进行一些工作以加快执行速度 . ode 的另一个优点是,你可以为它提供一个函数,它可以提供精确的雅可比矩阵,由于不使用近似值,因此可以大大提高速度 .

    参考:Scipy docs on ode

相关问题