
简介一套基于MATLAB的鲁棒控制器设计实例面向控制工程初学者及需要完成相关课程设计的学生可帮助理解鲁棒控制在实际系统中的应用。程序演示了一个实际系统的鲁棒控制器设计流程涵盖系统建模、控制器综合、仿真验证等关键环节代码经过运行验证替换数据即可用于自己的研究对象方便快速上手实践。资源包共2个文件包含1个MATLAB程序文件和1份使用说明文档压缩包仅13KB结构紧凑便于下载阅读和按文档逐步操作。说明文档对设计步骤、参数含义、运行环境及操作流程作了简明介绍配合运行结果效果图能有效降低初学者在环境配置和程序调试上的障碍让使用者将更多精力放在控制器设计与分析本身。已有114人学习浏览是入门鲁棒控制器设计的不错参考适合课程作业、毕业设计或自学项目学习借鉴。1. 这个实例程序要回答的不是“怎么稳定”而是“模型不准时怎么办”当手里只有一个线性对象常规状态反馈在名义模型上很漂亮参数一变就发散这种场景做控制的人多半见过。标题里的鲁棒控制器设计程序就是把“模型不准”这件事实建模成不确定块用ureal描述参数摄动用ultidyn描述未建模动态再做 H∞ 混合灵敏度或 μ 综合最后用robstab告诉你稳定性还能撑多远。这个 .zip 最值钱的不是某个调好的 K而是这条从建模、加权到验证的完整链路以及一份教初学者怎么改参数的说明。下文按实际做这类项目的顺序把每一步的落法和常见卡点讲清楚最后给一个能继续深入的练习。2. 鲁棒控制理论里必须拿住的三个点小增益、H∞ 范数与 μ 综合2.1 小增益定理决定“鲁棒”二字的数学含义小增益定理名字听起来论文味十足但它解决的是实际工程里最常见的问题我们只知道摄动属于某个集合不知道具体值。把闭环系统的标称部分记为 M不确定部分记为 Δ系统稳定的充分条件是||M||∞ * ||Δ||∞ 1。当把 Δ 归一化成范数不超过 1 的集合时设计条件自然变成||M||∞ 1其中 M 通常是从扰动输入 w 到被控输出 z 的闭环传递矩阵。这样一来“鲁棒”不再是一句定性的口号而是一个可计算的指标只要算出某一个特定闭环传递矩阵的 H∞ 范数就知道系统对所有预设摄动是否稳定。这也是为什么现代鲁棒控制工具箱会围绕hinfnorm、hinfsyn、wcgain这一组命令展开。初学阶段可以先把定理本身放一放但“把范数压过 1”这个量化思维方式要最先建立否则后面看robstab输出的LowerBound时会不知道它在说什么。2.2 H∞ 混合灵敏度与 μ 综合的分工H∞ 混合灵敏度设计的目标是让|| col(Wp*S, Wu*KS, Wt*T) ||∞尽量小。这个式子里的三条链路分别对应三类工程要求Wp*S管性能意思是从参考输入到误差的传递要小Wu*KS管控制能量防止控制器在高频段放大噪声Wt*T管鲁棒性把对象乘性不确定性限制在一个允许范围内。三条通道在频域上天然冲突因为 S 加 T 等于 1权重的作用就是分配频率段让性能、鲁棒和控制能量各占一块。当对象同时存在参数摄动和未建模动态时H∞ 会把所有不确定性当成一个完整频带的复摄动块来处理得到的结论往往偏保守。μ 综合用结构化奇异值 μ 来度量给定块结构下的最坏情况D-K 迭代做的就是交替进行尺度变换和 H∞ 综合。两类方法没有绝对优劣只有适合与不适合实际选择逻辑可以参考下表。设计方法适用对象保守性计算代价样例程序包里的角色H∞ 混合灵敏度mixsyn参数范围清晰、不确定块少中等低秒级主流程先跑通链路μ 综合dksyn参数块与动态块混合较低高几十秒到分钟级对照实验与精调使用无论走哪条路控制器求解都强依赖加权函数的形状因为权重是工程要求转换成范数指标的唯一通道。所以新手拿到一个“鲁棒控制器设计程序”第一个要拆解的往往不是求解代码而是Wp、Wu、Wt这三个传递函数是怎么来的。2.3 从旧 LMI 脚本到现代 uss 对象样例程序的选型线索早期鲁棒控制课程里常见的是手写矩阵 M 和 Δ再用lft封装配合 LMI 工具箱的hinfopt、muopt求解。这套写法对理解理论有帮助但查错成本高参数一多就分不清哪个块对应哪个物理量。现在 MATLAB 的推荐路径是用ureal、ultidyn生成不确定元素再组合成USS对象后续的hinfsyn、dksyn、robstab都直接以它为输入代码与模型一一对应。样例程序如果当年是用老式写法写的移植时第一件事就是把对象建模独立成一个函数例如init_model.m返回标称对象G0和不确定对象G_unc。这样后续换对象、换不确定性范围只改一个文件控制器求解脚本基本不用动。这个结构上的取舍比背任何一条命令都更能提升长期维护效率。3. 从真实对象到 MATLAB 不确定模型参数摄动与动态不确定性怎么建模3.1 用 ureal 把二阶对象写成“一个范围”而不是“一个点”鲁棒控制的第一步不是综合控制器而是定义“鲁棒”到底覆盖哪些不确定性。以一个弹簧-质量-阻尼型二阶对象为例自然频率和阻尼比通常是变动的直接用tf写死参数后面所有的鲁棒性分析都无从谈起。下面这段代码定义了一个同时带有频率和阻尼摄动的对象。% 自然频率在 9~11 rad/s 之间变化标称值 10 wn ureal(wn, 10, Percentage, 10); % 阻尼比取 0.2~0.4中点 0.3 zeta ureal(zeta, 0.3, Range, [0.2 0.4]); % wn、zeta 是不确定量tf 自动生成 USS 对象 G tf(wn^2, [1 2*zeta*wn wn^2]); G0 G.NominalValue; % 名义模型用于后续 H∞ 综合ureal的第一个参数是块名称后续分析报告里会显示这个名字。Percentage表示以标称值为中心的百分比摄动Range则直接给出上下界工具箱会自动把范围换算成归一化摄动半径。tf在分子分母出现不确定变量时会生成一个USS对象而不是普通tf对象这一点可以随时用class(G)确认。定义完不确定对象后建议先画一次样本族看看模型集合是否覆盖了你心里的物理范围。bode(usample(G, 12), {1e-1, 1e3}); grid on;这一行就能把 12 组随机样本的频率特性叠在一张图上。如果高频段曲线散得太开说明参数摄动范围设得偏大后续控制器会很难满足性能指标。3.2 用 Wt 和 ultidyn 补上未建模动态参数摄动解决的是“值不准”而未建模动态解决的是“阶次不对”。实际被控对象在高频段总有被忽略的谐振、时滞或传感器动态这些很难用某个物理参数建模习惯做法是把它表述成一个范数有界的动态不确定性块。乘性相对误差模型G_unc G0 * (1 Wt * Delta)是业界最常见的形式。% Delta 是范数不超过 1 的 LTI 动态不确定性 Delta ultidyn(Delta, [1 1], Bound, 1); % Wt 在低频约 0.1高频约 5转折频率约 1 rad/s Wt tf([0.05 0.1], [0.01 1]); % 同时含参数摄动和动态不确定性的对象 G_unc G * (1 Wt * Delta);ultidyn生成的是一个未知 LTI 系统集合Bound指定其 H∞ 范数上界。Wt的作用是对这个集合做频域整形低频段幅值代表低频建模误差水平高频段幅值代表高频未建模动态的上界。这里把低频定在 10%高频定在 5 倍转折频率放在系统带宽附近是一组对大多数机械对象合理的初值。注意G_unc中既有ureal参数块又有ultidyn动态块。robstab和dksyn都会自动识别这种块结构按结构化奇异值的逻辑处理而不是把所有不确定性混成一个全块复摄动。3.3 加权函数 Wp/Wu/Wt 的一套可抄参数表和调节逻辑加权函数是鲁棒控制器设计中最容易让人卡住的部分。网上很多代码直接把三个tf写在主脚本里参数含义全靠注释初学着改完 gamma 还是 5根本不知道动谁。下面是一套我常用的初始配置覆盖大多数中等带宽的控制对象。权重推荐初值形式角色调参方向Wp(s/M wb) / (s wb*eps)M1.5wb2eps1e-3限制灵敏度峰值和带宽wb 越小越易满足eps 过小会让控制器高频增益变大Wu0.2或(0.1*s 2) / (s 50)限制控制信号高频增益高频幅值调大控制器输出更钝Wt(0.05*s 0.1) / (0.01*s 1)描述乘性建模误差低频值等于认为的低频误差比例高频值应大于 1Wp的三个参数有明确物理含义M 是灵敏度峰值上界工程上取 1.3 到 2wb 是你期望的闭环带宽eps 是允许的稳态误差取 1e-3 已经足够严格再小对时域响应没有肉眼可见的改善只会拉高控制器高频增益。调试时建议先固定Wu和Wt只改Wp观察info.gamma和灵敏度曲线变化一次只动一个变量。权重传递函数必须是稳定的最小相位系统这是初学者容易忽略的约束。有人在Wp里放了一个右半平面零点结果mixsyn返回一个阶数奇高的控制器还以为是对象出了问题。提示加权函数是设计意图的载体。gamma 大于 2 时不要急着换求解器先回头检查 Wp 的 wb 和 M。4. 综合出鲁棒控制器mixsyn、hinfsyn 与 dksyn 的配合用法4.1 用 augw 组加权增广对象再用 mixsyn 直接求 H∞ 控制器有了对象和权重下一步是把三个权重加到对象上形成标准增广对象然后调用mixsyn一次求解。mixsyn是混合灵敏度问题的最简入口内部会做正则化并调用hinfsyn核心算法对初学者最友好。% M、wb、eps 参考 3.3 节的初值 M 1.5; wb 2; eps 1e-3; Wp tf([1/M, wb], [1, wb*eps]); Wu 0.2; Wt tf([0.05 0.1], [0.01 1]); % 增广对象输出依次对应 Wp*S、Wu*KS、Wt*T P augw(G0, Wp, Wu, Wt); [K_hinf, CL_hinf, info_hinf] mixsyn(G0, Wp, Wu, Wt); % 检查灵敏度曲线是否落在 1/Wp 之下 figure; sigma(CL_hinf.S, CL_hinf.KS, CL_hinf.T, 1/Wp, logspace(-2, 3, 300)); legend(S, KS, T, 1/Wp); grid on; title(H∞ 混合灵敏度结果);CL_hinf是混合灵敏度闭环的封装结构体包含S、KS、T三个传递函数可以直接交给sigma绘图。判断标准很简单S 曲线在 1/Wp 之下说明灵敏度指标满足KS 高段被 Wu 的形状压住控制量不会在噪声激励下失控。info_hinf.gamma是求解器给出的最终 H∞ 范数上界通常认为小于 1.5 是可接受的设计接近 1 说明设计裕度和性能要求刚好卡在临界。augw和mixsyn本质是同一个问题的两种表达。用augw得到 P 后也可以调用通用接口[K, CL, gam] hinfsyn(P, 1, 1);其中两个 1 分别是被测输出个数和控制输入个数。对于 SISO 对象这两种写法结果几乎一致差别只在info结构和个别数值处理上。4.2 γ 值、控制器阶数与三个必调参数跑通第一版后常见的情况是 gamma 在 2 到 5 之间或者灵敏度曲线在某一段明显超出边界。此时不必急着换算法先把下列参数逐个调整并记录 gamma 变化。参数调小效果调大效果首次调整幅度wbgamma 下降带宽变窄响应变慢gamma 上升带宽变宽响应变快每次乘 0.5 或 2M灵敏度峰值约束变严gamma 上升峰值约束放宽gamma 下降每次改 0.25Wu控制作用更激进高频增益变高控制作用更温和gamma 可能上升每次乘 2 或除 2如果 gamma 已经小于 1 但控制器阶数过高例如对象是三阶、权重各一阶合起来得到七阶或更高可以用reduce降阶。reduce在 R2016a 之后可用更早版本对应balred。降阶后必须重新跑一次闭环仿真不能只看频域曲线。H∞ 混合灵敏度控制器阶数等于广义对象阶数之和这是初学者最容易忽略的事实。降阶时一般先试降到 3 到 4 阶然后对比降阶前后 S/T 曲线如果低频段完全重合、高频段有少量偏差且robstab结果仍大于 1就可以接受。4.3 参数块多了之后切到 dksyn 做 μ 综合当对象同时有ureal和ultidyn两种块且块数量超过三个时H∞ 综合往往因为把所有块都视为复摄动而给出过大的 gamma。这时候把综合器换成dksyn让求解器按块结构迭代计算 μ通常会得到更贴近实际的设计。% G_unc 来自 3.2 节包含参数块与动态块 P_unc augw(G_unc, Wp, Wu, Wt); % D-K 迭代默认迭代次数上限一般是 10 次 [K_mu, CL_mu, info_mu] dksyn(P_unc); % μ 控制器阶数通常更高先降到 4 阶再验证 [K_mu_red, info_red] reduce(K_mu, 4);dksyn在每次迭代中会更新 D 尺度然后重新求解一个 H∞ 问题因此耗时远高于mixsyn。info_mu.gamma记录了迭代最终上界如果连续两轮迭代 gamma 下降小于 5%继续迭代的意义就不大了。值得注意的是dksyn对增广对象里的不确定块数量敏感块太多时 D-K 迭代容易在局部抖动这时可以适当减少动态不确定块或者把两个物理参数合并成一个等效不确定参数。提示μ 综合得到的 gamma 比 H∞ 小并不自动说明控制器更好还要看降阶后鲁棒稳定裕度和控制量幅值是否仍然可接受。5. 鲁棒性能的验证链路robstab、robgain 与不确定闭环仿真5.1 robstab 算稳定裕度robgain 找最坏共振点综合完成不代表设计结束验证才是鲁棒控制里真正区分“会跑脚本”和“会做设计”的分水岭。robstab接受一个带不确定块的闭环系统返回在预设不确定集内能保证稳定的最大摄动倍数。% 用 H∞ 控制器组成不确定闭环 CL_unc_hinf feedback(G_unc * K_hinf, 1); % 返回稳定性裕度LowerBound 1 说明对所有预设摄动都稳定 [stabmarg, wcu] robstab(CL_unc_hinf); fprintf(鲁棒稳定下界: %.3f\n, stabmarg.LowerBound);stabmarg.LowerBound小于 1 时wcu里保存的是最接近临界失稳的一组参数组合。把这组参数导出来看如果某个不确定块的值刚好顶到边界就说明是该物理量主导了稳定性风险如果所有参数都还在范围内但已经失稳则是控制器与对象的高频动态配合出了问题要优先检查Wt的转折频率。鲁棒性能和鲁棒稳定性是两回事。稳定性检查通过后还需要验证带扰动时闭环输出是否仍满足性能约束。常见做法是把加权闭环CL_perf lft(P_unc, K_hinf)交给robgain它会搜索所有频率上最坏情况下的增益峰值。% 加权闭环性能输出 z 是 Wp*S、Wu*KS、Wt*T 的组合 CL_perf lft(P_unc, K_hinf); [perfmarg, wcu_perf] robgain(CL_perf); fprintf(鲁棒性能下界: %.3f\n, perfmarg.LowerBound);perfmarg.LowerBound大于 1 说明存在某一组摄动让加权性能指标超标小于 1 则说明全部预设摄动下性能都在界内。初学者可以对比hinfnorm(CL_perf.NominalValue)和perfmarg.LowerBound两个数之间的差距就是不确定性带来的性能退化量。5.2 抽样与批量仿真的正确姿势频域指标满足后习惯上还要补一组时域抽样仿真目的是直观看到阶跃响应在不同参数组合下的分散情况以及控制量是否超出执行器能力。t 0:0.01:10; rng(1); % 固定随机种子保证每次运行结果可复现 figure; hold on; for i 1:15 Gi usample(G_unc); y lsim(feedback(Gi * K_hinf, 1), ones(size(t)), t); plot(t, y); end grid on; title(15 组参数摄动下的阶跃响应);usample每次抽取一组不确定参数实值包括ureal范围内的参数和ultidyn球内的一个 LTI 系统。15 组样本足够观察响应带宽的离散度如果曲线族之间差别过大说明权重给的边界偏宽如果个别曲线出现明显振荡尾巴要看这个样本对应的阻尼比和自然频率是否在实际物理范围边缘。抽样仿真最常见的错误是只画输出不画控制量。控制器鲁棒性增强往往伴随控制量峰值上升lsim在循环里同时保存u绘成第二张子图才能判断控制器是否在真实执行器限幅之下。5.3 初学最容易踩的三个坑第一个坑是直接对USS对象调用hinfsyn。hinfsyn需要的是标称 LTI 对象要求广义对象的 D 矩阵满足秩条件。运行报错时先确认两条增广对象是否由augw生成以及对象输入输出维数与hinfsyn(P, nmeas, ncont)里的参数是否一致。第二个坑是不检查权重频率范围。Wt的高频幅值如果只有 0.5意味着你默认未建模动态只有 50%而实际对象在高频可能存在谐振峰验证阶段robstab就会暴露出失稳。低频模型误差和高频未建模动态要分开设不能用一个常数混过去。第三个坑是把ureal的Range和标称值写得不一致。ureal(zeta, 0.3, Range, [0.15 0.45])的名义值确实是 0.3但等你打印G.NominalValue发现阻尼比偏离预期就说明你把百分号和范围混用了。检查NominalValue是最便宜的排错动作没有之一。6. 把样例整理成“能跑、能改、能交付”的入门工程6.1 程序包的文件安排与各自职责标题里的 .zip 包含程序和说明文档程序包的组织方式决定了初学者能不能快速上手。常见做法是把对象建模、权重设置、控制器综合、验证绘图拆成四个文件而不是把所有代码堆在一个main.m里。文件职责关键输出init_model.m定义 G0、G_unc、参数摄动范围返回 model 结构体weights.m定义 Wp、Wu、Wt返回 weight 结构体run_hinf.m执行 mixsyn 综合并绘图返回 K_hinf、info_hinfrun_validate.m执行 robstab、robgain、抽样仿真打印裕度并输出图文件每个文件长度控制在 80 行以内头部注释写清楚“改了哪里会影响什么”。初学者拿到后第一件事不是读代码而是打开run_hinf.m跑通再打开weights.m改一个数跑run_validate.m看裕度变化这个过程比任何讲解都有效。6.2 使用说明文档里应该写清的五件事使用说明文档不用长篇大论但必须包含五部分运行环境要求、快速开始步骤、参数定义表、脚本输出说明、常见报错对照。运行环境这一项最容易漏实际写清楚“MATLAB R2020a 及以上需要 Robust Control Toolbox 与 Control System Toolbox”就够了不需要贴安装教程。参数定义表直接复用第 3.3 节的权重表格再加上ureal摄动范围。常见报错对照段至少写三条hinfsyn报秩条件错误说明对象通道数不对dksyn报迭代不收敛说明权重太高robstab报数值病态说明频率范围设得太大。文档里给一个最小可改点把wb从 2 改成 1重新运行整个流程看 gamma 和阶跃响应如何变化。6.3 一个进阶练习让优化工具箱替你做参数扫描手动调wb能建立直觉但效率有限。安装了优化工具箱的话可以用fminbnd在目标带宽附近自动搜索让wb成为设计变量gamma 成为目标函数。% 把 Wp 的构造和 mixsyn 求解封装成目标函数 function gam design_cost(wb, G0, Wu, Wt, M, eps) Wp tf([1/M, wb], [1, wb*eps]); [~, ~, info] mixsyn(G0, Wp, Wu, Wt); gam info.gamma; end M 1.5; eps 1e-3; wb_star fminbnd((x) design_cost(x, G0, Wu, Wt, M, eps), 0.5, 5);fminbnd在[0.5, 5]区间内搜索使 gamma 最小的 wb。注意目标函数里只包了名义 H∞ 综合搜索出来的结果还要回到run_validate.m里做robstab和robgain验证。把wb_star替换回run_hinf.m再看perfmarg.LowerBound是否比手调时更接近 1。这个练习做完你就真正理解了“设计变量、性能指标、约束条件”三个词在鲁棒控制里分别对应哪些代码而不是在照着样例抄。本文还有配套的精品资源点击获取