21

スティッフな ODE を Python に統合する優れたライブラリを探しています。問題は、scipy の odeint が良い解決策を提供してくれることもありますが、初期条件を少し変更すると、落ちてあきらめてしまうことです。同じ問題は、MATLAB のスティッフ ソルバー (ode15s および ode23s) によって非常にうまく解決されますが、(Python からでも) 使用できません。これは、MATLAB C API の Python バインディングがコールバックを実装しておらず、関数を渡す必要があるためです。 ODE ソルバーに)。私は PyGSL を試していますが、恐ろしく複雑です。どんな提案でも大歓迎です。

編集: PyGSL で私が抱えている特定の問題は、正しいステップ関数を選択することです。それらのいくつかはありますが、ode15s または ode23s に直接類似するものはありません (意味がある場合は bdf 式と変更された Rosenbrock)。では、スティッフなシステムに対して選択する適切なステップ関数は何でしょうか? このシステムを定常状態に確実に到達させるために非常に長い時間解かなければならず、GSL ソルバーは非常に小さい時間ステップまたは大きすぎる時間ステップを選択します。

4

4 に答える 4

22

Matlabで問題を解決できる場合は、scipyode15sのソルバーで問題を解決できるはずです。vodeシミュレートするode15sには、次の設定を使用します。

ode15s = scipy.integrate.ode(f)
ode15s.set_integrator('vode', method='bdf', order=15, nsteps=3000)
ode15s.set_initial_value(u0, t0)

そして、あなたは幸せにあなたの問題を解決することができますode15s.integrate(t_final)。難しい問題ではかなりうまくいくはずです。

http://www.scipy.org/NumPy_for_Matlab_Usersも参照してください)

于 2010-02-11T11:01:28.300 に答える
17

Python は C を呼び出すことができます。業界標準はODEPACKの LSODE です。パブリックドメインです。C版をダウンロードできます。これらのソルバーは非常に扱いにくいため、十分にテストされたコードを使用することをお勧めします。

追加: 剛性の高いシステムがあることを確認してください。つまり、レート (固有値) が 2 桁または 3 桁以上異なる場合です。また、システムがスティッフであるが、定常状態の解だけを探している場合、これらのソルバーは方程式の一部を代数的に解くオプションを提供します。それ以外の場合は、 DVERKのような優れたルンゲクッタ ソルバーが優れた、より単純なソリューションになります。

コメントに収まらないため、ここに追加: これは DLSODE ヘッダー ドキュメントからのものです。

C     T     :INOUT  Value of the independent variable.  On return it
C                   will be the current value of t (normally TOUT).
C
C     TOUT  :IN     Next point where output is desired (.NE. T).

また、はい、ミカエリス・メンテンの動力学は非線形です。ただし、エイトケンの加速はそれで機能します。(簡単な説明が必要な場合は、最初に Y がスカラーであるという単純なケースを考えます。システムを実行して 3 つの Y(T) ポイントを取得します。それらを通る指数曲線を当てはめます (単純な代数)。次に、Y を漸近線に設定し、繰り返します. Y をベクトルとして一般化します. 3 つの点が平面にあると仮定します.そうでない場合でも問題ありません.) さらに, 強制機能 (一定の点滴のような) がない限り, MM 除去は減衰します.システムは直線性に近づきます。それが役立つことを願っています。

于 2010-01-20T19:58:01.670 に答える
3

PyDSToolは、優れた陰的スティッフ インテグレーターである Radau ソルバーをラップします。これには odeint よりも多くのセットアップがありますが、PyGSL よりもはるかに少ないです。最大の利点は、RHS 関数が文字列として指定され (通常、シンボリック操作を使用してシステムを構築できます)、C に変換されるため、遅い Python コールバックがなく、全体が非常に高速になることです。

于 2011-07-26T19:38:41.423 に答える
2

私は現在、ODE とそのソルバーについて少し勉強しているので、あなたの質問は私にとって非常に興味深いものです...

私が聞いたり読んだりしたことから、スティッフな問題の正しい方法は、ステップ関数として陰解法を選択することです (間違っていたら訂正してください。私はまだ ODE ソルバーの謎を学んでいます)。覚えていないので、これを読んだ場所を引用することはできませんが、同様の質問がされた gsl-helpのスレッドを次に示します。

要するに、bsimpヤコビアン関数が必要ですが、この方法は試してみる価値があるように思えます。ヤコビアンを計算できない場合はrk2imp、 、rk4imp、またはいずれかのギア法を試します。

于 2010-01-19T11:20:03.687 に答える