【问题标题】:Python script taking over 20 hours to runPython 脚本需要 20 多个小时才能运行
【发布时间】:2018-12-25 19:35:25
【问题描述】:

我有一个由 16 个耦合微分方程组成的系统,我正在使用 Scipy.integrate.odeint 包。

代码必须运行 0 到 5 gigayears,然后绘制数据,微分方程的本质是它们非常不稳定。最重要的是我使用的时间步长是 1e+8 或者我得到这个恒定的错误:

'在此调用上完成的工作过多(可能是错误的 Dfun 类型)。 以 full_output = 1 运行以获取定量信息。'

我只是想知道,有没有其他方法可以让我的积分器更快地解决问题?对于耦合 ODE 的大型系统,是否有更好的集成方法?代码已经运行了 20 多个小时,但无济于事。

【问题讨论】:

  • 在不知道您实际在做什么的情况下,我们怎么知道?请给我们一些代码!
  • scipy-cookbook.readthedocs.io/items/… 代码结构与此相同,只是函数中有16个方程,积分时间为5千兆年。
  • 您可以考虑添加一些计时函数来确定代码的哪些部分消耗了最多的计算。 docs.python.org/2/library/timeit.html 从那里您可以查看如何优化代码的特定部分。
  • @user9159408:但你不是在模拟 5 千兆年的振荡僵尸启示录,是吗?您的实际 ODE 很可能很重要。
  • 大多数积分器,尤其是那些具有自适应步长的积分器,都包含针对“人性化”问题调整的启发式或魔法常数。尝试重新调整您的问题,使基本时间单位为 0.1 或 1 gigayear,同时重新调整 ODE 的所有组件,以便您计算的数字在 1e-3 到 1e6 的范围内,如果可能的话,大小大致相同。不能保证它会有所帮助,但它应该可以防止“超出范围”的失真。

标签: python python-3.x differential-equations odeint


【解决方案1】:
  • 对于大多数大型微分方程系统,主要瓶颈通常是计算导数(右侧)。您可能纯粹在 Python 中执行此操作,这使得它比它可能的要慢得多。我写了一个Python module called JiTCODE,它通过硬编码导数来加速集成,特别适用于大型 ODE 系统。

  • 另请注意,odeint 使用 LSODA,这对于非刚性系统来说不是最有效的方法。

  • 如果集成步骤数超过某个阈值,通常会引发您遇到的错误。对于长期集成,这可能是可以预料的。可以通过调整参数mxstep来控制。

  • odeint 也有一个最大步长参数,它以我不知道的方式自动选择。虽然在快速测试中这似乎与您的时间尺度合理地缩放,但我不能排除在您的情况下它不能很好地处理以 SI 单位为单位的千兆年,这可能会导致荒谬的许多步骤。

  • 鉴于您使用的是千兆年(这暗示了天文学,这反过来又使能量守恒成为可能),您还应该检查辛积分器是否更适合您的问题。

【讨论】:

  • 谢谢你,超级有用和详细的信息。现在给你的包一个镜头,如果这仍然需要很长时间,我会尝试一个辛积分器,我认为它可以解决我的问题
  • @user9159408:请注意,辛积分器通常不会更快或解决您的问题。相关的区别在于它们为哈密顿系统保留了能量,而其他积分器则没有。如果您的系统是哈密顿系统,这可能是一个相关特征。否则,辛积分器与您无关。
  • 道歉,那是偶然的,我的系统确实是汉密尔顿式的,我从一种更简单的集成方法开始,但现在意识到这对我的需求没有好处,特别是因为它不僵硬.我已经阅读了与 JiTcode 包相关的 arxiv 论文,它看起来很有希望,所以我将首先实现它。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2018-10-04
  • 1970-01-01
  • 1970-01-01
  • 2016-10-22
  • 1970-01-01
  • 2013-08-03
  • 1970-01-01
  • 2017-09-22
相关资源
最近更新 更多