3

scipy.integrate.odeソルバーを使いたい。呼び出し可能な関数fは、離散点の配列としてのみ定義できます (前の反復からの統合の結果に依存するため)。しかし、ドキュメントから、インテグレーターは callable が連続関数であることを期待しているようです。ある種の補間を行う必要があると思います。ソルバーはこれを単独で処理できますか、それとも補間ルーチンを作成する必要がありますか? それを説明するscipyのドキュメント/チュートリアルはありますか?

4

1 に答える 1

1

はい、callable は、関数に提供された値の導関数を返す関数である必要があります。補間を行う関数がある場合は、interp次のように callable を定義できます。

f = lambda t,y: interp(y, yvalues, fvalues)

システムがスカラーの場合numpy.interp、次の例のように関数を使用できます。

import numpy
from scipy import integrate
yvalues = numpy.arange(-2,3,0.1)
fvalues = - numpy.sin(yvalues)
f = lambda t,y: numpy.interp(y, yvalues, fvalues)
r = integrate.ode(f)
r.set_initial_value(1)
t1 = 10
dt = 0.1
while r.successful() and r.t < t1:
    r.integrate(r.t+dt)
    print r.t, r.y

多次元システムの場合、補間は非常に複雑です。与えられた点でオンザフライで導関数を計算する方法があれば、おそらく補間を使用するよりも実装が簡単です。

unutbu がコメントで指摘しているように、補間すると、混沌としたシステムで十分な時間にわたって間違った解が得られます。しかし、これはどの数値解法アルゴリズムでも同じことなので、どうしようもありません。

于 2013-01-02T08:54:57.777 に答える