如何测试ODE集成是否达到平衡



我正在为这个项目使用Matlab。我介绍了对ode45求解器的一些修改。我有时使用多达64个分量,所有分量都在[0,1]区间内,并且这些分量的总和为1。每隔一段时间,我会停止集成过程,以便快速检查是否需要进一步的集成,我正在寻找一些聪明的方法来有效地解决这个问题。我发现了四个病例,我应该能够在检查中检测到每一个:

1:系统已达到平衡,所有组成部分都没有变化。

2:三个或三个以上的组件以周期性的方式剧烈波动。

3:一个或两个分量变化非常快,振幅低,频率短。

4:以上都不是真的,必须继续整合。

给出一个想法:我发现将ode45解算器生成的最后~5k个状态用于函数是一种很好的做法。

简言之:在ODE积分过程中,如何检测平衡或非变化周期模式?

只有当模型函数计算的时间导数都为0时,才会出现稳态。像你描述的周期解相当于一个极限循环,即围绕不稳定平衡的振荡。我不知道是否有检测这些周期的方法。我可能会更新我的答案以提供更多信息。也许一个想法是看看信号的最后部分是否与自身相关(具有与周期周期相对应的延迟(。

注意,如果你只对稳态感兴趣,那么像ode15s这样的隐式方法可能更有效,因为它可以";消散";所有的瞬态波动和使用比显式方法大得多的时间步长,显式方法必须准确地求解瞬态以避免爆炸。然而,它们也可能耗散小振幅极限循环。一个实用的解决方案是稍微扰动稳态值,看看显式积分是否向未扰动的稳态收敛。

我经常做的事情是查看每一步的解决方案和最后一步的方案之间的差异的范数。如果这个差异对于足够高的步骤数来说很小,那么就达到了稳态。您还可以观察范数$||frac{dy}{dt}||$如何收敛到零。

这个问题实际上更适合我认为的计算科学论坛。

相关内容

最新更新