自动控制原理实验全攻略:从传递函数到Simulink仿真与稳定性分析

发布时间:2026/10/24 20:58:56
自动控制原理实验全攻略:从传递函数到Simulink仿真与稳定性分析

简介:这份文档面向具备基础控制理论与编程能力的高年级本科生、研究生及工程技术人员,围绕自动控制原理实验教学,系统讲解控制系统的建模、分析与校正方法。内容涵盖六个实验:控制系统数学模型的MWORKS与MATLAB实现、时域与频域分析、典型环节动态性能与稳定性分析、频率特性测量、系统串联校正,以及EF-Servo集成与滤波,每个实验均配有目的、内容、步骤与思考题,帮助读者掌握传递函数、状态空间、Simulink建模及频率法校正等核心技能。资源包为1个docx文档,大小约1.43MB,结构完整、便于对照操作。目前已有676人学习下载,适合作为课程实验指导或自学参考,读者可借助MATLAB与MWORKS工具逐步完成实验任务,并通过思考题加深对控制系统工作原理的理解,提升动手实践与系统分析能力。

1. 从传递函数到仿真波形:这套自动控制原理实验资源到底能干什么

很多控制理论的学习者都有过这样的体验:课堂上把劳斯判据、奈奎斯特判据背得滚瓜烂熟,一到要用 MATLAB 或 MWORKS 把传递函数跑出阶跃响应曲线,就不知道从哪下手。这份自动控制原理实验资源,就是冲着这个断层来的。它把六个实验串成一条完整的链路——从传递函数、零极点增益、状态空间三种模型的建立与互相转换,到时域指标测量、频域稳定性判定,再到串联校正和 EF-Servo 集成滤波,每一步都给了可运行的代码和 Simulink 连线方案。适合正在上控制理论实验课的高年级本科生和研究生,也适合需要快速把控制模型跑起来验证的工程技术人员。下面按我实际拆这套资源的顺序,把关键步骤和容易翻车的地方讲清楚。

2. 三种数学模型与 Simulink 建模:从 tf 到状态空间的完整链路

2.1 为什么先建 TF 模型再转 ZPK 和 SS

控制系统的数学模型有四种描述方式:传递函数(TF)、零极点增益(ZPK)、状态空间(SS)和 Simulink 结构图。前三种是数学表达式,MATLAB 和 MWORKS 都支持连续和离散两种类型。实际做实验时,我一般先用 TF 模型把传递函数写进去,因为分子分母系数向量最直观,不容易搞错。然后再用zpk()和ss()转成其他形式,对比不同模型下的系统特性。

以实验一中传递函数 $G(s)=\frac{4}{s(s+1)^2(s+3)}$ 为例,展开分母后是 $s^4+5s^3+7s^2+3s$,分子是常数 4。在 MATLAB 里这样写:

% 实验一:建立TF模型并转换为ZPK和SS num = 4; % 分子系数 den = [1 5 7 3 0]; % 分母系数,注意补零 G_tf = tf(num, den); % 建立传递函数模型 G_zpk = zpk(G_tf); % 转换为零极点增益模型 G_ss = ss(G_tf); % 转换为状态空间模型 G_tf_back = tf(G_ss); % 再从SS转回TF,验证一致性

这里有几个参数需要留意。den向量的长度决定了系统阶数,缺项必须补零,比如 $s^4+5s^3+7s^2+3s$ 没有常数项,末尾要写 0。zpk()转换后,无零点时零点向量为空,MATLAB 会自动处理。ss()转换得到的状态空间模型不唯一,但tf(ss(G))转回来应该和原传递函数在数值精度内一致——如果差异很大,多半是分母系数写错了。

MWORKS 这边的写法略有不同,需要先加载TyControlSystems包:

# MWORKS 中建立传递函数模型 using TyControlSystems num = 6 den = [1 6 11 6] G = tf(num, den) # 返回:6 / (s^3 + 6s^2 + 11s + 6)

