将odeint系统转换为solve_ivp,维度问题

问题描述 投票:0回答:1

我使用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
1个回答
0
投票

我将问题定位在数组的维度中,每个函数都保存结果。使用solve_ivp解决方案,k.y数组具有形状(6,8000),而odeint解决方案中的数组k的形状为(8000,6)。我只是添加了一些行,以便在重复系统之前转置数组。

k_new = np.transpose(k.y) # antistrofi diastasewn k.y apo (6,8000) se (8000,6) 
theta_i = [inverse(t_i, k_i)[4] for t_i, k_i in zip(t, k_new)]
theta_deg_i = [inverse(t_i, k_i)[5] for k_i, t_i in zip(k_new, t)]

注意:转置函数会更改数组的维度,如下所示:

([[1,  2,  3,  4,  5]              ([[1,10,100]
  [10, 20, 30, 40, 50]     --->      [2,20,200]
  [100,200,300,400,500]])            [3,30,300]
                                     [4,40,400]
                                     [5,50,500]])
  # with shape (3,5)             # with shape(5,3)
© www.soinside.com 2019 - 2024. All rights reserved.