自动控制原理实验:MATLAB与MWORKS双平台建模与系统性能分析

发布时间:2026/10/15 7:29:31
自动控制原理实验:MATLAB与MWORKS双平台建模与系统性能分析
简介这是一份面向自动控制原理课程的实验教学文档详细介绍了MATLAB与MWORKS两大仿真环境下控制系统数学建模、时域频域分析、典型环节动态性能、频率特性测量、系统串联校正及EF-Servo集成与滤波等六个完整实验。整体内容适合具备基础控制理论知识和初步编程能力的高年级本科生、研究生及工程技术人员可配套控制科学与工程实验课程帮助读者将理论原理转化为实际动手操作能力。资源包为单个docx格式文档压缩后约1.43MB轻量便捷便于随堂翻阅与实验对照已有676人学习/下载。文档对每个实验均列出明确目的、详细内容、操作步骤与思考题给出在MWORKS中传递函数、零极点、状态空间模型的建立与相互转换在Simulink中构建单位负反馈系统仿真模型、观测阶跃响应并绘制频率特性曲线以及频率法串联校正的设计思路资源内实验编排由浅入深从基础建模逐步过渡到系统综合校正与滤波实现兼顾自学与课堂实训。1. 这套自动控制原理实验资料双平台建模加系统性能分析值得照着跑一遍做自动控制原理实验时最棘手的问题往往不是理论推导而是「代码跑不通」和「曲线对不上」。这套实验资源把 MATLAB 与 MWORKS 双平台的控制系统建模与系统性能分析完整串成了一条链路从传递函数、零极点增益、状态空间三种数学模型的建立与互转起步一直到典型环节的时域频域分析、二阶系统动态性能指标提取、奈奎斯特图与伯德图的稳定性判定最后落到串联校正和 EF-Servo 集成滤波。每个实验都带目的、内容、步骤、思考题和附录参考程序不是零散截图而是可以直接照做的实验手册式资料。适合正在学自动控制原理、要交实验报告的高年级本科生也适合想把频率特性和 Simulink 仿真快速捡回来的工程技术人员。2. 控制系统数学模型的建立与转换tf、zpk、ss 三种模型互转与连接2.1 为什么先立模型LTI 模型的四种描述方式与选型逻辑自动控制原理的仿真实验本质上是把课本里的传递函数变成软件里的对象。实验一开篇就点明线性定常系统LTI可以用四种数学模型描述——传递函数TF模型、零极点增益ZPK模型、状态空间SS模型以及 Simulink 结构图。前三种是数学表达式第四种是图形化描述。实验要求两边各跑一遍你会发现语法相近但细节上有不少差别。选型上我一般这样判断如果只是做单输入单输出的频域分析TF 模型最直接分子分母两个多项式向量一填就完事如果想看系统的稳定裕度ZPK 模型把零点和极点直接摆出来极点位置和根轨迹分析都很方便如果要接 Simulink 做时域仿真或者系统本身是多变量耦合的SS 模型才是归宿。实验要求把同一个系统在三种模型之间来回转换本质上就是让你理解这三种描述是同一个物理系统的不同切片。MWORKS 这边用的是 TyControlSystems 工具箱命令入口是 Julia 风格环境语法和 MATLAB 的 Control System Toolbox 高度接近。比如建立传递函数MATLAB 写tf(num, den)MWORKS 里同样写tf(num, den)但前面必须先using TyControlSystems。这个细节如果不注意第一次跑就会被卡在环境加载上。两种环境的核心语法对照如下操作MATLABMWORKS (Julia)建立传递函数G tf(num, den)G tf(num, den)建立零极点模型G zpk(z, p, k)G zpk(z, p, k)建立状态空间G ss(A, B, C, D)G ss(A, B, C, D)模型转换Gzpk zpk(Gtf)Gzpk zpk(Gtf)反馈连接feedback(G1, G2)feedback(G1, G2)串联连接G1 * G2G1 * G2两边的函数名几乎一致熟练一边就能在另一边零成本上手。真正要适应的不是语法而是 MWORKS 需要先加载包、MATLAB 需要先装 Control System Toolbox 这件事。2.2 建立 TF 与 ZPK 模型多项式系数与零极点向量的填写规则实验里的典型任务是已知系统传递函数 G(s) 4 / (s(s1)²(s3))建立 tf 或 zpk 模型。这里有个容易被新手下错的地方——分母给的是因式分解形式但 TF 模型要的是展开后的多项式系数ZPK 模型要的是零点和极点向量两者不能混。用 MWORKS 建立 TF 模型using TyControlSystems # 传递函数 6 / (s^3 6s^2 11s 6) num 6 den [1 6 11 6] G tf(num, den)num 是分子多项式系数den 是分母多项式系数行向量从最高次项排到常数项。这个顺序是 MATLAB 和 MWORKS 共同的规定填反了模型就完全不对。另一个高频坑是缺项补零如果分母是 s(s1)²(s3)展开后是 s⁴ 5s³ 9s² 7s常数项为 0den 必须写成[1 5 9 7 0]。漏掉结尾那个 0软件会默认常数项是 1模型直接变样。建立 ZPK 模型z [] # 系统没有零点空数组必须显式声明 p [-1 -2 -3] # 三个极点 k 6 Gzpk zpk(z, p, k)ZPK 模型的参数是零点向量 z、极点向量 p、增益 k。没有零点时 z 要写成空数组不能省略。这个模型的价值在于极点分布一眼可见三个极点全在左半平面系统的开环稳定性不需要额外计算就能判断。如果用 MATLAB 做同样的操作num 5; den [1 4 5 2]; Gtf tf(num, den); % 建立传递函数模型 Gzpk zpk(Gtf); % 转换为零极点增益模型 Gss ss(Gtf); % 转换为状态空间模型 Gtf1 tf(Gss); % 状态空间转回传递函数注意 tf、zpk、ss 三个函数在 MATLAB 里既可以用来「从参数新建模型」也可以用来「从已有模型做类型转换」。传入的参数类型不同函数行为就不同。传入 num、den 就是新建传入一个 LTI 对象就是转换。很多新手第一次用会把zpk(Gtf)误认为是新建一个零极点模型其实这是把传递函数对象转成零极点对象。2.3 模型互转的闭环验证ss 转 tf 时那串 1e-15 残差从哪来实验要求把给定传递函数转成状态空间再转回传递函数并与原传递函数比较。这个闭环验证是实验里最值得细看的环节因为结果往往不干净。我在 MATLAB 里跑完这段互转后看到的结果是这样的 tf(Gss) ans 8.88e-16 s^2 6.22e-15 s 5.0 ------------------------------- s^3 4.0 s^2 5.0 s 2.0分子多项式里多了 8.88e-16 和 6.22e-15 两个接近零的系数。这不是程序出 bug而是状态空间转换过程中的浮点舍入误差。ss() 函数为了把传递函数转换成能放进矩阵的形式内部做了因子分解分解之后再变换回来浮点误差就混进了分子系数。处理方式有两种。第一种是直接忽略1e-15 量级的系数在工程上完全可以当零看第二种是显示和后续分析之前手动做一次最小实现——用 minreal() 消除零极点对消和极小数项Gclean minreal(Gtf1);minreal 会把接近零的分子系数消掉得到干净的传递函数。我个人的习惯是每次模型互转之后强制走一遍 minreal再往后的伯德图、奈奎斯特图、阶跃响应才不会受这些残差干扰。这个动作花不了半秒钟但能省下不少排查曲线异常的时间。2.4 模型连接串联、并联与反馈的一行代码实现实验里给了两个子系统G1(s) (s1) / (s^2 4s 4) G2(s) 1 / (s1)要求求串联、并联、反馈连接后的整体传递函数。这一段在 MATLAB 和 MWORKS 里写法几乎一致num1 [1 1]; den1 [1 4 4]; G1 tf(num1, den1); num2 1; den2 [1 1]; G2 tf(num2, den2); G_series G1 * G2; % 串联传递函数相乘 G_parallel G1 G2; % 并联传递函数相加 G_feedback feedback(G1, G2); % 反馈默认负反馈串联是乘法并联是加法反馈用 feedback 函数。这里有个高频翻车点feedback(G1, G2) 的默认形式是负反馈闭环传函是 G1 / (1 G1*G2)。如果实际系统是正反馈必须写feedback(G1, G2, 1)第三个参数是正反馈标志。实验题里明确写了「单位负反馈」所以用默认形式没问题。但自己做课程设计时遇到正反馈回路忘了传 1稳定性结论会完全反过来。另外G1 和 G2 串联后理论上分子分母的 (s1) 应该对消。但 MATLAB 的乘法运算不会自动约分你需要手动跑 minreal 才能看到约分后的低阶模型。如果不做这一步你得到的传递函数阶次比理论值高后面的根轨迹分析和稳定性判定都会跟着偏。3. 时域分析从典型环节到二阶系统动态性能指标的完整流程3.1 五个典型环节的阶跃响应Simulink 建模与参数扫描实验二的内容是观察典型环节在单位阶跃信号下的输出响应。比例环节 G(s)K积分环节 G(s)K/s微分环节 G(s)Ts惯性环节 G(s)K/(Ts1)延迟环节 G(s)e^(-τs)。每个环节都要在 Simulink 里搭模型改变参数K0.1、1、10记录曲线。Simulink 建模的基础动作是固定的从 Simulink Library Browser 里拖出 Step信号源、Gain增益、Integrator积分器、Transfer Fcn传递函数、Scope示波器连线后双击各模块设置参数。积分环节的模型链是 Step → Gain → Integrator → ScopeGain 设为 K积分器默认 1/s。惯性环节用 Transfer Fcn 模块分子填[K]分母填[T 1]注意顺序是 T*s 1所以系数是[T 1]。做参数扫描时有一个值得养成的习惯K0.1、1、10 三组跑完不要只截图要把曲线的稳态值、时间常数变化记到实验表格里。比例环节 K 变大输出稳态值成倍放大积分环节 K 越大输出上升斜率越陡但稳态值始终无法到达常值——积分环节对阶跃输入没有稳态跟踪能力这是积分环节和比例环节最本质的区别。微分环节更特殊对阶跃输入理论上输出是一个脉冲但实际 Simulink 仿真中 Derivative 模块对阶跃信号的处理会受仿真步长影响跑出来的曲线可能是一串尖刺后面避坑章节会专门说这个。延迟环节则要单独用 Transport Delay 模块搭建参数 τ 就是延迟时间。这个环节的阶跃响应很容易确认输出曲线在时间轴上整体右移 τ 秒形状不变。仿真时 τ0.1、1、10 三组对比你直接能看出延迟对系统响应速度的拖累。3.2 二阶系统时域指标阻尼比与自然频率的独立影响二阶系统的闭环传递函数是W(s) ωn² / (s² 2ζωn s ωn²)实验要求做两组参数扫描第一组固定 ωn5ζ 取 0、0.5、0.707、1、1.5第二组固定 ζ取 0 到 1 之间的欠阻尼值比如 0.5ωn 取 0.5、1、3、5。对应的 MATLAB 参考代码zita 0.5; % 阻尼比 w 5; % 无阻尼振荡频率 num1 w * w; % 开环传递函数分子 den1 [1 2*zita*w 0]; % 开环传递函数分母 Gkai tf(num1, den1); % 开环传递函数 Gbi feedback(Gkai, 1); % 单位负反馈闭环 step(Gbi); % 绘制阶跃响应 grid on; % 打开网格方便读数关键在开环传递函数的构造。二阶系统开环是 ωn² / (s(s 2ζωn))分母多项式写成[1 2*zita*w 0]最后的 0 对应常数项——因为开环分母没有常数项。反馈之后闭环自然得到 ωn² / (s² 2ζωn s ωn²)。跑完几组对比最直观的结论是ζ 越小超调量越大。ζ0 时系统等幅振荡永不停歇ζ0.5 时超调约 16.3%响应有衰减振荡ζ0.707 时超调约 4.3%工程上常说的「最佳阻尼比」就是它ζ1 时临界阻尼无超调ζ1.5 时过阻尼响应缓慢但绝对稳定。ωn 影响的则是响应速度——ωn 越大上升时间越短但超调量基本不变。阻尼比 ζ超调量 σ%系统行为0100%等幅振荡临界稳定0.5约 16.3%欠阻尼衰减振荡0.707约 4.3%欠阻尼最佳工程参数10%临界阻尼无超调1.50%过阻尼响应变慢指标提取可以直接在 step 图上做在 Figure 窗口右键选择 Characteristics → Peak Response、Rise Time、Settling TimeMATLAB 会自动标出对应点和数值。这个方法只适用于 MATLAB 的 Figure 窗口。如果你把数据导出到其他绘图工具就需要自己写代码找峰值和时间麻烦得多。3.3 step、lsim、initial 的调用边界与稳定性判断除了阶跃响应实验还要求用 lsim 求任意输入下的响应用 initial 求零输入响应。这三个函数的调用格式有共性也有差异G ss(A, B, C, D); % 先建立状态空间模型 t 0:0.5:10; % 时间向量 [y_step, t_step] step(G, t); % 阶跃响应 u ones(size(t)); % 构造输入向量 [y_lsim, t_lsim] lsim(G, u, t); % 任意输入响应 x0 [1; -1]; % 初始状态 [y_initial, t_initial, x] initial(G, x0, t); % 零输入响应step 和 lsim 的区别在输入信号step 内部默认单位阶跃不需要你提供 ulsim 需要你构造一个和 t 等长的输入向量想模拟斜坡就写u t想模拟指数衰减就写u exp(-t)。initial 不需要输入向量但需要初始状态 x0。调用格式上有个细节如果用step(G)直接画图数据只在图里拿不到数值。想拿数据就要用带返回值的调用格式[y, t] step(G)。很多人在这一步被卡住以为函数没有返回数据其实是调用方式的问题。稳定性判断则用另一组函数pole(G) % 返回系统极点实部为负则稳定 eig(A) % 返回状态矩阵特征值 roots(den) % 返回多项式方程的解全部极点在左半平面也就是实部小于零系统渐近稳定。实验三里给了一个三阶系统特征方程 s³ 12s² 20s 20K 0用劳斯判据算出 0 K 12 时稳定K12 临界稳定K12 失稳。这个结论可以到 Simulink 里分别设 K6、12、18 验证——K12 时输出等幅振荡K18 时曲线直接发散。时域仿真和理论判据对上实验报告才算真正闭环。4. 频域分析奈奎斯特图、伯德图与由曲线反推传递函数4.1 奈奎斯特稳定判据绕 (-1, j0) 点的圈数决定闭环稳定性实验二的频域部分给了开环传递函数 Gk(s) 2 / (s³ 9s² 14s)要求用 nyquist 函数绘制奈奎斯特图根据奈奎斯特判据判断闭环稳定性再用 pole 函数验证闭环极点。num [2]; den [1 9 14 0]; G tf(num, den); nyquist(G); grid on;奈奎斯特判据的核心表述开环稳定时闭环稳定的充要条件是奈奎斯特曲线不包围 (-1, j0) 点。这个系统的开环极点是 s0、-2、-7其中 s0 在虚轴上系统处于临界稳定状态。实际跑出来的曲线会从第三象限向上绕到第二象限K2 时曲线不包围 (-1, j0)闭环稳定。把增益 K 调大曲线向外扩张就会开始包围 (-1, j0)闭环失稳。这个 K 的临界值和实验三里用劳斯判据算出的 K12 是对得上的——同一个系统时域和频域的稳定性结论必须一致。这是一个很好的自查点如果两个方法得出不同的稳定性结论先回头检查开环传递函数是否建对了。用 pole 验证闭环极点Gbi feedback(G, 1); pole(Gbi)观察闭环极点的实部符号全负则稳定。奈奎斯特判据和极点判据结论一致时实验报告的思考题「叙述奈奎斯特稳定性判据」就能用一句话写清楚开环稳定且曲线绕开临界点闭环就稳定。4.2 伯德图与 margin 函数幅值裕度、相角裕度怎么读频域分析的第二个工具是伯德图。bode 函数绘制幅频和相频两条曲线margin 函数在图上直接标出关键指标bode(G); margin(G);margin 返回四个参数幅值裕度 Gm、相角裕度 Pm、幅值穿越频率 Wcg、相位穿越频率 Wcp。幅值裕度大于 1换算成 dB 是正数且相角裕度大于 0系统稳定。这两个裕度是控制系统设计的核心指标——串联校正的目标就是让相角裕度落在 40° 到 60° 之间幅值裕度在 6dB 以上。这组数字在工程里几乎是通用的经验值写实验报告的分析部分可以直接引用。用带返回值的调用可以拿到精确数值[Gm, Pm, Wcg, Wcp] margin(G); fprintf(幅值裕度: %.3f dB\n, 20*log10(Gm)); fprintf(相角裕度: %.3f deg\n, Pm);注意 margin 返回的 Gm 是比值不是 dB。想用 dB 读要自己乘 20*log10。这个小细节在实验报告里写错单位的人不在少数我见过好几份报告把幅值裕度 3.2 直接写成 3.2dB实际应该是约 10dB。4.3 从频率特性曲线反推传递函数半圆法确定 K 与 T实验四要求用实测方法测一阶惯性环节 G(s) K/(Ts1) 的频率特性曲线再反推 K 和 T。方法本身很有几何直觉一阶惯性环节的幅相频率特性曲线是一个半圆直径就是增益 K因为低频时幅值 r(0) K曲线上任取一点 ωk时间常数 T tg(φk) / ωk。实验给出的参数是 R200kΩ、R0200kΩ、C1μF对应 G(s) 1/(0.2s1)。仿真频率特性时用 nyquist 或 bode 都行num [1]; den [0.2 1]; G tf(num, den); nyquist(G); % 观察半圆形状 bode(G); % 观察幅频相频曲线这里有一个实操要点bode 函数默认自动选择频率范围有时低频段取点不足曲线在起始段不够平滑。我一般会手动指定频率向量w logspace(-2, 2, 500); % 0.01 到 100 rad/s共 500 个点 bode(G, w);logspace 生成对数均匀分布的频率点保证低频和高频都覆盖到。测量频率特性时这个习惯特别重要——频率范围选不对半圆形状都画不完整反推 K 和 T 自然就不准。5. 避坑指南双平台建模与仿真中五个高频翻车点5.1 现象MWORKS 里using TyControlSystems之后 tf 仍然报未定义原因MWORKS 的 Julia 环境里 TyControlSystems 包没有安装或者没加载成功。很多人打开命令行直接敲 tf(num, den)完全忽略环境准备这一步结果自然报错。解决首次使用先执行using Pkg Pkg.add(TyControlSystems) using TyControlSystems环境就绪后 tf 函数才能正常识别。另外注意 MWORKS 自带的 Julia 环境可能和社区版 Julia 不兼容优先在 MWORKS 自带的命令行里跑不要自己另装环境。5.2 现象feedback() 连接后系统阶跃响应直接发散原因feedback(G1, G2) 默认负反馈如果实际系统是正反馈不指定第三个参数闭环传递函数就差一个符号极点位置完全错位。越反馈越放大输出自然发散。解决正反馈写成feedback(G1, G2, 1)。搭建模型前先看方块图里比较环节的符号负号走默认正号必须显式传 1。这个参数不值钱但忘掉的代价是整个系统仿真结果作废。5.3 现象step 响应曲线毛刺严重超调量读数不准原因仿真步长太大或者系统里含微分环节高频噪声被放大。Simulink 里用 Derivative 模块时尤其明显默认步长下输出就是锯齿波右键 Characteristics 标出的超调量完全是错的。解决Simulink 里把求解器改成可变步长 ode45并在 Configuration Parameters 里设置最大步长上限比如 0.01 秒。MATLAB 里跑 step 之前用t 0:0.01:10指定时间向量步长足够细曲线就平滑了。微分环节更要小心——能不用 Derivative 模块就不用用近似传递函数 s/(T*s1) 代替T 取 0.001 量级效果接近且数值稳定得多。5.4 现象模型互转后传递函数分子出现 1e-15 级残差原因状态空间转换过程中的浮点舍入误差。ss() 函数内部做了矩阵分解转换回传递函数时约分不干净微小残差就留在分子系数里。这不是 bug但会影响后续分析的观感。解决每次模型互转之后强制跑minreal(G)消除零极点对消和极小数项。这个动作应该成为肌肉记忆——转换之后不清洗后面积累的误差会越来越多。5.5 现象Simulink 里惯性环节仿真曲线和理论曲线差很多原因Transfer Fcn 模块的参数填反了。惯性环节 G(s) K/(Ts1)分子填 [K]分母填 [T 1]。如果把分母填成 [1 T]等于把时间常数位置放错曲线形状完全不对。解决写完模型先做一次手算验证。比如 T1、K1 时阶跃响应稳态值应为 1时间常数约 1 秒。如果稳态值不对先查 Gain 模块参数再查 Transfer Fcn 的分子分母顺序。多一个验证动作就能少一次糊涂的仿真排错。6. 把实验资源接到课程设计串联校正与 EF-Servo 集成滤波的实战技巧6.1 串联校正三步走margin 取裕度、算补偿相位、定环节参数实验五的系统串联校正是整套资料里工程价值最高的部分。校正的流程固定为三步先用 margin 拿到原始系统的增益裕度和相角裕度再算出需要补偿的相位最后确定校正环节的零点和极点位置。G tf(num, den); [Gm, Pm, Wcg, Wcp] margin(G); % 期望相角裕度假设为 50 度 phi_need 50 - Pm 10; % 加 10 度补偿高频衰减需要补偿的相位 φ 等于期望相角裕度减去当前相角裕度再加上 5 到 12 度的余量。这个余量是给校正环节自身带来的相位衰减留的。确定 φ 之后按超前校正的公式计算零点频率和极点频率搭建校正环节再用 feedback 验证校正后的闭环阶跃响应和 margin 指标。整个过程就是把实验二到实验四的工具全部复用一遍——建模、时域分析、频域分析、稳定性判定一气呵成。6.2 EF-Servo 集成与滤波把全部知识串起来实验六的 EF-Servo 集成及滤波核心是在 Simulink 里搭伺服系统的位置环和速度环并在反馈回路上加低通滤波器。这个实验把所有前面的知识点串到了一起数学模型建立、时域响应分析、频域稳定性判定、串联校正最后落到滤波器参数对系统带宽的影响上。滤波器截止频率太低系统的相角裕度会被吃掉稳定性变差截止频率太高噪声抑制效果又不理想。这个权衡关系只有亲手调过参数才能体会。从那以后我每次做完这类控制系统实验都会强制走一遍「模型互转 → minreal 清洗 → 阶跃响应验证 → margin 裕度检查」四步流程。任何一步出现异常先怀疑参数再看连接最后查数值残差。按这个顺序排查仿真翻车的概率低了很多。希望这些细节能帮你在做这套实验时少走几步弯路把时间花在读曲线、分析系统行为上而不是耗在环境报错和参数填反上。本文还有配套的精品资源点击获取