2

私はPythonが初めてで、scipyの組み込みodeintの代わりにPythonでmatlab ode15sを使用して模倣したいと考えています。

コードはもともと次のように書かれています。

newRphi = odeint(PSP,Rphi,t,(b,k,F))[-1,:]

ここで、PSP は次のように定義されます。

def PSP(xx,t,b,k,F):
R = xx[0]
phi = xx[1]
Rdot = sum([b[i]*R**(i+1) for i in xrange(len(b))]) + F(t) #indexing from zero
phiDot = 2*pi * k[2]*((R/k[1])**k[0])
yy = hstack((Rdot,phiDot))
return(yy)

scipy.integrate.odeint() の説明を読むと、この関数は次の形式で引数を取ります。

scipy.integrate.odeint(func, y0, t, args=())

これは、func=PSP, y0=Rphi, t=t, args=(b,k,f) So Rphi が PSP 関数に入り、積分されて yy になって出てくることを意味し、この関数は t のすべての要素に対してそれを繰り返します。

今、それを matlab の ode15s を模倣するものに変換したいと考えています。他のいくつかのトレッドを読んで、私はそれを使用できることがわかりました

ode.set_integrator('vode', method='bdf', order=15)

問題は、元の引数をこのインテグレータに渡すにはどうすればよいかということです。

おそらく次のようになると思います。

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

f が私の PSP 関数であることはわかっていますが、y0 は同じです: Rphi, ここに私の質問があります:

  1. t0 の初期値は何ですか? t[0] だけですか?
  2. 変数 (b,k,f) を関数 f=PSP に渡すにはどうすればよいですか?
  3. これを ode15s と呼ぶ場合、t のベクトル サイズを積分して yy の最終値を収集するにはどうすればよいですか?

どんな助けでも大歓迎です。ありがとうございました。

4

0 に答える 0