首发于 MATLAB
加速吧!Simulink君!(一)

加速吧!Simulink君!(一)

如果名字太二请各位谅解,因为我是不会改的。

Simulink在仿真过程中,大家往往都会遇到仿真速度过慢的问题。由于此类问题发生的砸鼠标,键盘,甚至显示器的事件也是屡见不鲜。为了防止上述事件的持续发生,我们作为Modeler 有什么可以做的吗? 当遇到Simulation很慢的时候往往需要具体模型具体分析,从而因地制宜。下面我们来介绍一些经验,也欢迎大家一起讨论。

首先,建议你换台电脑试试。

其次,我们来介绍一下连续系统(Continuous Model)在求解器上有哪些加速的方法。假设我们的用的是一个连续系统,那么在Solver的选择上面我们有两个选择:

1. Variable-step

2. Fixed-step

要加速也就要了解这两个solver之间的区别, 本质上来说就是步长的区别,一个会变,一个不变。

先讲讲variable-step。

variable-step 在求解过程中会根据用户的设定来动态的决定步长(主要是根据每一步的数值解是否满足tolerance,tolerance的选择属于个人“喜好”)。variable-step 在求解过程中会分为major time step 和 minor time step, 每一个major time step由多个minor time step组成,如图。

(画的不错吧 )

那么Major time step受到max step size的限制,而minor time step 的大小和数目是由min step size 控制。 默认的最大步长是 (stop_time - start_time)/ 50, 默认最小步长是无限小,也就是说如果解不满足tolerance的要求的话可以算无限步。

那么如何在不丢失精准度的前提先设置最大步长来提高模拟的速度呢?我们可以在max step size上下文章。大家可以试试下面的这个trick:

然后取消对于输出数组的大小限制:

输出时间,然后再模拟后画出时间的图像来观察步长:

semilogy(tout(1:end-1),diff(tout)); % aeroblk_HL20 for 5 sec simulation

在图中我们可以看到,大部分时间步长被限制在了0.01秒,那么我可以尝试将max step size提高到1 秒。

这样我们可以看到step size也提高到了0.03。

这里我们还可以进一步了解模型需要的最小步长:

min(diff(tout))

根据最小步长来分析系统在什么状态下是需要小布长来进行计算,从而也可以调整系统的参数或者模块的初始状态来加快运算。

接下来说说fixed-step solve。

一句话:绝大多数情况下,variable-step要比fixed-step要快。(因为步长可长可短比较合理)

那么除了调整time step,对于solver的选择也是一个很让人困扰的问题。

15b之后, Simulink 提供了 auto solver selection, 会跟据model 的属性自动选择solver,根据doc里写的,heuristic是如下的table :

这个图是几个意思呢,我来解释一下,这图就是说, continuous variable-step 没有simScape 的model 先用ode45, 解不出来再用ode15s, 有simScape(simScape不使用local solver)时,使用ode23t。Fixed-step没有simScape(simScape不使用local solver)的话用ode3,有的话用ode14x。

那么我在向各位读者提出几个问题:

simScape的local solver在哪里设置?设置local solver和选用global solver的区别是什么?求选择local solver后global solver的心理阴影面积。

但然除了对time step和model进行调整外,还有两大法宝来加速模拟:

Run Simulation in Accelerator mode

Run Parallel Simulations

大家更想听听哪一个呢?

发布于 2016-05-24 09:47

文章被以下专栏收录