MWORKS 的tf()函数调用格式和 MATLAB 基本一致,但包名和加载方式是关键区别。如果你在 MWORKS 里直接敲tf报未定义,九成是忘了using TyControlSystems。

2.2 子系统串联、并联与反馈连接的代码实现

实验一第二题要求对两个子系统 $G_1(s)=\frac{s+1}{s^2+4s+4}$ 和 $G_2(s)=\frac{1}{s+1}$ 求串联、并联和反馈连接。这三种连接在 MATLAB 里分别对应乘法、加法和feedback()函数:

% 定义两个子系统 G1 = tf([1 1], [1 4 4]); % G1(s) = (s+1)/(s^2+4s+4) G2 = tf([1], [1 1]); % G2(s) = 1/(s+1) % 串联连接:G_series = G1 * G2 G_series = G1 * G2; % 并联连接:G_parallel = G1 + G2 G_parallel = G1 + G2; % 反馈连接:默认负反馈,G_feedback = G1 / (1 + G1*G2) G_feedback = feedback(G1, G2);

串联的顺序有讲究:G1 * G2表示信号先经过 G1 再经过 G2,和G2 * G1在标量系统里结果相同,但在 MIMO 系统里顺序不能随意换。feedback(G1, G2)默认是负反馈,前向通道是 G1,反馈通道是 G2。如果要正反馈,加第三个参数+1。这里最容易翻车的是反馈连接时搞混前向和反馈通道——记住第一个参数是前向,第二个是反馈。

2.3 Simulink 建模:单位负反馈系统的搭建与仿真

实验一第三题要求建立开环传递函数 $G(s)=\frac{2}{s(s+4)}$ 的单位负反馈 Simulink 模型。Simulink 建模的核心步骤是:打开 Library Browser,拖入所需模块,连线,设参数,运行仿真。

需要的模块清单如下:

模块名称所在库用途
StepSources产生单位阶跃输入
Transfer FcnContinuous设置开环传递函数
SumMath Operations实现反馈求和
ScopeSink观测输出响应

具体操作:在 Simulink 中新建模型,从 Sources 库拖入 Step 模块,从 Continuous 库拖入 Transfer Fcn 模块,从 Math Operations 拖入 Sum 模块(设为+--),从 Sink 库拖入 Scope。连线时注意 Sum 模块的输出接 Transfer Fcn 的输入,Transfer Fcn 的输出接 Scope 的同时反馈回 Sum 的负输入端。Transfer Fcn 的 Numerator 设为[2],Denominator 设为[1 4 0]。仿真时间默认 10 秒即可,运行后双击 Scope 就能看到阶跃响应曲线。

注意:Transfer Fcn 模块的分母系数要按降幂排列,缺项补零。s(s+4)展开是s^2+4s,所以分母写[1 4 0],末尾的 0 不能漏。

3. 时域与频域分析:从阶跃响应到奈奎斯特判据的实操

3.1 二阶系统时域指标测量与参数影响分析

实验二的核心是研究阻尼比 $\zeta$ 和无阻尼振荡频率 $\omega_n$ 对二阶系统动态性能的影响。典型二阶系统的闭环传递函数为:

$$G(s) = \frac{\omega_n^2}{s^2 + 2\zeta\omega_n s + \omega_n^2}$$

在 MATLAB 里,我一般用以下代码批量跑不同参数组合:

% 实验二:二阶系统时域分析 wn = 5; % 固定无阻尼振荡频率 zeta_list = [0, 0.5, 0.707, 1, 1.5]; % 不同阻尼比 t = 0:0.01:10; % 时间向量 figure; hold on; for i = 1:length(zeta_list) zeta = zeta_list(i); num = wn^2; den = [1, 2*zeta*wn, wn^2]; G = tf(num, den); step(G, t); end legend('ζ=0', 'ζ=0.5', 'ζ=0.707', 'ζ=1', 'ζ=1.5'); hold off;

这段代码跑完,你能直观看到:$\zeta=0$ 时等幅振荡,$\zeta=0.5$ 时超调明显,$\zeta=0.707$ 时超调约 4.3%,$\zeta=1$ 时无超调但响应偏慢,$\zeta=1.5$ 时过阻尼响应更慢。性能指标可以用右键菜单里的 Characteristics 直接读——上升时间、峰值时间、超调量、调节时间都能在曲线上标出来。

