【问题标题】:Improvind speed of odeint: Gravity integration提高 odeint 的速度:重力积分
【发布时间】:2012-05-24 12:40:04
【问题描述】:

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

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

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

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

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

谢谢

【问题讨论】:

  • 您可能希望研究的另一件事是实际的力评估。积分仅为 O(N),但典型实现中的力评估为 O(N^2)。 odeint 必须在某个时候调用您的力量评估,这将非常昂贵。

标签: python performance scipy


【解决方案1】:

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

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

参考:Scipy docs on ode

【讨论】:

  • 谢谢!我会尽快试试这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-19
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
  • 2017-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多