Scipy odeint - разные значения аргументов на каждом временном шаге tx - PullRequest
0 голосов
/ 05 апреля 2020

Я пытаюсь смоделировать некоторые динамические c модели с использованием SciPy.

У меня есть определение модели:

def model(y, t, control_signal):
    dy/dt = some_function_of_time_and_y
    return dy

Я определил список временных отметок, при которых я хочу смоделировать модель: t_list=np.linspace(0, 5, 100). Я хотел бы смоделировать модель, используя control_signal значения, определенные для каждой отметки времени. Я пытался добиться этого, используя:

controls = [list_of_values]
scipy.integrate.odeint(model, 0, t_list, args=(controls))

Но я получаю The size of the array returned by func (5) does not match the size of y0 (1). Похоже, что мой controls интерпретируется как состояния модели, а не входные данные в каждой временной метке. Как я могу передать controls как значения для каждой отметки времени?

Спасибо!

1 Ответ

1 голос
/ 05 апреля 2020

В scipy.interpolate.interp1d вы можете определить режим интерполяции как «удержание нуля» или сплайн порядка 0, то есть кусочно-постоянный, с `kind =" zero ". Используйте это, чтобы определить временную зависимость вашего элемента управления.

contfunc = interp1d(t_list,control, kind="zero");

def model(y, t, control_signal):
    u = contfunc(t);
    dydt = some_function_of_time_and_y_and_u
    return dydt

Ошибка измерения может быть другой проблемой. Чтобы отладить это, используйте отладчик, если он доступен, или добавьте операторы печати для размера / формы входов и выходов. State и производные должны быть плоскими массивами одинакового размера.

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

...