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 / SourcesStep time = 1,Initial value = 0,Final value = 1
Transfer Fcn(控制器)Simulink / ContinuousNumerator = [2],Denominator = [1 2]
Transfer Fcn(被控对象)Simulink / ContinuousNumerator = [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,这是后面判读曲线的重要依据。

开环控制回路信号链与预期响应 Step t=1 起跳 0 → 1 控制器 Gc(s) 2 / (s+2) 被控对象 Gp(s) 1 / (s²+3s+2) Scope 观察 y(t) u(t) v(t) y(t) 预期阶跃响应 y(t) t/s y 稳态 0.5 t=1 进入稳态带

建模与仿真操作

在 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)。

首次运行若提示“无法找到求解器”,通常是安装不完整;重新运行 MATLAB 安装器并勾选 Simulink 即可。若仿真速度过慢,可适当增大 MaxStep,但不要超过 0.05,否则曲线会失真。