简介:面向准备学习系统仿真建模的MATLAB初学者与高校工科学生,这份PDF以图文配合方式讲解Simulink仿真环境的使用方法,帮助读者从零开始完成建模与仿真操作。资源包含1个PDF文件,压缩包大小约657KB,内容轻量精简,下载后即可快速阅读或打印备查。教程自Simulink模块库浏览器的打开方式讲起,以创建正弦波模型为例,逐步说明添加Sine Wave信号源、连接Scope示波器、启动仿真并查看波形的完整流程,同时系统梳理模型窗口的菜单与工具栏、文件的多种新建和打开方式、常用菜单功能,以及模块选定、复制、旋转和封装等操作。整体步骤明确,前后衔接紧密,适合零基础学习者边看边练,也可作为MATLAB课程的Simulink实验讲义。目前该资源已有1040人浏览学习,对熟悉界面、快速搭建仿真模型具有不错的参考价值。
1. Simulink 基础建模的分水岭:不是连线,是参数与数据通道
把同一个二阶系统放进 MATLAB Simulink,新手拖几个模块、点开始仿真就能出波形;但真到换数据源、调步长、把结果导回工作空间画响应曲线时,很多人开始卡壳。差别不在会不会用鼠标连线,而在对模块库组织、参数对话框、仿真求解器背后逻辑的熟悉程度。这份《matlab-simulink教程.pdf》从启动模块库浏览器讲起,经拖放 Sine Wave 与 Scope 搭出第一个可运行模型,一直延伸到闭环系统仿真、Workspace 数据回传和二阶系统阶跃响应验证,把 Simulink 课程设计里最常走的建模流程完整串了一遍。适合刚装好 MATLAB、准备做课程设计或控制系统验证的工程师与学生;对已经能跑通模型、但没系统整理过数据通道和仿真参数的人,也值得按这个顺序重新过一遍。
2. Simulink 模块库与第一个正弦信号模型:从启动到 Scope 出波
2.1 启动方式与模块库浏览器的层级结构
在 MATLAB 命令窗口直接输入simulink回车,或单击工具栏上的 Simulink 图标,就能打开 Simulink Library Browser(模块库浏览器)。左侧是按功能划分的库树,Simulink 根节点下挂着 Sources(输入源)、Sinks(接收)、Continuous(连续模块)、Discrete(离散模块)、Math Operations(数学运算)等子库;右侧是当前子库的模块图标。这个两级结构藏着 Simulink 的建模逻辑:数据从左边进模型,在中间做运算,从右边观察或落盘,理解这一点比记住单个模块位置更重要。
simulink; new_system('ex0701'); open_system('ex0701');第一行打开模块库浏览器,后两行是脚本化建模的常见做法:new_system在内存中创建名为ex0701的模型对象,open_system再把它以窗口形式显示。参数ex0701是要创建的模型名,不写扩展名时,默认按当前 MATLAB 版本的首选格式处理。鼠标拖拽够用,但记下这两条命令,之后批量生成测试模型时可以省大量时间。
模型窗口本身由菜单栏、工具栏、中间模型框图和底部状态栏组成。层级多、子系统多的时候,打开 View 菜单的 Model browser options,可以在左侧显示模型浏览器,按树形结构直接跳转父系统和子系统,比滚动画布找模块高效得多。
2.2 Sources 与 Sinks 库常用模块:Sine Wave 参数逐项说明
新建模型窗口默认叫untitled。在浏览器左侧单击 Sources 子库,右侧出现 Constant、Step、Ramp、Sine Wave、Signal Generator 等输入源;把 Sine Wave 拖到 untitled 窗口,或者右键模块选择 add to 'untitled',两种方式等价。Sinks 库里的 Scope 示波器用同样方式放入。这两个库是所有模型的两个端面,一个负责信号进来,一个负责把信号显示或写走。
双击 Sine Wave 打开参数对话框,这是 Simulink 最典型的参数设置形式,上半部分是字段说明,下半部分是可填写的参数项。常用字段含义整理如下。
| 参数项 | 典型值 | 说明 |
|---|---|---|
| Sine type | Time-based | 基于时间产生正弦;Sample-based 按采样点生成,用于离散系统 |
| Amplitude | 1 | 正弦幅值 |
| Bias | 0 | 叠加的直流分量,正弦会围绕该值上下摆动 |
| Frequency | 2*pi | 角频率,单位 rad/s,默认值对应 1Hz 正弦 |
| Phase | 0 | 初始相位,单位 rad |
| Sample time | 0 | 0 表示连续信号;大于 0 时按离散步长输出 |
Sample time 是区分新手和熟手的关键字段。连续系统里 Sine Wave 保持 0 不动;模型里一旦出现离散控制器或零阶保持器,就应该显式填成系统的采样周期,否则采样率不匹配会引发非常隐蔽的波形畸变。
2.3 连线、启动仿真与模型保存格式
连线时把鼠标指向 Sine Wave 右侧的输出三角,光标变成十字符,按住左键拖向 Scope 左侧输入端口,松开即生成信号线。若落点没对准端口,Simulink 不会接受这条线,模型里会留下悬空线头,需要选中后按 Delete 删除。移动模块时相连的线会自动伸缩,这只是路由跟随,不是数据逻辑变化。
开始仿真单击模型窗口工具栏的开始仿真按钮,等价于 Simulation 菜单下的 Start。该动作会先编译模型再做数值求解,双击 Scope 可以看到黄色正弦波形。仿真运行中修改 Sine Wave 的 Frequency 参数,不会在本次仿真中触发重新编译,通常要停止仿真、改完参数再启动,这是 Simulink 对模型结构一致性的基本约束。
保存时教程里示例存为 Ex0701.mdl,这是较早版本的文本模型格式;现在默认保存为 .slx 压缩二进制格式,加载更快。老 .mdl 文件在打开时通常可以兼容,但遇到中文路径容易出编码警告,项目路径尽量保持纯英文。
open_system('ex0701'); set_param('ex0701', 'StopTime', '10'); sim('ex0701');open_system把模型窗口调到前台;set_param把 StopTime 改成 10 秒,与菜单里 Simulation — Model Configuration Parameters 的 Stop time 等价;sim启动仿真并阻塞到仿真结束。脚本化仿真在参数扫描时是标配,把 10 替换成循环变量,套一层 for 就能连续跑多组工况并收集结果,下一步接工作空间导出会非常顺手。
3. 模型窗口高效编辑:模块翻转让位与信号线分支折曲
3.1 模块的选定、复制与跨窗口移动
模型窗口里单击模块即可选中,四角出现黑色小方块。要选多个模块,按住 Shift 逐个点,或直接用鼠标拉矩形框圈住;Edit 菜单的 Select all 全选当前窗口对象。这个操作习惯要尽早建立,后续复制一组模块、整体拖动子系统时都会用到。
复制模块有三条常见路径:按住 Ctrl 拖动;按住右键拖动后松开;Ctrl+C / Ctrl+V。同窗口内 Ctrl 拖动效率最高,右键拖动适合同时调整位置。不同窗口之间复制时,直接把模块从源窗口拖到目标窗口即可;如果希望移动而不是复制,拖动时按住 Shift,源窗口里的模块会被移除。模块移动后,与之相连的信号线会自动伸缩,但不会智能重排路由,大范围移动后通常需要手动整理线。
3.2 模块翻转与命名:反馈回路的排版基础
反馈回路的建模绕不开模块方向问题。Format 菜单里 Flip Block 把模块翻转 180 度,相当于水平镜像,输入输出端口位置对调;Rotate Block 顺时针翻转 90 度,可连续多次使用。做闭环控制时,反馈支路上的增益模块经常要翻转后再连接,否则信号流向会和主通道方向冲突。
一个实际经验:尽量在连线之前就把模块方向和端口位置摆好。连好线之后再做 180 度翻转,端口跟随模块移动,线也会被扯到另一侧,反而要多删几条线重新接。先规划信号流向,再决定每个模块的朝向,能少走不少弯路。
| 操作 | 动作 | 适用场景 |
|---|---|---|
| Flip Block | 180 度镜像翻转 | 反馈支路反向、输入端口换边 |
| Rotate Block | 每次顺时针 90 度 | 分支结构转向、整体排版 |
| Ctrl + 拖拽 | 同窗口快速复制 | 复制同类模块到旁边 |
| Shift + 拖拽 | 跨窗口移动模块 | 模块搬移到子系统窗口 |
| Shift + 左键拖折点 | 调整信号线转折 | 整理绕线、压缩画布空间 |
模块名默认显示在模块下方。单击名字进入虚线编辑框直接改名;Format 菜单里的 Hide/Show name 控制显隐,Flip name 把名字翻到对侧。名字尽量用拼音或英文,避免后续保存成 .slx 后在不同语言环境下出现字体错位。
3.3 信号线分支、折点与文本注释
信号线分支是新手容易绕晕的操作。光标指向信号线上的某个位置,按右键,光标变成十字,拖到目标端口松开,就生成一条分支;按住 Ctrl 加鼠标左键拖拽效果相同。需要说明的是,这只是同一个信号的多个读取端,不产生数据拷贝,比在模型里复制一套运算再求和要清晰得多。
折点调整要先单击选中信号线,再把光标放到转折处,按住 Shift 加左键,光标变成小圆时拖到合适位置。模型图乱,九成是折点重叠和线穿模块,这时候先选中线,逐段拖折点,不要整条线一起拖。双击信号线会弹出文本编辑框,可以写“期望转速”“反馈偏差”这类注释,这是模型可读性成本最低的投资。
单输入单输出的模块可以直接插入到一条现有信号线中间:按住模块拖到线的中部,Simulink 自动断开原有连线并把新模块串入。比如在 Sine Wave 和 Scope 之间的信号线上插入一个传递函数模块,相当于把两个模块的串联变成三个模块的串联,连接关系一步到位。
3.4 布局整理的顺序与程序化对齐
模型窗口里双击空白区域添加文本注释框,适合写模型用途、关键参数、版本记录。我整理模型一般按三步走:先把所有模块按信号流方向排到同一水平基线,再用 Flip Block 处理反馈支路的反向,最后给每条关键信号线补上文本注释。这三步做完,模型基本可以当作交付物给人看了。
set_param('ex0701/Sine Wave', 'Position', [50 50 110 80]); add_line('ex0701', 'Sine Wave/1', 'Scope/1', 'autorouting', 'on');set_param的 Position 参数用[左 上 右 下]四元数组指定模块在模型窗口的坐标,适合批量对齐多行模块;add_line是程序化连线的标准接口,参数依次为模型名、源端口、目标端口,最后一项autorouting设为on让 Simulink 自动绕线。这两个命令配合循环,可以把散乱的模型重排成矩阵式布局,比逐个拖拽效率高一个量级。
提示:信号线分支给出的始终是同一份数据,不是数据副本。后续挂多个运算模块时注意别把分支绕回原信号线形成意外回路。
4. 打通外部数据:From Workspace、From File 与 Workspace I/O 设置
4.1 Simulink 与 MATLAB 工作空间的数据边界
默认情况下,Simulink 模型内部的数据在仿真结束后并不自动保存到工作空间,Scope 波形关掉窗口就没了。要做参数扫描、绘制多组对比曲线,或者把实验采集数据喂进仿真,就必须用 From Workspace、From File 和 Workspace I/O 这三组通道。它们解决的是同一件事:在 MATLAB 工作空间、磁盘上的 mat 文件与模型端口之间建立清晰的数据契约。弄懂这个边界,模型才真正从“画图工具”变成“仿真工具”。
4.2 从工作空间读数组:From Workspace 的矩阵格式与端口匹配
From Workspace 模块位于 Sources 库,双击后在 Data 栏填变量名。最常用的格式是时间序列矩阵:第一列固定为时间向量,从第二列起依次对应模型各个输入端口。也就是说,模型有几个输入端口,矩阵就要有“端口数 + 1”列。这是 Simulink 里数组读入最基础的规则,列数对不上,仿真第一步就会报维度错误。
t = 0:0.1:2*pi; y = sin(t); t = t'; y = y'; [t, y]生成工作空间变量后,From Workspace 的 Data 栏填[t,y],模块图标会显示变量名。要求 t 和 y 都是列向量,中间转置那两行很容易漏。我一般执行完直接 size 检查一下,行数一致再放进模块。如果模型有两个输入端口,就把第二路数据拼成三列,比如[t, u1, u2];模块的端口顺序与列顺序严格对应。
除了矩阵,Data 栏也支持 timeseries 对象和带时间的结构体。timeseries 自带时间向量,不用单独拼列,适合模型里同时存在多个不同采样率信号的场景;矩阵格式虽然要求“时间在首列”,但排错直观,绝大多数课程设计和控制器验证都够用。结构体格式按总线对象组织字段,变量名与端口名绑定,适合团队共建模型时统一接口。
4.3 从 mat 文件读数据:From File 的变量方向问题
另一类常见需求是数据提前存在磁盘,仿真时直接加载。先在命令窗口把矩阵存成 mat 文件,再在模型里放 From File 模块,File name 栏填对应的文件名即可。
t = 0:0.1:2*pi; y = sin(t); y1 = [t; y]; save Ex0702 y1这段代码生成的y1是 2 行矩阵:第一行时间、第二行数据,正好和 From Workspace 要求的列向量方向相反,容易在这里犯糊涂。save保存到当前工作目录,From File 加载时按文件名找文件,模块里填写Ex0702.mat或直接填Ex0702都行。如果 mat 文件里有多个变量,模块取第一个数值矩阵,建议一个文件只放一组目标数据,减少歧义。
4.4 仿真参数页:Solver 与 Workspace I/O 的逐项含义
数据导出的接收端一侧同样有讲究。Sinks 库里 To Workspace 模块会把信号直接写到工作空间变量;Out 模块则是模型的标准输出端口,配合仿真参数里的 Output 选项,仿真结束后统一以 yout 变量落盘。两者区别在于:To Workspace 适合导出某个中间观测信号,Out 适合作为整个模型的对外接口。
仿真参数配置入口在 Simulation 菜单的 Model Configuration Parameters。Solver 页的 Start time 和 Stop time 控制仿真区间;Type 决定变步长还是固定步长。连续系统默认用变步长求解器,最常用的是 ode45;系统变刚硬(包含高频振荡或极快的动态)时换成 ode15s 会更稳。Workspace I/O 页的 Save to workspace 区域是导出数据的总开关。
| 导出项 | 默认变量名 | 保存内容 |
|---|---|---|
| Time | tout | 每个仿真步的时刻向量 |
| States | xout | 模型内部的连续与离散状态 |
| Output | yout | 所有 Out 模块的端口输出 |
| Final state | xFinal | 仿真结束时刻的状态快照 |
set_param('ex0701', 'Solver', 'ode45'); set_param('ex0701', 'StopTime', '15'); set_param('ex0701', 'SaveOutput', 'on'); set_param('ex0701', 'OutputSaveName', 'yout'); set_param('ex0701', 'SaveTime', 'on'); set_param('ex0701', 'TimeSaveName', 'tout'); out = sim('ex0701');这段set_param逐项对应配置对话框:Solver 选择微分方程求解器,StopTime 决定仿真长度,SaveOutput 开启输出保存并指定变量名 yout,SaveTime 连同时间一起保存为 tout。sim返回的out是 Simulink.SimulationOutput 对象,可以直接out.yout、out.tout取值,也可以out.get('yout')按名字取出。数据通路齐全之后,误差曲线、性能指标计算都不必依赖示波器截图。
注意:From Workspace 要求矩阵以列为单位,第一列是时间,端口数与列数按“列数 = 端口数 + 1”匹配;排错时先检查矩阵方向和 size,这两个位置是数组读入报错的高发区。
5. 二阶系统闭环模型的两种搭法:阶跃响应仿真与数据回读验证
5.1 闭环模型两种结构:传递函数法 vs 积分器+零极点法
单位负反馈二阶系统取开环传递函数 1/(s^2+0.6s),闭环后是典型的欠阻尼二阶系统。第一种搭法最直观:Sources 库放 Step,Math Operations 库放 Sum,Continuous 库放 Transfer Fcn,Sinks 库放 Scope,顺序连成 Step → Sum → 传递函数 → Scope,再从 Scope 输出端引分支回 Sum 的减号输入端,负反馈闭合。
三处参数需要专门设置。Sum 对话框里 Icon shape 选 rectangular,List of signs 填|+-,竖线表示该入口留空;Transfer Fcn 的分母填[1 0.6 0],对应 s^2+0.6s;Step 的 Step time 改为 0,保证 t=0 时刻阶跃立即加上。
第二种搭法换成积分器加零极点:Integrator 与 Zero-Pole 串联,Zero-Pole 的 Zeros 填[]、Poles 填[-0.6],反馈支路用 Gain 模块且参数设 -1,再用 Flip Block 翻转 Gain 使反馈方向与主通道一致。两条结构对应的闭环微分方程完全相同,差异在呈现方式:积分器结构把状态变量显式暴露出来,后续做状态反馈或观测器实验更方便。
5.2 阶跃响应仿真与工作空间回读绘图
把示波器替换成 Sinks 库的 Out 模块,回到 Workspace I/O 勾选 Time 与 Output,变量名设为 tout 和 yout。仿真结束执行绘图代码:
plot(tout, yout, 'b-', 'LineWidth', 1.5); grid on; xlabel('时间 (s)'); ylabel('输出 y(t)'); title('单位阶跃响应');b-指定蓝色实线,LineWidth 加粗线条方便检查细节。闭环传递函数的分母是 s^2+0.6s+1,自然频率 1,阻尼比约 0.3,所以曲线会在 1 附近衰减振荡,超调量约 37%,最终稳定到 1。看曲线先确认尾段是否趋近 1,再数振荡周期;如果曲线发散,第一反应是检查 Sum 的减号端是不是接到了反馈支路——反馈极性反了,闭环就变成正反馈。
5.3 排错顺序与建模习惯
仿真区间先在 Solver 页设成 15 秒,比系统调节时间略长,能看到完整的超调与回落;示波器 Y 轴范围固定为 0 到 2,Title 写成“二阶系统时域响应”,观察效果比自动坐标直观得多。微分环节 Derivative 数值噪声大,建模时优先用积分器组合表达微分方程,这条原则在 Simulink 里长期适用。
模型跑不通时我按固定顺序排查:先看数据出入口,From Workspace 的矩阵方向和 Out 端口变量名是重灾区;再看求解器类型,变步长在小步长区间反复逼近会拖慢仿真;最后检查反馈支路 Sum 符号与 Gain 极性。按这个顺序定位,多数二阶系统仿真问题几分钟内能找到具体模块。
本文还有配套的精品资源,点击获取