python - 提高odeint : Gravity integration的速度

标签 python performance scipy

这个问题是关于 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 的另一个优点是,您可以为其提供一个函数,该函数可以给出精确的雅可比行列式,由于不使用近似值,因此可以大大提高速度。

引用:Scipy docs on ode

关于python - 提高odeint : Gravity integration的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10627215/

相关文章:

python - 如何将 PrefetchDataset 转换为 TF 张量?

python - python asyncIO如何暂停和恢复任务?

c# - View 会降低 LINQ 查询性能吗?

MySQL,返回最近 X 小时内的所有测量值和结果

performance - Google Chrome 网络面板中的时间线中的时间是什么意思?

python - 为什么 SciPy 返回 `nan` 用于样本方差为 0 的 t 检验?

python - 是否有 scipy.optimize.minimize 的并行版本?

python - 修复具有较大 y 比例范围的图表。 Python

Python - 无法转换为 int

python - scipy 大型稀疏矩阵