Решение дифференциального уравнения до периодичности
Я хотел бы решить дифференциальное уравнение в MATLAB
odeopts = odeset('MaxStep',dt);
[t,X] = ode113(@MyDiff,tSpan,X0,odeopts);
Вот dt
, MyDiff
, tSpan
а также X0
определены ранее в коде. Проблема в том, что шаг дискретизации dt
очень мало, а общее время моделирования tSpan(end)
очень большой Кроме того, ожидается, что решение станет периодическим с некоторого времени T с периодом P
, Здесь период P
известно априори, а время T
не является.
Что я хотел бы сделать, это автоматически остановить решатель ode113, когда решение X
стал периодическим, чтобы сэкономить вычислительное время. Буду признателен за любые мысли о том, как я должен это сделать.
Мои мысли до сих пор:
Первая подзадача - как остановить решатель Matlab при обнаружении периодичности. MATLAB включил опцию остановки решателя ode113 с помощью функции события:
odeopts = odeset('MaxStep',dt,'Events',MyEventFcn);
Тем не мение, MyEventFcn
должен быть функцией t
а также X
на текущем временном шаге. По этой информации невозможно определить периодичность. Мне кажется, единственный способ использовать глобальный параметр, который включает в себя X
значения за весь предыдущий раз до двух раз ожидаемого периода P
, Тем не менее, это кажется мне довольно неэффективным и неэффективным, и я надеялся, что есть лучший путь.
- Вторая проблема заключается в том, как определить, что решение
X
является периодическим с периодомP
, Сейчас я думаю, что лучше всего использовать порог для функции автокорреляции,xcorr(X)
, но я еще не уверен в деталях, поэтому любые предложения здесь также будут полезны.
Изменить: я реализовал решение, в значительной степени следуя моим предыдущим мыслям, используя глобальную переменную для отслеживания значений X и используя xcorr для определения периодичности. Подумав некоторое время, это на самом деле кажется самым простым способом сделать это.