Simulink对于工科生来说,必不可少,它的应用大大缩减了我们的产品开发成本与开发周期,但是随着其不断地更新换代,对于算法的精确度越来越高,现实中我们对系统的要求也越来越高,难免会遇到仿真速度变慢,无法满足我们现实需要的情况。
下面我们结合MathWorks Support Team列举的可能导致仿真运行速度很慢的几种原因,进行一些总结与探讨:
1. 模型中有一个 MATLAB 函数块 :如下图所示,当存在 MATLAB Fcn 模块时,在每个采样时间都会调用 MATLAB 解释器。这会大大降低仿真速度。所以,应尽可能使用内置Simulink模块。私以为,这里也非那么绝对,现在的MATLAB版本功能越来越强大,计算精度更高,当遇到一些内部模块用简化的函数代替时,也可以缩短仿真时间。
2. MATLAB S函数(S-Function):在每个时间步长都会计算 S-Function。把MATLAB代码转为MEX文件,这样性能可以得到显著提高。此外,如果可能,应尽量使用内置模块建模。
3. 较小的步长或采样时间(或者彼此间不是倍数关系的采样时间):为了在仿真期间捕获重要事件,有时必须设置最够小的步长;反过来,步长太小会导致产生不必要的输出点,从而减慢仿真速度。变步长可以大大加快仿真速度,但同时也可能带来结果不准确的问题。
4. 最大步长太小:如果您更改了最大步长,请尝试用默认值(设置为自动)来运行仿真。
5. 您要求的精度可能过高:默认相对容差(0.1% 精度)通常就足够了。对于状态趋于零的模型,如果绝对容差参数太小,则仿真可能在近零状态值附近采用过多步长。有关容错度的详细信息,请参阅《使用 Simulink 手册》第 5-13 页。请记住,所有要输入的容差值都是绝对值。所以,默认相对容差值设置为 1e-3 时,意味着相对容差是 0.001,或者 0.1%(采用百分比形式)。
6. 时间尺度可能太长:减少时间间隔。
7. 您的模型中包含一个 Memory 模块:使用 Memory 模块会导致在每个步长上变阶求解器(ode15s 和 ode113)被重置回阶数 1。
8. Extras 库中有包含以上三项之一(即Graph Scope、Autoscaling Scopes、Spectrum analyzer等)的Mask模块:Unmask模块来看看它们是否调用 S-Function。
9. 使用了Scope模块:尽管它们的影响很可能不明显。Scope模块为方便观察波形,得到结果反馈,使用在所难免。因此,在允许的情况下,尽可能地少开示波器窗口,实时绘图模块,减少向workspace空间存储数据。
10. 代数环:模型包含有代数循环。在每一时间步都会反复计算代数循环,因此这会大大地降低仿真的速度。因此需要减少代数环,在无法减少的情况下就要拆环,拆环的方法有状态端口法,代数约束模块法,积分模块等等。从另外一个角度来讲,在Simulink环境中建模时,以s域的表达式进行建模时问题要少一些,增大误差限、取消过零检测等可以提高发展速度,减少警告信息。而z域的情况下要注意的问题会多一点。第一点是把模型中的代数环(Algebraic Loop)要消除掉;因为z域处理的数据都是一拍一拍按照采样周期处理的,所以如果一个数据既作为输入,同时又无延时地作为输出,就产生了数值处理的问题,造成仿真速度显著下降,处理的方法一般也不难,把反馈加一个延时环节就好了。
11. 不要在积分函数中引入白噪声模块:对于连续系统,使用 Extras/Sources 库中的带限白噪声模块。
12. 这可能是个刚性(stiff)问题,而您使用的是非刚性(non-stiff)求解器:尝试使用 ode15s。
13. 您可能碰到了连续过零,导致仿真逐渐“停滞”,时间很长(并且可能是无限长时间):要解决此问题,可以禁用过零检测。这可以通过在“Simulation 参数”(Simulation Parameters) 对话框的“高级”(Advanced) 窗格中选择“禁用过零检测”(Disable zero crossing detection) 选项来实现。在 R11 中,可通过转到模型的“仿真”(Simulation) ->“参数”(Parameters) ->“诊断”(Diagnostics) 部分来实现此目的。有关过零检测的详细信息,请参阅《使用 Simulink 手册》第 5-44 页。
14. 您也可能想要尝试设置“模型参数配置”(Model Parameter Configuration) 对话框以便您的 Simulink 模型使用“内联参数”(Inline Parameters) 选项:选择此选项可使 Simulink 能够将指定参数视为常量,从而加快仿真速度。请参阅《使用 Simulink 手册》第 5-30 页了解更多信息。
15. Simulink Accelerator 仿真模式可以加快仿真时间。Profiler可以分析模型性能瓶颈来提高仿真速度。
可以改变仿真的模式。在老版本Simulink中,这个选择很少,但是新版本有了Normal、Accelerator和Rapid Accelerator、HIL等模式。硬件在回路HIL显然速度最快,但是好多时候并不适用,因为首先要有相应的硬件,其次是仿真对象要支持代码生成。因为Simulink用的是一种解释性的语言,normal模式就可以理解为Matlab解释一句,操作系统执行一句,速度自然不会太快;Accelerator则是把一部分共享模块编译为库文件,例如dll进行调用,相当于混合模式,既有解释-执行,也有直接调用,速度;Rapid Accelerator则是把整个模型编译为操作系统下独立运行的程序,少了Simulink解释给操作系统的工作,自然运行速度快,代价则是需要一定的时间来编译模型;这种模式对PC的硬件配置要求是相对比较高的,内存少于3GB时容易出错。
16. 如果模型非常复杂(涉及大量模型引用和子系统)且包含大量数据记录,仿真速度也会受到影响:禁用数据记录功能也能提高仿真速度。
我们先来看如何保存数据:
(1)在搜scope串口的工具栏,点击 Parameters 按钮 。
(2)点击 Logging 选项卡,然后选中 Log data to workspace 复选框。在 (3)Variable name 框中,输入用于保存数据的变量名称或使用默认名称 “ScopeData”。从 Save format 列表中选择 “Dataset”。点击 OK。可以将 Save format 设置为 “Dataset” 以外的格式(例如 “Array”)。运行仿真即可。
因此,将Log data to workspace 复选框取消即可。不同的版本可能设置不太一样,但都是一个意思。例如这里2014的版本为Save data to workspace。
17.系统的本身是离散的还是连续的。离散系统的运行速度要快于连续系统。对系统离散化,方法为在你的gui模块里选择discretize electric model,采样时间越大仿真越快,当然采样时间的设定要与你对系统精确性相配合,因为采样时间是与准确性成反比的。
18.除此之外,仿真速度受系统(即处理器、RAM、正在发生的交换量等)的制约。所以,尽可能让你的计算机性能满足仿真的需要,这就是“磨刀不误砍柴工”,好的工具能让你的工作得心应手。当你使用一台计算机仿真时,就要着重考虑它的图形引擎速度、CPU 速度、内存量等因素,其中性能与 CPU 速度成正比。如果在仿真过程中存储的变量大于系统上的 RAM 量,则性能会很差。解决办法是运行较小的仿真或增加内存。
根据以上分析,其中常遇到的影响仿真速度的主要就是步长,离散或连续系统,计算机的性能等,其他因素影响程度没有那么大,因此在构建仿真系统时 ,应重点注意1,3,5,6,17,18等的影响,遇到其他问题可参考另外的选项解决。
‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧ END ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