MATLAB 之 Simulink系统的仿真与分析

一、Simulink 系统的仿真与分析

  • 系统的模型建立之后,选择仿真参数和数值算法,便可以启动仿真程序对该系统进行仿真。

1. 设置仿真参数

  • 在系统仿真过程中,事先必须对仿真算法、输出模式等各种仿真参数进行设置。在模型编辑窗口打开仿真参数设置对话框有以下方法。
  • (1) 单击工具栏中的 Model Configuration Parameters 按钮。
  • (2) 选择 Simulation ⟶ \longrightarrow Model Configuration Parameters 命令。
  • 打开的仿真参数设置窗口如下图所示。

在这里插入图片描述

  • 在仿真参数设置窗口中,仿真参数分为以下 7 类。
  • (1) Solver 参数:用于设置仿真起始和终止时间,选择微分方程求解算法并为其规定参数,以及选择某些输出选项。
  • (2) Data Import/Export 参数:用于管理工作空间数据的导入和导出。
  • (3) Optimization 参数:用于设置仿真优化模式。
  • (4) Diagnostics 参数:用于设置在仿真过程中出现各类错误时发出警告的等级。
  • (5) Hardware Implementation 参数:用于设置实现仿真的硬件。
  • (6) Model Referencing 参数:用于设置参考模型。
  • (7) Simulation Target 参数:用于设置仿真模型目标。

1.1 Solver 参数设置

  • Solver(求解算法)是利用模型中所含的信息来计算系统动态行为的数值积分算法。
  • Simulink 提供的求解算法可支持多种系统的仿真,其中包括任何规模的连续时间(模拟)、离散时间(数字)、混杂(混合信号)和多采样率系统。
  • 这些求解算法可以对刚性系统以及具有不连续过程的系统进行仿真。可以指定仿真过程的参数,包括求解算法的类型和属性、仿真的起始时间和结束时间以及是否加载或保存仿真数据。
  • 此外,还可以设置优化和诊断信息。在仿真参数设置窗口左侧窗格中选择 Solver 选项,在右侧窗格中会列出所有 Solver 参数,如图12-8所示。

