の (簡単な) ドキュメントにscipy.integrate.ode
は、2 つのメソッド (dopri5
およびdop853
) にはステップサイズ制御と高密度出力があると記載されています。例とコード自体を見ると、インテグレーターから出力を取得するための非常に単純な方法しかわかりません。つまり、固定された dt だけ積分器を進め、その時点で関数値を取得し、繰り返すように見えます。
私の問題はかなり可変的なタイムスケールを持っているので、必要な許容範囲を達成するために評価する必要がある時間ステップで値を取得したいと思います。つまり、早い段階で物事がゆっくりと変化しているため、出力の時間ステップが大きくなる可能性があります。しかし、物事が面白くなるにつれて、出力のタイム ステップを小さくする必要があります。実際には、等間隔で高密度の出力は必要ありません。適応関数が使用する時間ステップが必要なだけです。
編集:密な出力
関連する概念 (ほぼ反対) は「高密度出力」です。これにより、実行されるステップは、ステッパーが実行するのと同じくらい大きくなりますが、関数の値は (通常、ステッパーの精度に匹敵する精度で) 補間されます。あなたがしたい。基礎となる fortranscipy.integrate.ode
は明らかにこれが可能ですode
が、インターフェースがありません。 odeint
一方、は別のコードに基づいており、明らかに高密度の出力を行います。(右側が呼び出されるたびに出力して、それがいつ発生するかを確認し、出力時間とは関係がないことを確認できます。)
したがって、事前に必要な出力時間ステップを決定できる限り、適応性を利用することができます。残念ながら、私のお気に入りのシステムでは、統合を実行するまで、時間の関数としてのおおよそのタイムスケールが何であるかさえわかりません。したがって、積分器を 1 ステップ実行するというアイデアと、この高密度出力の概念を組み合わせる必要があります。
EDIT 2:再び密な出力
どうやら、scipy 1.0.0 では、新しいインターフェイスを介した高密度出力のサポートが導入されました。特に、キーワードとしてのから離れscipy.integrate.odeint
たり近づいたりすることを推奨しています。に設定すると、返されるオブジェクトには、時間の配列で呼び出すことができる属性が含まれます。この属性は、それらの時間に統合された関数の値を返します。それでもこの質問の問題は解決しませんが、多くの場合に役立ちます。scipy.integrate.solve_ivp
dense_output
True
sol