反过来固定 $\zeta=0.5$,改变 $\omega_n$ 取 0.5、1、3、5,你会发现 $\omega_n$ 越大,响应越快,但超调量基本不变。这个结论在实验报告里经常被问到,记住一句话:$\zeta$ 决定超调,$\omega_n$ 决定速度。

3.2 状态空间模型的时域响应求解

实验二第三题给了一个状态空间模型:

$$\dot{x} = \begin{bmatrix} 0 & 1 & 0 \ 0 & 0 & 1 \ -6 & -10 & -4 \end{bmatrix} x + \begin{bmatrix} 0 \ 0 \ 1 \end{bmatrix} u, \quad y = \begin{bmatrix} 6 & 0 & 0 \end{bmatrix} x$$

要求分别用step()和lsim()求状态响应和输出响应。代码这样写:

% 状态空间模型定义 A = [0 1 0; 0 0 1; -6 -10 -4]; B = [0; 0; 1]; C = [6 0 0]; D = 0; G = ss(A, B, C, D); % 单位阶跃响应 t = 0:0.01:10; [y_step, t_out, x_step] = step(G, t); % 单位斜坡响应(用lsim) u_ramp = t; % 斜坡输入 u(t) = t [y_ramp, t_out2, x_ramp] = lsim(G, u_ramp, t); % 绘图 figure; subplot(2,1,1); plot(t, x_step); title('状态响应(阶跃输入)'); subplot(2,1,2); plot(t, y_step); title('输出响应(阶跃输入)');

step()返回三个值:输出y、时间向量t、状态向量x。如果系统是 TF 模型而不是 SS 模型,x返回空矩阵。lsim()的第二个参数是输入向量,长度必须和时间向量一致。这里斜坡输入直接取u = t,因为时间从 0 开始,斜坡信号就是 $u(t)=t$。

3.3 奈奎斯特图与伯德图的绘制及稳定性判定

实验二频域部分要求对开环传递函数 $G(s)=\frac{2}{s^3+9s^2+14s}$ 画奈奎斯特图,并用奈奎斯特判据判断闭环稳定性。同时用pole()求闭环极点做对比验证。

% 频域分析:奈奎斯特图与稳定性判定 num = 2; den = [1 9 14 0]; G_open = tf(num, den); % 画奈奎斯特图 figure; nyquist(G_open); grid on; % 求闭环极点 G_closed = feedback(G_open, 1); poles = pole(G_closed); disp('闭环极点:'); disp(poles); % 画伯德图并标注裕度 figure; margin(G_open);

奈奎斯特判据的核心是看开环奈奎斯特曲线包围 $(-1, j0)$ 点的圈数 $N$,结合开环右半平面极点数 $P$,闭环右半平面极点数 $Z = P - N$。如果 $Z=0$,闭环稳定。用pole()求闭环极点更直接——所有极点实部为负则稳定。两种方法结果应该一致,如果不一致,先检查开环传递函数有没有写错,再检查feedback()的符号。

注意:nyquist()画的是开环频率响应,不是闭环。判断稳定性时用的是开环曲线包围临界点的圈数,别搞混了。

4. 典型环节电路模拟与频率特性测量:MWORKS 实操

4.1 六种典型环节的传递函数与电路参数对应

实验三要求对比例、积分、比例积分、比例微分、惯性、比例积分微分六种环节做电路模拟和软件仿真。每种环节的传递函数和电路参数对应关系如下表:

