1. Simulink环境搭建与首个控制回路仿真
环境准备与版本确认
Simulink 是 MATLAB 的图形化建模与仿真环境,安装时随 MATLAB 主程序一并部署。开始前先确认三件事:MATLAB 版本、Simulink 工具箱是否可用、以及求解器默认配置。在 MATLAB 命令窗口执行以下命令即可核对:
ver('matlab') % 查看 MATLAB 版本
ver('simulink') % 确认 Simulink 已安装及版本
license('test','Simulink') % 返回 1 表示许可可用
若 ver('simulink') 无输出,说明安装时未勾选 Simulink,需要通过安装器补装。版本确认后,建议在命令窗口设置一次默认求解器,避免每次新建模型都要手动改:
set_param(0,'Solver','ode45', ...
'StopTime','10', ...
'MaxStep','0.01');
这里 ode45 是变步长显式 Runge-Kutta 求解器,适合本例这类连续、非刚性的线性系统;MaxStep=0.01 限制最大步长,保证输出曲线足够平滑。
首个开环控制回路的结构
本例要搭建的是一个最简开环回路:信号源产生阶跃指令,经过一个控制器传递函数,再驱动被控对象,最后用示波器观察输出。三个核心模块及其参数如下:
| 模块 | 库位置 | 关键参数 |
|---|---|---|
| Step(阶跃源) | Simulink / Sources | Step time = 1,Initial value = 0,Final value = 1 |
| Transfer Fcn(控制器) | Simulink / Continuous | Numerator = [2],Denominator = [1 2] |
| Transfer Fcn(被控对象) | Simulink / Continuous | Numerator = [1],Denominator = [1 3 2] |
| Scope(示波器) | Simulink / Sinks | 输入端口数 = 1 |
控制器传递函数为 Gc(s)=2/(s+2),被控对象为 Gp(s)=1/(s²+3s+2)。开环串联后总传递函数为:
G(s) = Gc(s)·Gp(s) = 2 / [(s+2)(s²+3s+2)]
= 2 / [(s+2)²(s+1)]
极点位于 s = -1 和 s = -2(二重),全部在左半平面,因此开环系统稳定,阶跃响应会收敛到一个稳态值。由终值定理,稳态输出为 G(0)·1 = 2/(2·2) = 0.5,这是后面判读曲线的重要依据。
建模与仿真操作
在 MATLAB 命令窗口输入 simulink 打开 Simulink Start Page,选择 Blank Model 新建模型。按上表从 Library Browser 拖入四个模块,用鼠标从输出端口拖到输入端口完成连线。连线完成后,双击每个模块填入参数。模型保存为 open_loop_demo.slx。
运行仿真前,在模型窗口的 Simulation 选项卡中确认 Stop time 为 10,Solver 为 ode45。点击 Run 按钮执行仿真。仿真结束后双击 Scope 模块,可以看到输出曲线。
若希望用脚本一次性完成建模与仿真,可执行以下代码,它会以编程方式构建同样的开环回路并绘制响应:
% 新建模型
mdl = 'open_loop_demo';
new_system(mdl);
open_system(mdl);
% 添加模块
add_block('simulink/Sources/Step', [mdl '/Step'], ...
'Time','1','Before','0','After','1','Position',[50 80 100 120]);
add_block('simulink/Continuous/Transfer Fcn', [mdl '/Gc'], ...
'Numerator','[2]','Denominator','[1 2]','Position',[160 80 230 120]);
add_block('simulink/Continuous/Transfer Fcn', [mdl '/Gp'], ...
'Numerator','[1]','Denominator','[1 3 2]','Position',[280 80 360 120]);
add_block('simulink/Sinks/To Workspace', [mdl '/y'], ...
'VariableName','yout','SaveFormat','Structure With Time', ...
'Position',[420 80 480 120]);
% 连线
add_line(mdl,'Step/1','Gc/1');
add_line(mdl,'Gc/1','Gp/1');
add_line(mdl,'Gp/1','y/1');
% 配置并运行
set_param(mdl,'Solver','ode45','StopTime','10','MaxStep','0.01');
sim(mdl);
% 绘制响应
plot(yout.time, yout.signals.values, 'LineWidth', 1.5);
xlabel('时间 t/s'); ylabel('输出 y(t)');
title('开环阶跃响应'); grid on;
结果判读与验证
运行后应观察到以下现象,可据此判断模型是否正确:
- t < 1 s 时输出保持为 0,因为阶跃信号尚未跳变。
- t = 1 s 后输出开始上升,呈单调上升形态,无超调、无振荡——这是两个实极点(-1 和 -2)共同作用的结果。
- 约 t = 5 s 后曲线趋于平直,稳态值约为 0.5,与终值定理计算一致。
若曲线出现持续振荡或发散,检查分母多项式系数是否写错;若稳态值不是 0.5,检查控制器或对象增益是否被误改。确认无误后,可将 Scope 的输入端口数改为 2,把 Step 输出和 Gp 输出同时接入,对比输入指令与输出响应,直观看到开环系统对指令的“衰减”作用(输入 1,输出仅 0.5)。