2013-03-06 3 views
0

Включение full_output должно быть тривиальной задачей, но, как обычно, проблема несколько сложна. К сожалению, нет простого способа описать мою проблему, кроме как показать вам мой код.Не удается включить full_output в ODEINT

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, т, full_output = 0) вызывает не проблема, но написание odeint (derivs, y_initial, т, 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 

Я надеюсь, что это очевидно для вас, что этот метод позволяет мне переключать переменные вокруг без необходимости многократно выписывайте математику. Но теперь я не могу включить full_output в odeint.

Спасибо за ваше время, и я благодарю вас за ваш ответ!

Ryu

ответ

1

Выход odeint отличается в зависимости от того, full_output является значение False или True. Вы привыкли к поведению, когда full_output отключен. Когда он включен, выход является кортежем (u, d), где u является решением ваших дифференциальных уравнений, а d - словарь вывода, предоставляемый full_output. Key_error возникает, потому что то, что вы называете ylist, - это кортеж, а не только результаты ode, которые вы ожидали. Если вы изменяете,

ylist = odeint (derivs, y_initial, t) 

в

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

вы должны получить вы ожидаете Мастер стилей.