Title

跪问:仿真速度太慢了!!有什么办法可以加快simulink的仿真速度?

3424次浏览

问题描述

头像

李秋月·0.00

2016-06-26提问

请您登录后进行评论!

分数   时间  

全部答案 2

1
已采纳

已采纳

有几种原因可能导致仿真运行速度很慢:
       1、模型中有一个MATLAB函数块:当存在MATLAB Fcn模块时,在每个采样时间都会调用MATLAB解释器。这会大大降低仿真速度。所以,应尽可能使用内置Simulink模块。
       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模块:尽管它们的影响很可能不明显。
       10、代数环:为了解代数环,会在每个步长上都执行迭代计算。因此,它大大降低了速度。有关代数环的详细信息,请参阅《使用Simulink手册》第3-18页。
      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可以分析模型性能瓶颈来提高仿真速度。<http://www.mathworks.com/help/simulink/ug/what-is-acceleration.html>
       16、如果模型非常复杂(涉及大量模型引用和子系统)且包含大量数据记录,仿真速度也会受到影响:禁用数据记录功能也能提高仿真速度。

       除此之外,仿真速度受系统(即处理器、RAM、正在发生的交换量等)的制约。


       关于仿真速度还有几点需要考虑:图形引擎速度、CPU速度、内存量。为此,下面是几点提示:
       - 如果在仿真过程中有打开的scope或其他可视化输出设备,这些都会降低性能
       - 性能与CPU速度成正比
       - 如果在仿真过程中存储的变量大于系统上的RAM量,则性能会很差。解决办法是运行较小的仿真或增加内存。
       其它建议方法:
       1、使用ode23解法器(大家可能都知道)但效果很有限。
       2、对系统离散化,方法为在你的gui模块里选择discretize electric model,采样时间越大仿真越快,当然采样时间的设定要与系统精确性相配合,因为采样时间是与准确性成反比的;
       3、在仿真的过程中尽量少开启示波器窗口,示波器参数中的点数限制最好关闭;
       4、如果你的系统要从一个特定的状态开始仿真,在仿真参数设置是,最好在i/o选项中设置起始的状态矢量;
       5、开启加速器,(方法在菜单仿真这一项中可以设置),这个也能大大加快仿真速度。
       如果慢的不正常或半途仿真停止,就要考虑代数环了,这个就要在形成的环路上加memory来解决,一般存在反馈的复杂系统都容易出现这种情况。

评论 (0)条评论
头像555

  123·320.00

2016-06-26回答

3
已采纳

已采纳

可以按照下述办法逐步修改并提高仿真速度。
      首先是模型的搭建问题。在Simulink环境中建模时,以s域的表达式进行建模时问题要少一些,增大误差限值、取消过零检测等可以提高发展速度,减少警告信息。而z域的情况下要注意的问题会多一点。第一点是把模型中的代数环(Algebraic Loop)要消除掉;因为z域处理的数据都是一拍一拍按照采样周期处理的,所以如果一个数据既作为输入,同时又无延时地作为输出,就产生了数值处理的问题,造成仿真速度显著下降,处理的方法一般也不难,把反馈加一个延时环节就好了。另外就是仿真步长的问题,在能保证仿真精度的情况下,尽量使用大的步长可以显著提高仿真速度;这个最大的仿真步长自然可以按照香农采样定律来确定,但是一般情况下选择仿真步长为4-10倍的最大采样频率是足够了。
 
      其次是可以改变仿真的模式。新版本Simulink有Normal、Accelerator和Rapid Accelerator、HIL等模式。硬件在回路HIL显然速度最快,但是好多时候并不适用,因为首先要有相应的硬件,其次是仿真对象要支持代码生成。因为Simulink用的是一种解释性的语言,normal模式就可以理解为Matlab解释一句,操作系统执行一句,速度自然不会太快;Accelerator则是把一部分共享模块编译为库文件,例如dll进行调用,相当于混合模式,既有解释-执行,也有直接调用;Rapid Accelerator则是把整个模型编译为操作系统下独立运行的程序,少了Simulink解释给操作系统的工作,自然运行速度快,代价则是需要一定的时间来编译模型;这种模式对PC的硬件配置要求是相对比较高的,内存少于3GB时容易出错。
 
      再者就是有一些模块会显著拖慢仿真速度,它们相当于“木桶理论”中的那块“短板”了。例如Simulink中的X-Y图这样实时刷新绘图的模块。如果模式中有这个模块,则仿真的时候它会缓慢地刷新X-Y图,仿真速度肯定快不了。如果有别的方法替代则可以加快仿真速度,例如先把数据保存到工作空间里,等仿真结束之后再绘制X-Y图等。一些非线性的模块,例如一个非线性的MOSFET模型,自然也比理想开关所需要的仿真时间长。
 
       第四种方法是并行执行和分布式执行,相当于多个人一起完成一项工作,前提是要有并行执行的许可和分布式执行的许可。并行执行就是在多核CPU的计算机上,打开多个Matlab,然后自动或者手动分配进行并行处理;分布式执行则是多台计算机使用高速网络互联之后分别处理。这种仿真方法其速度提高非常显著,特别是在处理大量迭代计算的时候,不过不是一般的开发者所能具备的。
 
      此外,从2012b以后的版本开始,Simulink自带了Simulink Performance Advisor工具,可以帮助我们发现影响仿真速度的瓶颈,并提出相应的建议。不过它无法理解我们搭建模型的意图是神马,所以还需要我们在搭建模式的时候就按照前面几条建议进行一些必要的修改。

评论 (0)条评论
头像555

  王丹·0.00

2016-06-26回答

2 条记录 1/1 页
Document