1

我想在 MATLAB 中求解一个微分方程

odeopts = odeset('MaxStep',dt);
[t,X] = ode113(@MyDiff,tSpan,X0,odeopts);

这里dt, MyDiff,tSpanX0在前面的代码中定义。问题是,离散化步骤dt非常小,而总模拟时间tSpan(end)非常大。此外,预计解会从某个时间 T 开始变成周期性的,周期为P。在这里,周期P是先验的,而时间T不是。

我想做的是在解决方案X变为周期性时自动停止 ode113-solver,以节省计算时间。我将不胜感激任何关于我应该如何做到这一点的想法。

直到现在我的想法:

  1. 第一个子问题是如何在发现周期性时停止 Matlab 求解器。MATLAB 包含通过事件函数停止 ode113 求解器的选项:

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

但是,必须MyEventFcn是当前时间步长的函数。似乎不可能通过这些信息来确定周期性。在我看来,唯一的方法似乎是使用一个全局参数,该参数包括之前所有时间的值,最多可达预期周期的两倍。但是,这对我来说似乎很不优雅和低效,我希望有更好的方法。tXXP

  1. 第二个问题是如何确定解X是周期性的 period P。目前我认为最好的方法是使用自相关函数的阈值xcorr(X),但我还不确定细节,所以这里的任何建议也会很有用。

编辑:我实现了一个解决方案,几乎遵循我之前的想法,使用全局变量来跟踪 X 值并使用 xcorr 来检测周期性。想了一会儿,这实际上似乎是最直接的方法。

4

0 回答 0