Simulink仿真入门到精通(五) Simulink模型的仿真
5.1 模型的配置仿真
由各种模块所构建的可视化逻辑连接,只是模型的外在表现,模型仿真的核心驱动器是被称作解算器(Solver)的组件,相当于Simulink仿真过程的心脏,驱动着模型仿真,它在每一个采样时间点更新模型中所有的状态和信号变量,并计算下一步的步长。除此之外,模型还具有一个参数配置集合(Configuration Parameter Set),它提供了一系列的参数,用户通过这些参数可以选择模型的解算方法,配置硬件目标,优化配置,设置异常响应及诊断,以及配置代码声称等。参数设置集合相当于Simulink软件各个环节的开关控制器,在细节处影响着模型的行为和表现方式。模型的可视化建模方法,解算器及参数配置结合共同构成一个“有血有肉”的Simulink模型。
5.1.1 解算器
分类 | 步长可变否 | 离散连续性 | 显式隐式 | 解算步长 | 阶数 |
1 | 固定步长 | 离散 | 显式 | 单步 | 单阶 |
2 | 可变步长 | 连续 | 隐式 | 多步 | 多阶 |
步长可变否
步长是前后两个相邻采样点之间的时间间隔。
变步长:当模块状态值变化很快是减小步长,反之增大步长,可以根据误差容限调整步长大小,使整个仿真过程中需要计算的采样点数减少,从而使得仿真在较短时间内结束。
二者没有绝对的优劣,在不同的应用场合酌情采用,但在生成嵌入式代码并下载到硬件中去执行时,解算器必须采用固定步长,因为实时硬件的时钟源都是提供稳定频率的时钟源,无法提供变步长解算器的采样时刻计算方式。
离散连续性
这两种解算器都依赖于模型中的具有连续/离散状态变量的模块来工作。具有离散状态变量的模块负责在离散解算器作用下的每个采样时间点计算离散状态变量的值,具有连续状态变量的模块在连续解算器作用下使用连续数值积分方法求解连续状态变量的值。
不具有连续状态模块的模型如果使用连续解算器仿真时,Simulink自动切换到离散解算器进行计算;具有连续状态模块的模型,如果选择离散解算器进行仿真,会发生错误。
显式隐式
这里所说的显式和隐式是指求解方程式是显式或隐式的。
通常,隐式解算器用于求解刚性系统,显式解算器用于求解非刚性系统。
所谓刚性系统,是指在时间间隔很小的情况下才会稳定,时间间隔稍大一点就不再稳定的系统。
相对于显式解算器,隐式解算器对于震荡行为的求解具有更高的稳定性;但是,由于解算过程中产生Jacobian矩阵,使用牛顿法在每一个采样时刻计算代数方程,所以很费时间。
解算步长
单步解算器在计算y(t)时只需要使用y(t-1),连续系统使用y(t-1),y(t-2),…,y(t-m)等多值来计算当前输出y(t)。
阶数
隐式变步长解算器ode15s可以使用1阶到5阶方程,显式变步长解算器oed113可以使用1阶到13阶方程。
总结
变步长
固定步长
方法特点
解算器 | 应用场合 |
ode45(显式) |
推荐用于模型的首次仿真,具有最好的普适性以及不错的精度。 如果发现仿真速度极慢,可改为ode15s。 |
ode23(显式) | 在误差要求不是特别严格或模型中存在轻微刚性时比ode45具有更高的效率。 |
ode113(显式) | 对于具有严格误差容限和计算密集型的问题,此方法比oed45更合适更高效。 |
ode15s(隐式) | 基于数值差分方程(NDFs)求解,产生雅可比矩阵,通常从阶数为2开始尝试。 |
ode23s(隐式) | 一步解算器,在粗差问题上比ode15s更高效。 |
ode23t(隐式) | 适应于无数值阻尼的中性刚度模型求解。 |
ode23tb(隐式) | 跟ode23s类似,在粗差刚性模型中更高效。 |
5.1.2 参数的配置
解算器的参数设置
变步长解算器参数
参数名 | 作用说明 |
Max step size | 解算器可以采用的最大步长 |
Min step size | 解算器可以采用的最小步长 |
Initial step size | 解算器第一步采用的步长 |
Relative tolerance | 可接受的最大相对误差容限 |
Absolute tolerance | 可接受的最大绝对误差容限 |
Shape preservation | 开启时可使用微分信息提升积分的精确度 |
Number of consecutive min step | 当步长超出了最大步长或者小于最小步长时称为步长违例。此选项用于设置连续出现步长违例的步数,一旦超过这个步数就报警或报错。默认为1。 |
参数名 | 作用说明 |
zero-crossing control |
使能过零检测功能,对大部分模型而言,可以提升仿真速度,因为精确定位过零点,便可以增大变步长解算器的步长。 UseLocalSettings表示根据模块中是否设置开启过零检测功能来决定,EnableAll和DisableAll则表示全体开启或全体关闭 |
Time telerance | 时间容限,规定过零检测要在容限相关的时间范围内检测连续性,用于控制过零检测发生频度 |
Algorithm | 指定一种过零检测的算法,分为自适应算法和非自适应算法 |
固定步长解算器参数
参数名 | 作用说明 |
Fixed-step size | 固定步长 |
参数名(仅ode14x使用) | 作用说明 |
Solver Jacobian method | 提供雅可比算法的4个选项 |
Extrapolation order | 设置外插阶数,可设置1~4 |
Number of Newton's iterations | 设置牛顿迭代算法的迭代次数 |
方法:用于判断所选的变步长解算器的仿真结果是否可以接受
将Relative tolerance由1e-3改为1e-4再次仿真,如果和之前的结果没有明显差异,应当对当前的解算方法和仿真结果抱有信心。
数据导入/导出的设置
导入:结合In模块进行
导出:
标签名 | 作用说明 |
Time | 保存模型的仿真时间采样 |
States | 保存模型的状态量 |
Output | 保存模型的输出量 |
Final states | 保存模型仿真最后一个采样时刻的状态量 |
Format | 保存的时间、状态和输出量存储到工作空间时的数据格式选择 |
Limit data points to last | 勾选后只保存最新N个采样点的数据 |
Decimation | 每间隔多少个采样点保存一组数据 |
模型某次仿真后保存的Final states参数,可以作为下一次仿真的Initial states参数来使用,从而将两次分开的仿真首尾相接。
示例:
5.2 模型仿真数据记录
5.2.1 信号日志
右击模型中希望记录过程的信号线,打开属性对话框,勾选Log signal data。设置之后的信号上出现了一个浅蓝色探针符号,表示此信号的数据记录功能已开。
仿真后会在工作空间中得到名为logsout的变量。
>> logsout logsout = Simulink.SimulationData.Dataset 'logsout' with 1 element Name BlockPath
____ _____________
1 [1x1 Signal] '' mymodel/Clock - Use braces { } to access, modify, or add elements using index.
5.2.2 Simulinnk Data Inspector
Inspector需要与信号日志功能联合使用,不仅可以一次记录多个信号数据,还可以记录多次仿真的数据过程。
选中信号线,单击Log/Unlog Selected Signals也可以增设/删除信号日志功能点。
Inspect用于记录信号,Compare用于比较信号的差别。
勾选Overwrite可使仿真数据被覆盖。
5.3 仿真过程的调试
5.3.1 Debugger的启动
Simulink→Debug→Debug Model即可启动。
Debug模式将仿真过程变得可控,单步或多步执行,或者全速执行到断点停下来。过程中每个采样时刻所执行的模块及方法名都可以观察到。
在Sorted List界面可以观察到模块的执行顺序。
5.3.2 Debugger的单步方法
- step into the current method:单步进入当前方法的子方法。
- step over the current method:单步跨过当前方法。
- step out of the current method:单步跳出当前子方法。
- go to first method at start of next time step:运行至下一个采样时间的首个方法。
- go to the next block method:运行至下一个模块的方法。
- start/continue the debug:开始/继续调试。
- pause the debug:暂停调试。
- stop the debug:停止调试。
当单步执行某个模块的某个方法涉及数据的输入输出或状态量的更新计算时,可以将其显示出来。
%----------------------------------------------------------------%
[TM = 5.5 ] chap05_01_15.Outputs.Major
(sldebug @18):
probe: Data of 0:3 Scope block 'chap05_01_15/Scope':
U1 = [5.08980000000000032] (sldebug @18):
5.3.3 Debugger的断点设置方法
无条件断点
模型在调试模式下运行后,所执行的各种子方法通过标签也罗列出来。模型名后有一列复选框控件,用来设置无条件断点。
直接勾选对应方法就设定了断点,每次运行到这个方法都会停止。
initialzationPhase和terminationPhase分别在模型初始化和结束阶段执行一次,simulationPhase及内部的各个子方法在每个采样时间都会执行一次。
条件断点
使用BreakPoints控件来除法条件断点。
- zero crossings:仿真过程中遇到非采样过零检测时会停止。
- Step size limited by state:仿真过程中如果采用变步长解算器并且遇到一个状态会限制步长大小时会停止。
- Solver Error:当解算器遇到可以恢复的错误时会停止。
- NaN values:仿真过程中出现无穷大数或者溢出时会停止。
- Break at time:在仿真达到设定时间时会停止。
通过Simulink Debugger,可以更细致地掌握模型运行的每一个步骤,从而精确找到问题发生的位置、时间以及问题出现之前模型中信号与模块输入输出的变化趋势。
5.4 仿真的加速
仿真速度慢的可能原因:
- 模型中包含Interpreted MATLAB Function模块,这个模块在每一个步长内都会调用MATLAB解释器,可更换为Simulink内建模块。
- 模型中包含了M语言编写的S函数模块,可采用C mex S函数或者由基本模块搭建的子系统来代替。
- 最大步长或误差容限太小。
- 模型中存在Memory模块。
- 模型中使用Random Number block作为Integrator的输入,可使用Band-Limited White Noise代替。
- 模型中包含可以解算的代数环,应解除代数环。
- 模型中存在不是其他任何一个采样速率整数倍的采样速率,应采用成倍数的采样时间组合,可以降低采样数,缩短计算时间。
Simulink仿真入门到精通(五) Simulink模型的仿真的更多相关文章
- Simulink仿真入门到精通(十九) 总结回顾&自我练习
从2019年12月27到2020年2月12日,学习了Simulink仿真及代码生成技术入门到精通,历时17天. 学习的比较粗糙,有一些地方还没理解透彻,全书梳理总结: Simulink的基础模块已基本 ...
- Simulink仿真入门到精通(八) M语言对Simulink模型的自动化操作及配置
8.1 M语言控制模型的仿真 M语言与Simulink结合的方式: 在Simulink模型或模块中使用回调函数 在M语言中调用与模型相关的命令,控制模型的建立,设置模块的属性,增删信号线,以及运行模型 ...
- Simulink仿真入门到精通(十八) TLC语言
TLC(Target Language Compiler)是一种为转换为目标语言而存在的额解释性语言,其目的就是将模型中编译出来的rtw文件转换为目标代码(C/C++等).与M语言类似,既可以写成脚本 ...
- Simulink仿真入门到精通(十七) Simulink代码生成技术详解
17.1 基于模型的设计 基于模型设计是一种流程,较之传统软件开发流程而言,使开发者能够更快捷.更高效地进行开发.适用范围包括汽车电子信号处理.控制系统.通信行业和半导体行业. V字模型开发流程整体描 ...
- Simulink仿真入门到精通(十一) 模块的封装
当用户编写了自定义的S函数或者使用Simulink标准库中的模块搭建子系统后,可以通过封装为其设计显示外观,追加参数对话框. 封装是构建一个以对话框为接口的交互界面的过程,它将复杂的模块逻辑关系隐藏起 ...
- Simulink仿真入门到精通(十) S函数
10.1 S函数概述 S函数也称为Simulink中的系统函数,是用来描述模块的Simulink宏函数,支持M.C等多种语言.当Simulink默认的模块不能满足用户的需求时,用户可以通过S函数自己打 ...
- Simulink仿真入门到精通(七) Simulink的回调函数
7.1 什么是回调函数 Callback functions(回调函数)是因某种操作而除法对其调用的函数,如按下按钮或双击操作等. 常用的Simulink回调函数可应用在以下场合: 打开Simulin ...
- Simulink仿真入门到精通(二) Simulink模块
2.1 Simulink模块的组成要素 用户构建系统模型时无需直接面对成千上万行的代码,而是通过模块化图形界面以模块化的方式构建,能够使理解变得容易,让大脑减负.通过层次化模块分布将系统功能模块化,而 ...
- Simulink仿真入门到精通(十四) Simulink自定义环境
14.1 Simulink环境自定义功能 sl_sustomization.m函数是Simulink提供给用户使用MATLAB语言自定义Simulink标准人机界面的函数机制.若sl_sustomiz ...
随机推荐
- RHCE考试(Linux7)
博主本人平和谦逊,热爱学习,读者阅读过程中发现错误的地方,请帮忙指出,感激不尽 一.环境模拟 * server0.example.com :172.25.0.11 * desktop0.example ...
- Java子类和父类的初始化执行顺序
要明白子类和父类的初始化执行顺序,只需要知晓以下三点,就不会再弄错了. 1.创建子类对象时,子类和父类的静态块和构造方法的执行顺序为:父类静态块->子类静态块->父类构造器->子类构 ...
- Java 9 新特性 – 内部类的方块操作符
方块操作符 ( <> ) 在 Java 7 中就引入了,目的是为了使代码更可读. 但是呢,这个操作符一直不能在匿名内部类中使用 Java 9 修正了这个问题,就是可以在匿名内部类中使用方块 ...
- Android开发之《RXJava的简单实现》
import android.util.Log; import rx.Observable; import rx.Subscriber; import rx.functions.Action1; pu ...
- hadoop创建两大错误:Bad connection to FS. command aborted. exception和Shutting down NameNode at hadoop
1.问题目录表: Error代码 failed on connection exception: java.net.ConnectException: Connection refused 3. ...
- IP地址结构分类(包括主机号和网络好计算)
IP地址:互联网上的每个接口的唯一标识. 长度:32bit. 五类不同的互联网地址格式: 各类IP地址范围: 点分十进制:32位的地址通常写成四个十进制数,其中每个整数对应一个字节. 主机号和网络的计 ...
- Keepalived+Haproxy搭建高可用负载均衡
Keepalived 简单的是一个路由的软件用C写的这个项目的主要目标是提供简单而强大的设施的负载均衡和高可用性对Linux系统和基于Linux的基础设施.负载均衡架构依赖于众所周知的和广泛使用的Li ...
- 玩转UITableView
UITableView这个iOS开发中永远绕不开的UIView,那么就不可避免的要在多个页面多种场景下反复摩擦UITableView,就算是刚跳进火坑不久的iOS Developer也知道实现UITa ...
- fastcgi_param详解
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;#脚本文件请求的路径 fastcgi_param QUERY_STRI ...
- Java程序监控---Metrics
概念 Metrics是一个给JAVA服务的各项指标提供度量工具的包,在JAVA代码中嵌入Metrics代码,可以方便的对业务代码的各个指标进行监控 目前最为流行的 metrics 库是来自 Coda ...