Решение дифференциального уравнения до периодичности

Я хотел бы решить дифференциальное уравнение в 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 стал периодическим, чтобы сэкономить вычислительное время. Буду признателен за любые мысли о том, как я должен это сделать.

Мои мысли до сих пор:

  1. Первая подзадача - как остановить решатель Matlab при обнаружении периодичности. MATLAB включил опцию остановки решателя ode113 с помощью функции события:

    odeopts = odeset('MaxStep',dt,'Events',MyEventFcn);

Тем не мение, MyEventFcn должен быть функцией t а также X на текущем временном шаге. По этой информации невозможно определить периодичность. Мне кажется, единственный способ использовать глобальный параметр, который включает в себя X значения за весь предыдущий раз до двух раз ожидаемого периода P, Тем не менее, это кажется мне довольно неэффективным и неэффективным, и я надеялся, что есть лучший путь.

  1. Вторая проблема заключается в том, как определить, что решение X является периодическим с периодом P, Сейчас я думаю, что лучше всего использовать порог для функции автокорреляции, xcorr(X), но я еще не уверен в деталях, поэтому любые предложения здесь также будут полезны.

Изменить: я реализовал решение, в значительной степени следуя моим предыдущим мыслям, используя глобальную переменную для отслеживания значений X и используя xcorr для определения периодичности. Подумав некоторое время, это на самом деле кажется самым простым способом сделать это.

0 ответов

Другие вопросы по тегам