1

full_outputを有効にするのは簡単な作業ですが、いつものように問題はやや複雑です。残念ながら、私のコードを表示する以外に、私の問題を簡単に説明する方法はありません。

y_initial = pylab.array([th1,th2,th3,phi1,phi2,phi3])
t = pylab.arange(0.0, tmax, dt)
ylist = odeint (derivs, y_initial, t)

th1 = [ylist[j][0] for j in range(0,len(t))]
th2 = [ylist[j][1] for j in range(0,len(t))]
th3 = [ylist[j][2] for j in range(0,len(t))]
phi1 = [ylist[j][3] for j in range(0,len(t))]
phi2 = [ylist[j][4] for j in range(0,len(t))]
phi3 = [ylist[j][5] for j in range(0,len(t))]

odeint(derivs、y_initial、t、full_output = 0)を書き込むと問題は発生しませんが、odeint(derivs、y_initial、t、full_output = 1)を書き込むと次のようになります。

Traceback (most recent call last):
th1 = [ylist[j][0] for j in range(0,len(t))]
KeyError: 0

このエラーは、(配列などを使用して)odeintを定義した方法が原因で発生していると思います。odeint値を計算して配列に格納するループを作成し、次の行に進むとしたら、この問題は解決しますか?もしそうなら、そのようなコードはどのように見えるでしょうか?

あなたがなぜ私がそれをそのような奇妙な方法で書いたのか理解できないのなら、ここに理由があります:

def dth2dt (t,th1,th2,th3,phi1,phi2,phi3):
    return *some math dependent on switching the six variables around*

def dphi2dt (t,th1,th2,th3,phi1,phi2,phi3):
    return **some math dependent on switching the six variables around**

def derivs(y,t):

    dydt[0] = dth2dt(t,y[2],y[1],y[0],y[5],y[4],y[3])
    dydt[3] = dphi2dt(t,y[2],y[1],y[0],y[5],y[4],y[3])

    dydt[1] = dth2dt(t,y[0],y[1],y[2],y[3],y[4],y[5])
    dydt[4] = dphi2dt(t,y[0],y[1],y[2],y[3],y[4],y[5])

    dydt[2] = dth2dt(t,y[1],y[2],y[0],y[4],y[5],y[3])
    dydt[5] = dphi2dt(t,y[1],y[2],y[0],y[4],y[5],y[3])

    return dydt

この方法で、数学を繰り返し書き出すことなく変数を切り替えることができることは明らかだと思います。しかし、今ではodeintでfull_outputを有効にできません。

お時間をいただきありがとうございます、そして私はあなたの応答に感謝します!

リュウ

4

1 に答える 1

2

odeint の出力は、full_output が False か True かによって異なります。full_output が無効になっているときの動作に慣れています。有効にすると、出力はタプル (u, d) になります。ここで、u は微分方程式の解、d は full_output によって提供される出力の辞書です。key_error が発生するのは、ylist として参照しているのはこのタプルであり、期待していた頌歌の結果だけではないためです。変更する場合は、

ylist = odeint (derivs, y_initial, t)

(ylist, d) = odeint (derivs, y_initial, t, full_output=True)

期待する ylist を取得する必要があります。

于 2013-05-07T15:30:47.797 に答える