使用时间阵列输入求解ode-PYTHON



我正在努力解决这个问题,搜索堆栈溢出,但找不到答案。

我想集成一组状态方程,其中我想作为参数传递的输入是与t长度相同的数组。

时间不变参数示例:

# state function
def state(x, t, u_in):
u     = x[0]
v     = x[1]
w     = x[2]
phi   = x[3]
theta = x[4]
psi   = x[5]
h     = x[6]
ax   = u_in[0]
ay   = u_in[1]
az   = u_in[2]
p    = u_in[3]
q    = u_in[4]
r    = u_in[5]
pdot = u_in[6]
qdot = u_in[7]
rdot = u_in[8]
xdot = np.zeros(len(x))
xdot[0] = ax - g * np.sin(theta) + r * v - q * w
xdot[1] = ay + g * np.sin(phi) * np.cos(theta) + p * w - r * u
xdot[2] = az + g * np.cos(phi) * np.cos(theta) + q * u - p * v
xdot[3] = p + (q * np.sin(phi) + r * np.cos(phi)) * np.tan(theta)
xdot[4] = q * np.cos(phi) - r * np.sin(phi)
xdot[5] = (q * np.sin(phi) + r * np.cos(phi)) / np.cos(theta)
xdot[6] = u * np.sin(theta) - v * np.sin(phi) * np.cos(theta) - w * np.cos(phi) * np.cos(theta)
return xdot

# initial condition
x0 = np.zeros(7)
# set problem
n = 101
t = np.linspace(0, 10, num=n)
uinp = np.zeros(9)
uinp[0] = 0
uinp[1] = 0
uinp[2] = -g
uinp[3] = 0
uinp[4] = 0
uinp[5] = 0
uinp[6] = 0
uinp[7] = 0
uinp[8] = 0

# solve ODE
x = odeint(state, x0, t, args=(uinp,))

这很好,因为我的输入是时间不变的。

我想做的是将我的uinp设置为np.zeros_like(t(并求解相同的ODE,但这并不奏效。

uinp = np.zeros((n, 9))
uinp[:, 0] = 0
uinp[:, 1] = 0
uinp[:, 2] = -g
uinp[:, 3] = 0
uinp[:, 4] = 0
uinp[:, 5] = 0
uinp[:, 6] = 0
uinp[:, 7] = 0
uinp[:, 8] = 0

我得到这个错误:

ValueError: setting an array element with a sequence.
enter code here

对每个时钟输入使用循环不是一种选择,因为这会产生太多的开销,并且运行此模拟需要很长时间。

感谢的帮助和见解

你不能让你的状态函数依赖时间吗?如果我理解正确,那么这部分:

ax   = u_in[0]
ay   = u_in[1]
az   = u_in[2]
p    = u_in[3]
q    = u_in[4]
r    = u_in[5]
pdot = u_in[6]
qdot = u_in[7]
rdot = u_in[8]

应取决于时间t:

ax   = u_in[t, 0]
ay   = u_in[t, 1]
az   = u_in[t, 2]
p    = u_in[t, 3]
q    = u_in[t, 4]
r    = u_in[t, 5]
pdot = u_in[t, 6]
qdot = u_in[t, 7]
rdot = u_in[t, 8]

您可能需要找到一种将输入t(可能是float(映射到u_in 中相应列的方法

最新更新