本系列教程是根据孙忠潇编著的<<Simulink仿真及代码生成技术入门到精通>>学习笔记。
目录
Simulink仿真入门到精通(一) Simulink界面介绍
Simulink仿真入门到精通(二) Simulink模块
Simulink仿真入门到精通(三) Simulink信号
Simulink仿真入门到精通(四) Simulink子系统
Simulink仿真入门到精通(五) Simulink模型的仿真
Simulink仿真入门到精通(六) Simulink模型保存为图片
Simulink仿真入门到精通(七) Simulink的回调函数
Simulink仿真入门到精通(八) M语言对Simulink模型的自动化操作及配置
Simulink仿真入门到精通(九) Simulink的流控制
Simulink仿真入门到精通(十) S函数
Simulink仿真入门到精通(十一) 模块的封装
Simulink仿真入门到精通(十二) Publish发布M文件
Simulink仿真入门到精通(十三) Simulink创建自定义库
Simulink仿真入门到精通(十四) Simulink自定义环境
Simulink仿真入门到精通(十五) Simulink在流程工业中的仿真应用
Simulink仿真入门到精通(十六) Simulink基于模型设计的工业应用概述
Simulink仿真入门到精通(十七) Simulink代码生成技术详解
Simulink仿真入门到精通(十八) TLC语言
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的变量。
1 2 3 4 5 6 7 8 9 10 11 | |
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:停止调试。
当单步执行某个模块的某个方法涉及数据的输入输出或状态量的更新计算时,可以将其显示出来。
1 2 3 4 5 6 7 | |
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代替。
- 模型中包含可以解算的代数环,应解除代数环。
- 模型中存在不是其他任何一个采样速率整数倍的采样速率,应采用成倍数的采样时间组合,可以降低采样数,缩短计算时间。