2017-08-23 8 views
0

私はいくつかのODEを数値的に統合しています。PythonからのC/C++速度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-スニペット、インライン私をすることができますパッケージ:

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コードを許可します。

+1

あなたは運が良かったと思う - scipyの[最近の変更](https://docs.scipy.org/doc/scipy/reference/release.0.19.0.html#foreign-function-interface-improvements) 0.19あなたは 'scipy.ode'にコンパイルされたCython関数を渡しましょう。私は実際には自分で使ったことはありませんが、役に立つ実例を簡単に提供することはできません。 – DavidW

+0

ありがとう@DavidW。これは非常に便利です!私はscipyに来るのを見て非常に興奮しています。しかし、まだ[odeint](https://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.odeint.html)では実装されていないようですが、[quad](https: //docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.quad.html)(ドキュメントの 'func'の説明を参照してください)。 – Julius

答えて

1

これにはscipy.integrateの機能を拡張するスキットがあります。

それがここにあります:https://github.com/bmcage/odes

ドキュメントはODEの統合の例が含まれていCythonで右側を実装することでスピードアップ:https://github.com/bmcage/odes/blob/master/docs/ipython/Cython%20cvode%20speedup.ipynb

をDavidWは述べているように、scipyのダウンロードへの新機能がありますコンパイルされたスタイルコールバックを実装しますが、直感的なルーチンだけがこの時点でそれを利用することができます。

+0

ありがとうございます!これは素晴らしい。 – Julius