【问题标题】:C/C++ speed ODE integration from Python来自 Python 的 C/C++ 速度 ODE 集成
【发布时间】:2017-08-24 02:04:14
【问题描述】:

我正在对一些 ODE 进行数值积分,例如

y'(t) = f(y(t), t)

这很容易使用例如 scipy 的integrate.ode 完成。函数f是使用标准Python定义的,例如:

def f(y, t, k):
    return -k*y**3

我的理解是,这意味着integrate.ode 使用的fortran/C 实现必须一直对Python 进行回调,这可能会很慢。 我的问题是有没有办法避免这种情况?

最好我正在寻找一个可以让我在我的 Python 代码中内联 C-sn-p 的包,例如:

double f(double y, double t, double k) {
    return -k*pow(y,3);
}

是否有任何适用于 Python 的 ODE 集成器库允许这样做?

我知道有像scipy.weave 这样的包可用于在Python 中内联C 代码,但我看不到与Integrate.ode 交互的简单方法。在所有情况下,我认为接口都必须通过 Python 函数调用。

这样的内联 C 代码存在于其他库中,例如 fenics,其中 Expression 允许 jit 编译的 C 代码。

【问题讨论】:

  • 我认为你很幸运 - scipy 0.19 中的 recent changes 让你将编译后的 Cython 函数传递给 scipy.ode。我自己并没有真正使用过它,所以不能轻易提供一个有用的工作示例......
  • 谢谢@DavidW。这非常有用!我很高兴看到它来到 scipy。但是,它似乎还没有为odeint 实现,而只是为quad 实现(参见文档中func 的描述)。

标签: python numpy scipy cython


【解决方案1】:

有一个专门用于扩展 scipy.integrate 功能的 scikit。

这里有:https://github.com/bmcage/odes

文档包含一个通过在 Cython 中实现右侧加速 ODE 集成的示例:https://github.com/bmcage/odes/blob/master/docs/ipython/Cython%20cvode%20speedup.ipynb

正如 DavidW 提到的,SciPy 中有一个新功能可以实现编译样式回调,但此时只有正交例程可以使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-03
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 2012-12-16
    • 2013-09-03
    • 1970-01-01
    相关资源
    最近更新 更多