环节类型传递函数电路参数关系实验参数
比例(P)$K$$K = R_1/R_0$$R_0=10k\Omega$
积分(I)$\frac{1}{Ts}$$T = R_0 C$$R_0=100k\Omega, C=1\mu F$
比例积分(PI)$K(1+\frac{1}{Ts})$$K=R_1/R_0, T=R_0C$按电路图取值
比例微分(PD)$K(1+Ts)$$K=\frac{R_1+R_2}{R_0}, T=\frac{R_1R_2}{R_1+R_2}C$$R_1=R_2=10k\Omega$
惯性$\frac{K}{Ts+1}$$K=R_1/R_0, T=R_1C$$R_1=200k\Omega, C=1\mu F$
PID$K_P(1+\frac{1}{T_is}+T_ds)$近似实现,见正文多组电阻电容

在 MWORKS 里对这些环节做阶跃响应仿真,以惯性环节为例:

# MWORKS 惯性环节阶跃响应 using TyControlSystems K = 1.0 T = 0.2 num = [K] den = [T, 1] G = tf(num, den) stepplot(G) # 绘制阶跃响应曲线

惯性环节的阶跃响应按指数规律上升,时间常数 $T$ 越大,上升越慢。实验里取 $T=0.2s$,对应 $R_1=200k\Omega$、$C=1\mu F$。如果你在虚拟仿真软件里测得的曲线和 MWORKS 仿真对不上,先检查电路参数是否和传递函数推导时用的一致。

4.2 频率特性测量:从半圆图反推传递函数

实验四要求用实验方法测一阶惯性环节和典型二阶系统的频率特性,再根据测得曲线反推传递函数。一阶惯性环节 $G(s)=\frac{K}{Ts+1}$ 的幅相频率特性曲线是一个半圆,圆心在实轴 $K/2$ 处,半径 $K/2$。

从半圆图上反推参数的步骤:

  1. 找半圆与实轴的交点,起点对应 $\omega=0$,幅值为 $K$,所以 $K = r(0)$。
  2. 在半圆上任取一点 $\omega_k$,量出该点的相角 $\phi(\omega_k)$。
  3. 用公式 $T = \frac{\tan\phi(\omega_k)}{\omega_k}$ 计算时间常数。

在 MWORKS 里画奈奎斯特图验证:

# 一阶惯性环节频率特性 using TyControlSystems K = 1.0 T = 0.2 G = tf([K], [T, 1]) nyquistplot(G) # 绘制奈奎斯特图,应看到半圆 bodeplot(G) # 绘制伯德图,幅频特性-20dB/dec衰减

实际测量时,频率点选得越靠近半圆顶部(相角 -45° 附近),算出的 $T$ 越准。如果选在 $\omega$ 很小或很大的点,相角接近 0° 或 -90°,$\tan\phi$ 对误差很敏感,反推的 $T$ 波动会很大。

5. 串联校正与 EF-Servo 集成滤波:从理论到工程落地

5.1 频率法串联校正的设计步骤

实验五要求用频率法设计串联校正装置。串联校正的核心思路是:根据期望的截止频率和相角裕度,选择超前、滞后或超前-滞后校正网络,改善系统的动态性能和稳态精度。

设计步骤我一般这样走:

  1. 画未校正系统的伯德图,读出截止频率 $\omega_c$ 和相角裕度 $\gamma$。
  2. 根据性能要求确定期望的 $\omega_c'$ 和 $\gamma'$。
  3. 计算需要补偿的相角 $\phi_m = \gamma' - \gamma + \Delta$,其中 $\Delta$ 是余量,一般取 5°~10°。
  4. 选择超前校正网络 $G_c(s)=\frac{\alpha Ts+1}{Ts+1}$,其中 $\alpha = \frac{1+\sin\phi_m}{1-\sin\phi_m}$。
  5. 确定 $T$ 使校正后系统的截止频率落在期望位置。
  6. 验证校正后系统的相角裕度和幅值裕度。

MATLAB 代码框架:

% 串联超前校正设计 num = 2; % 未校正系统分子 den = [1 9 14 0]; % 未校正系统分母 G = tf(num, den); % 读未校正系统的裕度 [Gm, Pm, Wcg, Wcp] = margin(G); fprintf('未校正:相角裕度=%.1f°, 截止频率=%.2f rad/s\n', Pm, Wcp); % 设计超前校正网络 phi_m = 45 - Pm + 8; % 需要补偿的相角,加8°余量 alpha = (1 + sind(phi_m)) / (1 - sind(phi_m)); % 根据期望截止频率确定T % ...(具体计算略,按步骤3-5执行) % 验证校正后系统 Gc = tf([alpha*T, 1], [T, 1]); G_new = Gc * G; margin(G_new);

