【发布时间】:2019-02-23 15:44:22
【问题描述】:
我使用 solve_ivp 求解微分方程组 (6 x 6)。系统读取 4 个数组(形状为 (8000, ))作为输入,并将结果保存在具有相同形状 (8000, ) 的数组中。我想重复同一个系统的一部分(只有最后两个方程)。问题是,当我对odeint 做同样的事情时,我的最终结果(theta_i 和 theta_deg_i)的长度是 8000。现在,因为在solve_ivp 中参数的顺序相反,所以我的结果长度是6 . 我该如何解决?
t = np.linspace(0,100,8000) # s
xdot = np.array(.....) # shape (8000, )
ydot = np.array(.....)
xdotdot = np.array(.....)
ydotdot = np.array(.....)
interp = interp1d(t,(xdot,ydot,xdotdot,ydotdot))
def inverse(t,k):
vcx_i = k[0]
vcy_i = k[1]
psi_i = k[2]
wz_i = k[3]
theta_i = k[4]
theta_deg_i = k[5]
# equations of the system...
return [vcxdot_i, vcydot_i, psidot_i, wzdot_i, theta_i, theta_deg_i]
k0 = [0.1257, 0, 0, 0, 0, 0]
steps = 1
method = 'RK23'
atol = 1e-3
k = solve_ivp(inverse, (0, 100), k0, method=method, t_eval=t, atol=atol, vectorized=True)
vcx_i = k.y[0,:]
vcy_i = k.y[1,:]
psi_i = k.y[2,:]
wz_i = k.y[3,:]
theta_i = k.y[4,:]
theta_deg_i = k.y[5,:]
theta_i = [inverse(t_i, k_i)[4] for t_i, k_i in zip(t, k.y)]
theta_deg_i = [inverse(t_i, k_i)[5] for t_i, k_i in zip(t, k.y)]
最后两行,在 odeint 版本中是:
theta_i = [inverse(k_i, t_i)[4] for t_i, k_i in zip(t, k)]
theta_deg_i = [inverse(k_i, t_i)[5] for t_i, k_i in zip(t, k)]
solve_ivp解中k.y的形状是(6, 8000),而odeint解中k的形状是(8000, 6)。我是 python 新手,我在 Ubuntu 16.04 LTS 上使用 python 2.7.12。先感谢您。
【问题讨论】:
标签: python-2.7 scipy dimensions odeint