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 是这个元组,而不仅仅是您期望的 ode 结果。如果你改变,

ylist = odeint (derivs, y_initial, t)

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

你应该得到你期望的ylist。

于 2013-05-07T15:30:47.797 回答