решение оды с вводом временного массива - PYTHON - PullRequest
0 голосов
/ 17 февраля 2020

Я пытаюсь решить эту проблему, искал переполнение стека и не смог найти ответ.

Я хочу интегрировать набор уравнений состояния, где мои входные данные, которые я хочу передать в качестве аргументов, массивы с одинаковой длиной т.

Пример неизменяемых во времени аргументов:

# 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 для каждого входа часов невозможно, так как это создает слишком много накладных расходов, и для запуска этого моделирования требуется вечность.

Спасибо за помощь и понимание

1 Ответ

0 голосов
/ 17 февраля 2020

Не могли бы вы сделать свою функцию состояния зависимой от времени? Если я правильно понял, то эта часть:

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

...