在 ode15s 中调整时间步长

Adjust time step in ode15s

我正在使用 ode15s 函数在 MATLAB 中求解 DAE 系统,在仿真中的某个时刻,求解器无法达到必要的容差,因此执行终止。如果我将最大步长减小到一个小值 (~1e-5),程序能够继续并到达指定的端点。

基于减少时间步长允许程序继续这一事实,我怀疑 ode15s 脚本在某个时间点采取了太大的时间步长并且无法从中恢复。但是,保持这个小的最大步长意味着我有数千个不必要的数据点,这些数据点会减慢模拟速度并占用 space.

首先,ode15s是否可以调整最大步长?到目前为止我发现的一切都表明这是不可能的,但我可能会遗漏一些东西。

如果这不可能,我可以通过等到函数超过关键时间(即模拟在没有时间步长约束的情况下崩溃的时间)来近似行为,停止它,然后重新启动没有时间步长约束。但是,我并不知道临界时间是先验的,而且在最后的模拟中(现在是高度简化的),我会有几十个不同位置的初始条件,所以我无法手动调整所有的在合理的时间内多次。我将如何以自动方式找到关键时间,以便在它通过后调整我的步长?

短一:最大步长定义一次,可以在使用标准 MATLAB 求解器的单个计算过程中更改。

长一点:我很确定动态更改最大步长确实很棘手而且没有必要。步长可以在最大值和最小值之间改变,这就是我们从可变步长求解器中得到的全部。 您可以尝试更改最小步长值 - 这种方法的想法是在低收敛的情况下自动调整步长。This 页面可以提供一些有关选择和调整求解器的有用信息。

将问题拆分为子问题以减少时间和改变步骤是可能的,但这带来的麻烦多于收益。另外,我想 "critical point" 可以在不同初始条件下在时间线上移动。

终极建议分为两部分:

  1. 尝试按照 Matlab 文档中的说明调整求解器。 (我建议为求解器 Jacobian 方法尝试稀疏分析选项)。
  2. 使用 parallel computing 或更好的硬件(完整型号)获得更多动力。

关于调整求解器的更有用的 link