Simulink建模入门:从模块库到二阶系统闭环仿真
2026/9/18 5:57:22 网站建设 项目流程

简介:面向准备学习系统仿真建模的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 typeTime-based基于时间产生正弦;Sample-based 按采样点生成,用于离散系统
Amplitude1正弦幅值
Bias0叠加的直流分量,正弦会围绕该值上下摆动
Frequency2*pi角频率,单位 rad/s,默认值对应 1Hz 正弦
Phase0初始相位,单位 rad
Sample time00 表示连续信号;大于 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 Block180 度镜像翻转反馈支路反向、输入端口换边
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 区域是导出数据的总开关。

导出项默认变量名保存内容
Timetout每个仿真步的时刻向量
Statesxout模型内部的连续与离散状态
Outputyout所有 Out 模块的端口输出
Final statexFinal仿真结束时刻的状态快照
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.youtout.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 极性。按这个顺序定位,多数二阶系统仿真问题几分钟内能找到具体模块。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询