Эмуляция MATLAB ode15s в Python

Я работаю над переводом модели из MATLAB в Python. Суть модели заключается в ode15 от MATLAB. В исполнении MATLAB ode15s имеет стандартные опции:

options = odeset()
[t P] = ode15s(@MODELfun, tspan, y0, options, params)

Для справки, y0 является вектором (размером 98), как и MODELfun.

Моя попытка Python найти эквивалент выглядит следующим образом:

ode15s = scipy.integrate.ode(Model.fun)
ode15s.set_integrator('vode', method = 'bdf', order = 15)
ode15s.set_initial_value(y0).set_f_params(params)
dt = 1 
while ode15s.successful() and ode15s.t < duration:
     ode15s.integrate(ode15s.t+dt)

Однако это, похоже, не работает. Есть предложения или альтернатива?

Изменить: посмотрев на вывод, я получаю от Python либо отсутствие изменений некоторых элементов y0 с течением времени, либо постоянное изменение на каждом шаге для остальной части y0. Есть ли опыт работы с чем-то подобным?


person user3780330    schedule 26.06.2014    source источник
comment
... похоже, не работает. Что это обозначает? Вы получаете сообщение об ошибке? Неожиданный результат? Просьба уточнить.   -  person Warren Weckesser    schedule 26.06.2014
comment
Вы уверены, что правильно перевели код Matlab в MODELfun на Python? (Дважды проверьте код, а также проверьте, выбрав случайное время и значения параметров и убедившись, что функции MODELfun и Model.fun дают одинаковый результат.)   -  person Warren Weckesser    schedule 26.06.2014


Ответы (2)


Согласно вики SciPy для пользователей Matlab, правильным способом использования ode15s является

scipy.integrate.ode(f).set_integrator('vode', method='bdf', order=15)

person kiran.koduru    schedule 26.06.2014
comment
Часть метода разумна; параметр order не имеет никакого смысла. VODE не реализует метод BDF порядка больше 5; для методов BDF порядка выше 6 метод не является устойчивым к нулю, поэтому численное решение не будет устойчивым по отношению к возмущениям в начальных условиях. Пропустить параметр order, вероятно, нормально, потому что ode15s использует аналогичное семейство методов (либо NDF, либо BDF). - person Geoff Oxberry; 17.10.2014
comment
Ссылка Wiki устарела - person Graham G; 23.08.2020

Следует прояснить один момент: в отличие от ode15 в Matlab, scipy-интегратор vode не поддерживает модели с матрицей масс. Так что любая рекомендация должна включать это предостережение.

person Graham G    schedule 23.08.2020