(Краткая) документация для scipy.integrate.ode
говорит, что два метода (dopri5
и dop853
) имеют управление шагами и плотный вывод. Глядя на примеры и сам код, я могу видеть только простой способ получить результат от интегратора. А именно, похоже, что вы просто надавите интегратора вперед на какой-то фиксированный dt, получите значение функции в это время и повторите.
Моя проблема имеет довольно переменные временные шкалы, поэтому я хотел бы просто получить значения в любой момент времени, который необходимо оценить для достижения требуемых допусков. То есть, на раннем этапе все меняется медленно, поэтому шаги выходного времени могут быть большими. Но по мере того, как все становится интересным, шаги выходного времени должны быть меньше. Я на самом деле не хочу плотного вывода с равными интервалами, я просто хочу, чтобы временные шаги использовали адаптивная функция.
EDIT: плотный выход
Связанное с ним понятие (почти противоположное) - это "плотный выход", при котором сделанные шаги имеют значение, которое должен выполнять шаговый, но значения функции интерполируются (как правило, с точностью, сопоставимой с точностью шагателя), к чему-либо ты хочешь. Fortran лежащий в основе scipy.integrate.ode
, по- видимому способен к этому, но ode
не имеет интерфейса. odeint
, с другой стороны, основан на другом коде и, очевидно, делает плотный вывод. (Вы можете выводить каждый раз, когда вы вызываете свою правую сторону, чтобы видеть, когда это произойдет, и посмотрите, что это не имеет никакого отношения к времени вывода.)
Поэтому я все еще мог воспользоваться адаптивностью, пока я мог бы решить, на какие промежутки времени я хочу сделать раньше времени. К сожалению, для моей любимой системы я даже не знаю, каковы приблизительные временные рамки как функции времени, пока я не запустил интеграцию. Поэтому мне придется объединить идею сделать один шаг интегратора с этим понятием плотного вывода.
EDIT 2: Плотный выход снова
По-видимому, scipy 1.0.0 представил поддержку для плотного вывода через новый интерфейс. В частности, они рекомендуют отходить от scipy.integrate.odeint
и к scipy.integrate.solve_ivp
, который как ключевое слово dense_output
. Если установлено значение True
, возвращаемый объект имеет атрибут sol
который вы можете вызвать с помощью массива раз, который затем возвращает значения интегрированных функций в это время. Это еще не решает проблему для этого вопроса, но во многих случаях это полезно.