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