2

この質問は、scipy.integrate モジュールの odeint 関数に関するものです。

私は次の原則に基づいて相互作用する銀河をシミュレートしています。2 つの原子核をケプラー軌道で動かし、銀河内のすべての星を質量なしにします。

私は 1 つの銀河の参照フレームで作業しているので、2 つの古典的なニュートン重力と 1 つの遠心力を使用しています。

これらはすべて odeint (scipy.integrate モジュール) と統合されており、うまく機能します。odeint が星を統合する速度に問題があります。すべての星は、約 100 時間ステップ (約 10 億年) で統合されるのに約 10 ~ 15 秒かかりますが、これは統合するのに数時間かかります。合計1000スター。私の教授によると、HIS プログラムは約 5 分間実行され、その数の星を実行します。方程式を変更することができず、odeint が実際に実行時間の 99% を占めているため、どうすればこの速度を改善できるか見当もつきません。

簡単に言えば、odeintの計算時間を改善するにはどうすればよいですか?

ありがとう

4

1 に答える 1

2

odeintは優れた汎用 ode インテグレーターですが、何らかの理由で問題に最適な方法を使用していない可能性があります。使用する積分器を変更することでもう少し制御できるため、代わりにode1を使用してみてください。問題がスティッフでない場合は通常、Runge-Kutta (4)5 法 ( dopri5 using ode) を使用するのが合理的であり、問​​題がスティッフな場合は通常 BDF 法が適しています。私はあなたが説明したタイプの問題をモデル化していないので、あなたの問題が硬いかどうかはわかりません。最初に dopri5 を試し、次に BDF 法を試してみることをお勧めします。

また、コードに問題があり、右辺の評価が不当に非効率になる可能性があるため、実行速度を上げるためにそこで何らかの作業を試みることもできます。のもう 1 つの利点odeは、正確なヤコビアンを提供する関数を提供できることです。これにより、近似が使用されないため、速度が大幅に向上します。

参照: Scipy のドキュメントode

于 2012-05-17T02:50:27.770 に答える