在这里插入图片描述

  • (1) 设置仿真起始和终止时间(Simulink time)。在 Start time 和 Stop time 两个编辑框中,通过直接输入数值来设置仿真起始时间和终止时间,时间单位是秒 (s)。
  • (2) 仿真算法的选择(Solver options)。在 Type 下拉列表框中设定算法类别:Fixed-step(固定步长)和 Variable-step(变步长)算法,在 Solver 下拉列表框中选择具体算法。
  • 仿真算法根据步长的变化分为固定步长类算法和变步长类算法。固定步长是指在仿真过程中计算步长不变,而变步长是指在仿真过程中要根据计算的要求改变步长。对于这两类算法,它们所对应的相关选项及具体算法都有所不同。
  • 在采用变步长类算法时,首先应该指定允许的误差限,包括相对误差限(Relative Tolerance)和绝对误差限(Absolute Tolerance),当计算过程中的误差超过该误差限时,系统将自动调整步长,步长的大小将决定仿真的精度。
  • 在采用变步长类算法时还要设置所允许的最大步长(Max Step Size),在默认值(Auto)的情况下,系统所给定的最大步长为(终止时间起始时间) /50。
  • 在一般情况下,系统所给的最大步长已经足够,但如果用户所进行的仿真时间过长,则默认步长值就非常大,有可能出现失真的情况,这时应根据需要设置较小的步长。
  • 在采用固定步长算法时,要先设置固定步长。由于固定步长算法的步长不变,所以此时不设定误差限,而多了一个模型类型(Tasking Mode for Periodic Sample Times)的选项,该选项包括 Auto(默认值)、SingleTasking(单任务和 MultiTasking(多任务)。
  • 单任务是指各模块的采样速率相同,不检测采样速率的传递;多任务是指在模型中模块具有不同的采样速率,同时检测模块之间采样速率的传递;默认值则根据模块的采样速率是否相同来决定采用单任务还是多任务。
  • 变步长和固定步长包含多种不同的具体算法。一般情况下,连续系统仿真应该选择 ode45 变步长算法,对刚性问题可以选择变步长的 ode15s 算法,离散系统一般默认选择固定步长的 discrete(no continuous states)算法,要注意在仿真模型中含有连续环节时不能采用该仿真算法,而可以采用诸如 4 阶 Runge-Kutta 法这样的算法来求解问题。

1.2 Data lmport/Export 参数设置

  • 导入的数据包括输入信号和初始状态,输入信号可以用标准信号或自定义函数生成。
  • 导出的数据包括输出信号和仿真过程的状态数据,可以用于生成图形或进行其他处理。Data ImportExport(数据导入/导出)参数选项如下图所示,包含 Load from workspace、Save to workspace or file 和 Simulation Data Inspector 三个部分。

在这里插入图片描述

  • (1) Load from workspace(从工作空间中载入数据)。在仿真过程中,如果模型中有输入端口(In 模块),可从工作空间直接把数据载入到输入端口,即先勾选 Data Import/Export 参数选项中的 Input 复选框,然后在后面的编辑框中输入数据的变量名。变量名可以采用不同的输入形式。
  • ① 矩阵形式。如果以矩阵形式输入变量名,则矩阵的列数必须比模型的输入端口数多一个,MATLAB把矩阵的第一列默认为时间向量,后面的每一列对应每一个输入端口,矩阵的第一行表示某一时刻各输入端口的输入状态。
  • 另外,也可以把矩阵分开来表示,即 MATLAB 默认的表示方法 [ t , u ] [t,u] [t,u],其中 t t t 是一维时间列向量,表示仿真时间, u u u 是和 t t t 长度相等的 n 维列向量(n 表示输入端口的数量),表示状态值。
  • 例如,我们在命令行窗口中定义 t t t u u u
>> t=(0:0.1:10)';
>> u=[sin(t),cos(t).*sin(t),exp(-2*t).*sin(t)];
  • 则 3 个输入端口输入的数据与时间的关系分别为 sin ⁡ t \sin t sint cos ⁡ t sin ⁡ t \cos t\sin t costsint e − 2 ∗ t sin ⁡ t e^{-2*t}\sin t e2tsint
  • ② 包含时间数据的结构形式。对于包含时间数据的结构,在 MATLAB 中有非常严格的规定,即在结构中必须有两个名字不能改变的顶级成员:time 和 signals。
  • 在 time 成员中包含一个列向量,表示仿真时间;signals 成员是一个向量,向量中的每个元素对应一个输入端口,并且每个元素必须包含一个名字同样不能改变的 values 成员,values 成员也包含一个列向量, 对应于输入端口的输入数据。
  • 例如,对于上例,我们若改为包含时间数据的结构输入,则命令格式如下:
>> t=(0:0.1:10)';
>> A.time=t;
>> A.signals(1).values=sin(t);
>> A.signals(2).values=cos(t).*sin(t);
>> A.signals(3).values=exp(-2*t).*sin(t);
  • 在 Input 复选框右侧的文本框中输入 A,则产生的仿真曲线与上面矩阵形式数据输入后的输出曲线完全相同。
  • 在 Input 复选框的下面,还有一个 Initial state 复选框,它表示的是模块的初始化状态。对模块进行初始化的方法是,先勾选 Initial state 复选框,然后在右侧的文本框中输入初始化数据的变量名。变量要求的形式与前面的输入端口数据的变量形式基本相同,但变量中的数据个数必须和状态模块数相同。
  • (2) Save to workspace or file(保存到工作空间或文件)。在 Save to workspace or file 区域中,可以选择的选项有 Time(时钟)、States(状态)、Output(输出端口)、Final states(最终状态)、Signal logging(信号)等。
  • 同载入数据的形式一样, 保存数据也有矩阵、结构和包含时间数据的结构 3 种形式,在 Format 下拉列表框中可以根据需要进行选择。对于不同的保存形式来说,Time 的格式是不变的,总是对应仿真的采样时间。

2. 运行仿真与仿真结果分析

2.1 运行仿真

  • 在 MATLAB 中,可以在 Simulink 模型编辑窗口以交互方式运行仿真。Simulink 仿真有 3 种模式,可以通过在模型编辑窗口选择 Simulation ⟶ \longrightarrow Mode 命令进行设置。
  • (1) Normal:标准模式(默认设置),以解释方式运行,仿真过程中能够灵活地更改模型参数和显示结果,但仿真运行慢。
  • (2) Accelerator:加速器模式,通过创建和执行已编译的目标代码来提高仿真性能,而且在仿真过程中能够较灵活地更改模型参数。加速模式下运行的是模型编译生成的 s 函数,不能提供模型覆盖率信息。
  • (3) Rapid Accelerator:快速加速器模式,能够比 Accelerator 模式更快地进行模型仿真,该模式不支持调试器和性能评估器。
  • 设置完仿真参数之后,单击模型编辑窗口工具栏中的 Run 按钮,或选择 Simulation ⟶ \longrightarrow Run 命令,便可启动对当前模型的仿真。
  • Simulink 支持使用仿真步进器(Simulation Stepper)进行调试,便于逐步查看示波器上的仿真数据,或检查系统改变状态的方式及时间。单击模型编辑窗口工具栏中的 Step Forward 按钮,开始单步仿真。单击模型编辑窗口工具栏中的 Stop 按钮,终止单步仿真。
  • 运行仿真前,单击模型编辑窗口工具栏中的 Stepping Options 按钮,在打开的对话框中勾选 Enable stepping back 复选框,在仿真时单击模型编辑窗口工具栏中的 Step Back 按钮,回溯仿真过程。

2.2 仿真结果分析

  • Simulink 提供了多种有助于了解仿真行为的调试工具。使用 Simulink 中提供的查看器和示波器查看信号,实现仿真行为可视化。还可以将仿真结果导出到 MATLAB 工作区,以便使用 MATLAB 算法以及可视化工具来查看和分析数据。
  • 在仿真过程中,用户可以设置不同的输出方式来观察仿真结果。为了观察仿真结果的变化轨迹可以采用 3 种方法。
  • (1) 把仿真结果送给 Scope 模块或者 XYGraph 模块。Scope 模块显示系统输出量对于仿真时间的变化曲线,XYGraph 模块显示送到该模块上的两个信号中的一个对另一个的变化关系。
  • (2) 把仿真结果送到输出端口,将结果导出到工作空间,然后用 MATLAB 命令画出该变量的变化曲线。在运行这个模型的仿真之前,先在 Configuration Parameters 对话框的 Data Impot/Export 选项卡中,规定时间变量和输出变量的名称(假定分别设定为 t t t y y y),那么,当仿真结束后,时间值保存在时间变量t中,对应的输出端口的信号值保留在输出变量 y y y 中,这时可以在命令行窗口使用 whos 命令查看内存变量,也可以使用绘图命令绘制系统输出量的变化曲线。
  • (3) 把输出结果送到 To Workspace 模块,在 To Workspace 模块参数对话框中填入输出变量名称,并在 Save format 下拉列表中选择 Array 选项,从而将结果直接存入工作空间,然后用 MATLAB 命令画出该变量的变化曲线。
  • 仿真输出结果还有其他一些输出方式,例如,使用 Display 模块可以显示输出数值。
  • 例如,我们利用 Simulink 构建函数曲线 y = 5 r + 16 y=5r+16 y=5r+16
  • Simulink 的 Sources 模块库中提供了时钟、脉冲、正弦波等常用信号源,可利用这些常用信号源和 Simulink 模块库中提供的求和、乘积、增益以及 MATLAB 函数等其他模块进行适当的连接组合,即可构建所需的各种信号源。
  • 下面采用两种方法来构建函数曲线,一种方法是采用 MATLAB Function 模块,另一种方法是采用基本模块的组合连接。
  • 方法 1:采用 MATLAB Function 模块构建仿真模型。
  • (1) 启动 Simulink 并打开模型编辑窗口,将所需模块添加到模型中。在 Simulink Library Browser 窗口单击 Sources 模块库,在右侧的窗口中找到 Clock(时钟)模块,然后用鼠标将其拖到模型编辑窗口。
  • 同样,在 User-Defined Functions(用户自定义函数)模块库中拖出 MATLAB Function(MATLAB 函数)模块,在 Sinks 模块库中拖出 To Workspace(输出到工作空间)模块、Scope(示波器)模块进行连接组合,其模型如下图所示。

在这里插入图片描述

  • (2) 设置模块参数。双击 MATLAB Function 模块,建立其信号源的函数。
function	y=f(t)
	y=5*t*t+16;
  • 双击两个输出到工作空间模块,分别输入变量名为 t t t y y y,仿真参数取默认值。
  • (3) 启动仿真,函数曲线下图所示。

在这里插入图片描述

  • 方法 2:采用基本模块组合构建仿真模型。
  • 构建该信号源该信号源的另一种方法石将一些常用的数学模块进行组合建模,其模型如下图所示。

在这里插入图片描述

  • 模型中用到了 Clock(时钟)、Constant(常数)、Gain(增益)、Product(乘积)和 Sum(求和)等模块。双击增益模块输入 5,常数模块输入 16,最后设置仿真参数即可。其输出结果与方法 1 相同。
  • 与方法 1 相比,该方法采用的模块数较多一些。另外,模型中还采用 XY Graph 模块将输出信号的轨迹显示出来。
  • 例如,我们利用 Simulink 仿真求 I = ∫ 0 1 x ln ⁡ ( 1 + x ) d x I=\int_{0}^{1}x\ln \left ( 1+x\right)\mathrm{d}x I=01xln(1+x)dx
  • 首先打开模型编辑窗口,将所需模块添加到模型中。在 Simulink Library Browser 窗口中单击 Sources 模块库,将 Clock 模块拖到模型编辑窗口。
  • 在用户定义模块库 User-Defined Functions 中把函数模块 Fcn 拖到模型编辑窗口,在连续系统模块库 Continuous 中把 Integrator 模块拖到模型编辑窗口,在 Sinks 模块库中把 Display 模块拖到模型编辑窗口。
  • 然后,我们设置模块参数并连接各个模块组成仿真模型。双击 Fcn 模块,打开 Block Parameters 对话框,在 Expression 栏中输入 u*log(1+u),其余模块参数不用设置。
  • 设置模块参数后,用连线将各个模块连接起来组成仿真模型,如下图所示。

在这里插入图片描述

  • 设置系统仿真终止时间为 1s,运行仿真模型,Display 模块显示仿真结果为 0.25。