2013-03-06 50 views
0

啓用full_output應該是一項簡單的任務,但是像往常一樣,問題有點複雜。 不幸的是,除了向您展示我的代碼外,沒有任何簡單的方式來描述我的問題。在啓用ODEINT中的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值並將它們存儲在一個數組中,然後讓它進入下一行,這個問題是否會得到解決?如果是這樣的代碼是什麼樣子?

如果你不明白whay我在這樣一個奇怪的方式寫在這裏的原因:

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。

謝謝你的時間,我感謝你的迴應!

回答

1

odeint的輸出取決於full_output是否是假或真是不同的。您習慣了禁用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。