2

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

我根据以下原理模拟相互作用的星系:让两个原子核在开普勒轨道上移动,然后让星系中的每颗恒星都没有质量。

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

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

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

谢谢

4

1 回答 1

2

odeint是一个很好的通用 ode 积分器,但由于某种原因,它可能没有为您的问题使用最佳方法。您可以尝试使用ode1代替,因为您可以通过更改它使用的积分器来控制它。如果问题不是僵硬的,那么使用龙格-库塔 (4)5 方法(dopri5 using ode)通常是合理的,如果问题是僵硬的,那么 BDF 方法通常是一个不错的选择。由于我没有对您描述的问题类型进行建模,因此我不知道您的问题是否僵硬,我建议您先尝试 dopri5,然后再尝试 BDF 方法。

您的代码中也可能存在问题,导致右侧的评估效率不合理,因此您可以尝试在那里做一些工作以加快执行速度。另一个优点ode是您可以为它提供一个函数,该函数给出精确的雅可比行列式,这可以大大提高速度,因为不使用近似值。

参考:Scipy 文档ode

于 2012-05-17T02:50:27.770 回答