Я пытаюсь решить эту проблему, искал переполнение стека и не смог найти ответ.
Я хочу интегрировать набор уравнений состояния, где мои входные данные, которые я хочу передать в качестве аргументов, массивы с одинаковой длиной т.
Пример неизменяемых во времени аргументов:
# 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
Использование al oop для каждого входа часов невозможно, так как это создает слишком много накладных расходов, и для запуска этого моделирования требуется вечность.
Спасибо за помощь и понимание