校正前后一定要用margin()对比相角裕度和幅值裕度。如果校正后相角裕度反而变小,多半是超前网络的零点极点位置放反了,或者 $\alpha$ 算错了。

5.2 EF-Servo 集成与滤波的注意事项

实验六涉及 EF-Servo 集成和滤波,这部分更偏工程实现。EF-Servo 通常指某种伺服驱动集成环境,滤波环节用于抑制噪声和机械谐振。在 MATLAB 里做滤波仿真时,我一般先用tf建立滤波器模型,再和伺服系统串联,观察阶跃响应和频率响应。

% EF-Servo 滤波环节仿真 % 二阶低通滤波器 wn_filter = 100; % 滤波器自然频率 zeta_filter = 0.707; % 滤波器阻尼比 G_filter = tf(wn_filter^2, [1, 2*zeta_filter*wn_filter, wn_filter^2]); % 与伺服系统串联 G_servo = tf([10], [0.01, 1]); % 简化伺服模型 G_total = G_filter * G_servo; % 对比滤波前后 figure; bode(G_servo, G_total); legend('未滤波', '滤波后');

滤波器的截止频率要选在伺服系统带宽之上、噪声频率之下。截止频率太低会拖慢系统响应,太高则滤不掉噪声。实际调试时,我一般从伺服带宽的 2~5 倍开始试,看阶跃响应的上升时间和超调量是否可接受。

6. 几个容易翻车的细节和我的固定检查习惯

这套实验做下来,有几个坑我踩过不止一次,这里列出来供参考。

第一个坑:传递函数分母缺项忘补零。比如 $G(s)=\frac{2}{s(s+4)}$,分母展开是 $s^2+4s$,系数向量必须写[1 4 0],末尾的 0 代表常数项为零。如果写成[1 4],MATLAB 会当成一阶系统处理,仿真结果完全不对。现象是阶跃响应曲线形状怪异,原因就是分母阶数少了一阶。解决办法很简单:写den之前先把传递函数展开成降幂多项式,逐项对照。

第二个坑:MWORKS 里忘了加载 TyControlSystems 包。现象是敲tf或zpk报未定义函数,原因是 MWORKS 的控制系统函数在独立包里,不像 MATLAB 那样默认加载。每次新建 jl 文件,第一行就写using TyControlSystems,养成习惯。

第三个坑:反馈连接时前向和反馈通道搞反。feedback(G1, G2)默认 G1 是前向,G2 是反馈。如果实际系统是 G2 在前向、G1 在反馈,结果就错了。现象是闭环传递函数和手算对不上。解决办法:画方块图确认信号流向,或者用feedback(G2, G1)再算一遍对比。

第四个坑:奈奎斯特判据的包围圈数数错。奈奎斯特曲线可能多次穿越负实轴,数包围圈数时容易漏。现象是判据结论和pole()求闭环极点的结论矛盾。我一般以pole()的结果为准,奈奎斯特图用来辅助理解。如果两者不一致,先检查开环传递函数有没有写错,再检查feedback()的符号。

第五个坑:频率特性测量时选点太偏。反推时间常数 $T$ 时,如果选的频率点相角接近 0° 或 -90°,$\tan\phi$ 对测量误差极其敏感,算出的 $T$ 可能差好几倍。现象是同一环节测两次得到不同的 $T$。解决办法:选相角在 -30° 到 -60° 之间的点,最好在 -45° 附近,这时候 $\tan\phi \approx 1$,误差最小。

从那以后我每次建完模型,都强制走一遍检查清单:分母系数补零了吗?包加载了吗?反馈通道对吗?闭环极点实部为负吗?频率特性选点合理吗?这五步走完,基本不会出大错。希望帮到你。

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