Если вы не зададите опцию t_eval
, структура решения содержит в полях .t
и .y
внутренние точки шага. Если вы передадите опцию dense_output=True
, то структура решения содержит в .sol
кусочно-полиномиальную функцию интерполяции, которую вы можете использовать для получения решения в любое другое время или по списку раз.
Если вы хотите Для большего контроля вам, вероятно, потребуется напрямую использовать базовые классы степпера для метода интеграции.
Если вы хотите переключать модели y'=f_1(y)
и y'=f_2(y)
вдоль некоторой поверхности g(y)=0
, тогда вы можете в принципе используйте
def odefun(t,y):
return f_1(y) if g(y)>0 else f_2(y);
Но решатель очень плохо на это отреагирует, возможно, даже выдаст предупреждения об опасно малом размере шага при пересечении фазовых границ. Лучше использовать переменную переключения, если модели достаточно похожи, или просто переключить функции и использовать механизм событий, чтобы найти точное время изменения фазы.
def event(t,y): x=v.dot(y); return max(x[0]-5,x[1])
event.terminal=True
event.direction = -1 if event(t0,y0)>0 else 1
, а затем внутри l oop после каждого события поменяйте знак направления и выберите правильную функцию
event.direction *=-1
odefun = f_1 if event.direction<0 else f_2
Затем добавьте код в l oop, чтобы добавить последнее решение к ранее собранным данным решения, см. { ссылка } для возможного решения.