我想在MATLAB中求解微分方程
odeopts = odeset('MaxStep',dt);
[t,X] = ode113(@MyDiff,tSpan,X0,odeopts);
此处dt
,MyDiff
,tSpan
和X0
在代码中已定义。问题是,离散步骤dt
非常小,而总模拟时间tSpan(end)
非常大。此外,预期该解决方案将从某个时间段T开始具有周期P
。此处,句点P
是先验已知的,而时间T
则不是。
我想要做的是在解X
成为周期性时自动停止ode113-solver,以节省计算时间。我很感激有关如何做到这一点的任何想法。
我的想法直到现在:
第一个子问题是如何在发现周期时停止Matlab求解器。 MATLAB包含了通过事件函数停止ode113-solver的选项:
odeopts = odeset('MaxStep',dt,'Events',MyEventFcn);
但是,MyEventFcn
必须是当前时间步t
和X
的函数。通过这些信息确定周期性似乎是不可能的。在我看来,唯一的方法就是使用一个全局参数,该参数在之前的所有时间都包含X
值,最多可达预期期间P
的两倍。然而,这对我来说似乎相当不优雅和低效,我希望有更好的方法。
X
是周期性的P
。目前我认为最好的方法是使用自相关函数的阈值xcorr(X)
,但我还不确定细节,所以这里的任何建议也都有用。 编辑:我实现了一个解决方案,几乎遵循我之前的想法,使用全局变量来跟踪X值并使用xcorr来检测周期性。经过一段时间的思考,这实际上似乎是最简单的方法。