
简介面向控制系统研究与实践的H∞鲁棒控制MATLAB设计资源适合需要掌握H∞控制器设计方法与鲁棒性分析的工程师、研究生及自动化学子。这份压缩包仅含1个m脚本整体大小约9KB轻量而聚焦以H_infinity_Design.m为核心覆盖状态空间建模、不确定性模型描述如参数变化、模型简化误差、输出跟踪误差与输入约束等性能指标设定以及调用hinfsyn/hinfstruct完成控制器求解与仿真的完整流程。当前已有741人学习下载。通过运行该脚本可直观理解H∞范数优化与干扰抑制的核心原理并获得一套可直接套用的H∞控制器设计模板结合Bode图、根轨迹等结果分析能深入体会模型不确定性影响下的稳定性与性能权衡适用于航空航天、电力系统、机器人控制等复杂场景的鲁棒控制方案快速验证与学习。1. 打开 H_infinity_Design.rar 之前先想清楚要控什么接手一个带弹簧和结构模态的快速定位台时我第一反应不是去调 PID 参数而是先把对象传递函数拉出来扫一遍 bode 图。H∞ 控制器这个名字听着像博士论文专用实际上它解决的就一句话在标称模型和真实对象之间有偏差的前提下设计一个仍然稳定的控制器并顺手把低频扰动按住。网上流传的 H_infinity_Design.rar 这类代码包跑通 hinfsyn 只是一行命令的事真正让新手卡住的永远是加权函数 W1/W2/W3 该给什么量级以及 GAM 输出大于 1 时到底该改哪里。本文按广义对象建模、加权函数初值、hinfsyn 求解、闭环验证、降阶离散五步把一套 SISO 的鲁棒控制流程完整走一遍。适合手里已有对象模型、想在 MATLAB 里快速拿到可对比基线的工程师。2. H∞控制的广义对象与加权函数先把 w、z、u、y 对清楚2.1 广义对象 P(s) 的输入输出结构H∞ 标准问题里广义被控对象 P 不是物理对象 G 本身而是把外部输入 w、控制输入 u 映射到性能输出 z 和量测输出 y 的增广系统。物理对象 G 单独放在一边加权函数以串联或并联方式挂上去就构成了 P。换句话说H∞ 设计的自由度不在 P 本身而在你如何选择 w 和 z 这两个通道。标准混合灵敏度结构下外部输入取参考信号 r性能输出拆成三个w: r 参考输入 z1: W1 * (r-y) 加权后的跟踪误差 z2: W2 * u 加权后的控制量 z3: W3 * y 加权后的被控输出 u: u 控制输入 y: y 量测输出在 MATLAB 里 P 不需要手工推算用augw一行组装% 标准混合灵敏度结构z1 W1*(r-y), z2 W2*u, z3 W3*y P augw(G, W1, W2, W3); size(P)augw的调用形式是augw(G, W1, W2, W3)其中 G、W1、W2、W3 用 tf、ss 或 zpk 都能传内部自动统一成状态空间模型。输出通道的顺序严格按 W1、W2、W3 排列后面用hinfsyn求解时不用再管这个顺序但如果你改用connect手工搭 P必须保持同样的约定。某个位置写成[]表示该通道不加权重比如augw(G, W1, [], W3)就是不约束控制量。这个结构的巧妙之处在于设计目标最终等价于让闭环传递函数从 w 到 z 的 H∞ 范数小于 1也就是下面三个条件同时满足‖W1·S‖∞ 1、‖W2·KS‖∞ 1、‖W3·T‖∞ 1。S 是灵敏度函数 1/(1GK)T 是补灵敏度函数 1-S。这样 H∞ 设计就从抽象的范数优化变成了给 S 画天花板、给 T 画天花板物理意义直接可读。2.2 灵敏度函数 S 与补灵敏度函数 T 的折中S 和 T 不是两个独立指标它们在任何频率上都满足 S T 1。低频段希望 S 小这样参考跟踪和低频扰动抑制好高频段希望 T 小这样量测噪声和未建模动态不会通过反馈回路放大。但两者之和恒为 1强制压低低频 S 会让 S 和 T 的交叉区域出现峰值这个峰值直接对应闭环的幅值裕度和相位裕度。工程上我一般这么判断S 的峰值低于 2约 6 dB闭环基本不会出现难以接受的振荡峰超过 3 就要回头调整 W1 里的 M 参数。M 在加权函数里就是你允许 S 尖峰能长多高的上限设计时先给 1.5 到 2不要追求特别小否则控制器会为压制峰值付出过大的高频增益代价。T 的高频滚降速度决定了系统对传感器噪声的敏感度。W3 选一阶高通通常就够滚降斜率不追求陡峭因为每多一个极点就多一阶控制器阶数。这个取舍会在第 3 章的算例里体现出来。2.3 加权函数初值W1 看带宽、W2 看执行机构、W3 看未建模频段加权函数没有唯一正确答案但有一套能落地的经验初值。下表是我在 SISO 对象上常用的第一轮设置。加权函数约束的闭环量典型传递函数形式第一轮初值调节方向W1S(s/M wb) / (s wb·A)wb5, M2, A1e-3想要更快带宽就加大 wbW2KS常数或高通0.05控制量抖动就加大 W2W3Ts / (s w3)w3150高频不确定大就把 w3 调低W1 形式里的 wb 是期望的闭环带宽M 是 S 峰值上限A 是期望的稳态误差下界。比如 wb5、M2、A1e-3相当于要求系统带宽做到 5 rad/s 附近稳态误差小于 0.1%同时允许 S 在穿越区有一个约 6 dB 的峰。这几个参数是耦合的单纯调大 M 而不动 wb控制器增益变化很小真正改变性能的是 wb。W2 是最容易被忽略的一个。被控对象增益是 0.5 量级时W2 取常数 0.05 是合理的起点但如果你的执行机构是电压输入、被控量是转速对象增益可能到几十W2 直接套 0.05 会把控制量压到动不了。W2 的量级必须和对象直流增益对齐先算一下 K 在低频需要的增益再反推 W2 不迟。W3 的转折频率 w3 应该落在你确信模型准确频段的上边界之外。比如模型在 20 rad/s 有一个谐振峰而你确信这个峰建模得足够准w3 可以放到 150如果这个峰本身就不确定w3 就得压到 50 以下让控制器主动避开这个频段。2.4 一个带柔性模态的被控对象串起整套流程后面所有章节都用同一个对象。它由一个二阶刚性模态并联一个高频柔性模态组成类似伺服定位平台先经弹簧阻尼再叠加结构共振的动力学特征。%% 被控对象刚性运动 20 rad/s 柔性模态 m 1; % 质量 c 0.2; % 阻尼 k 2; % 刚度 G0 tf(1, [m c k]); % 刚性二阶系统 wr 20; % 谐振频率 zr 0.02; % 低阻尼 ar 0.05; % 模态参与系数 Gr ar * tf(wr^2, [1 2*zr*wr wr^2]); % 柔性模态 G G0 Gr;G0是典型的质量-弹簧-阻尼直流增益 0.5固有频率约 1.4 rad/s。Gr叠加了一个频率 20 rad/s、阻尼 0.02 的谐振峰谐振峰幅值约 1.25会让原始的 bode 图在 20 rad/s 处出现明显凸起。选这个对象是为了展示 W3 应该如何避开模型已知谐振同时约束更高频段的未知动态。3. 用 MATLAB 的 hinfsyn 求解 H∞控制器参数逐个拆开3.1 hinfsyn 函数签名与四个返回值hinfsyn是鲁棒控制工具箱里做 H∞ 综合的核心命令。它的标准调用形式是一行[K, CL, GAM, INFO] hinfsyn(P, nmeas, ncont, options);前两个参数nmeas和ncont是广义对象 P 的量测输出维度和控制输入维度。SISO 系统都是 1MIMO 系统按实际通道数填。这两个参数很容易填错填大了或者填小了hinfsyn会直接报维度不匹配或者算出一个莫名其妙的高阶控制器。几个返回值的含义返回值含义工程用途K求解出的 H∞ 控制器状态空间模型直接用于闭环仿真或导出CL闭环系统模型包含加权函数很少直接用通常自己重新搭闭环GAM达到的 γ 值γ ‖Tzw‖∞判断设计是否达标的核心指标INFO迭代过程信息调试用的关键现场INFO里值得看的是迭代轮数和每一步的 γ 变化。默认方法基于 γ 迭代求解 Riccati 方程每轮迭代会检查闭环是否稳定迭代不收敛时INFO会给出警告信息。对于病态加权矩阵或 MIMO 强耦合对象可以显式指定options切换算法options hinfsynOptions(Method, lmi, Display, on); [K, CL, GAM, INFO] hinfsyn(P, 1, 1, options);Method可选ric和lmi前者快、适合大多数 SISO 问题后者稳健但更慢。我的经验是状态空间矩阵条件数超过 1e6 时直接换 LMI 方法别跟 Riccati 迭代死磕。3.2 完整算例从对象到控制器一次跑通把第 2 章的被控对象和加权函数接到一起就是一套完整的 H∞ 控制器设计脚本。%% 被控对象与 2.4 节相同 m 1; c 0.2; k 2; G0 tf(1, [m c k]); wr 20; zr 0.02; ar 0.05; Gr ar * tf(wr^2, [1 2*zr*wr wr^2]); G G0 Gr; %% 加权函数W1 压低频 SW2 限控制量W3 约束高频 T wb 5; M 2; A 1e-3; W1 tf([1/M wb], [1 wb*A]); % (0.5s 5) / (s 0.005) W2 tf(0.05, 1); % 控制量加权 W3 tf([1 0], [1/150 1]); % s / (s 150) %% 组装广义对象并求解 H∞ 控制器 P augw(G, W1, W2, W3); [K, CL, GAM, INFO] hinfsyn(P, 1, 1);W1的低频增益是 1000意味着控制器会试图把闭环稳态误差压到参考输入的 0.1% 以内零点在 5 rad/s这是期望带宽的位置。W2保持常数 0.05对控制量做全局限制。W3在 150 rad/s 之前几乎不动作150 rad/s 之后快速抬升约束控制器的高频输出。运行后重点看GAM。理想情况是 GAM 落在 1 附近说明设计刚好压着约束边界。不同 MATLAB 版本依据线性代数库差异GAM 在 0.9 到 1.1 都算正常。如果 GAM 明显大于 1表示没有一个控制器能让所有加权约束同时满足这时先不要怀疑求解器回去改权重。3.3 GAM 不达标时先查这三处别急着换算法GAM 是诊断设计是否合理的最直接信号。大于 1 表示最坏情况下加权函数被突破小于 0.7 表示加权函数给得太松控制器白白牺牲了性能。我会按下面顺序排查看 S 和 T 的交叉频率。如果 S 在低频就已经贴近甚至超过 1/W1说明 W1 的带宽定得过高把 wb 从 5 降到 3 再试。看控制量通道。W2 取得太小会把控制器增益全面压死表现为 GAM 在低频段卡在 1.2 左右怎么迭代都下不来这时候把 W2 从 0.05 降到 0.02 试试。看 W3 转折频率。w3 太低会让 T 过早滚降控制器被迫在 20 rad/s 谐振峰附近做深度陷波控制器阶数高且 GAM 容易卡住。提示不要一上来就把 W1 整个放大。W1 的带宽和峰值是耦合的同时调两个变量只会让 GAM 来回跳。一次只动一个参数记录每次 GAM 的变化比盲目地试要快得多。4. 验证 H∞控制器从频域曲线到参数摄动下的鲁棒性4.1 用 sigma 检查 S 和 T 是否贴着加权函数走hinfsyn给出的 K 光看 GAM 不放心还要看频域曲线形状对不对。灵敏度函数 S 和补灵敏度函数 T 是最关键的两条曲线。S feedback(1, G*K); % 灵敏度函数 T 1 - S; % 补灵敏度函数 sigma(S, b, 1/W1, r--, T, g, {1e-2, 1e3}); legend(S, 1/W1, T); grid on;feedback(1, G*K)计算的是 1/(1GK)即从参考输入到误差的闭环传递函数。sigma的{1e-2, 1e3}指定频率范围从 0.01 到 1000 rad/s。判读这张图的要点有三个低频段 S 必须低于 1/W1 曲线且差距越大表示跟踪精度越高在 wb5 rad/s 附近S 和 1/W1 应该靠近但不交叉这个位置就是实际闭环带宽高频段 T 要随着 W3 一起下降如果 T 在 150 rad/s 之后还在 0 dB 附近徘徊说明控制器高频增益过高噪声会被放大。S 在中间频段的峰是一个额外检查点。峰越接近理论允许值 M2说明设计越紧峰明显低于 2说明还有性能富余可以把 wb 再调大一点换取更快的响应。4.2 时域验证阶跃响应和控制量峰值频域满足要求之后时域响应未必能直接接受尤其是控制量的峰值。控制器在压低 S 的同时会放大高频控制动作阶跃响应看着很干净但执行机构可能在物理上根本给不出那么大输出。t 0:0.01:20; figure; step(feedback(G*K, 1), t); % 参考到输出的闭环阶跃 ylim([0 1.4]); figure; Su K / (1 G*K); % 参考到控制量的闭环传递函数 step(Su, t); % 看控制量峰值Su K / (1 G*K)是从参考输入 r 到控制量 u 的闭环传递函数推导关系是 u K*(r - y) KSr而K/(1G*K)正是 K 乘 S 在 MATLAB 里的直接实现。控制量曲线的峰值如果超过执行机构限幅优先加大 W2 再做一轮设计。4.3 参数摄动下的鲁棒性测试ureal 与 robstabH∞ 理论保证的是范数意义下的鲁棒性但实际工程更关心参数变了 30% 之后系统还能不能稳住。这个用 MATLAB 不确定系统工具箱验证起来很直接。%% 把物理参数声明为不确定量 um ureal(m, 1, Range, [0.5 1.5]); uc ureal(c, 0.2, Range, [0.14 0.26]); uk ureal(k, 2, Range, [1.4 2.6]); %% 构造不确定被控对象 G_u 1 / (um*tf(s)^2 uc*tf(s) uk) ... ar * tf(wr^2, [1 2*zr*wr wr^2]); %% 计算鲁棒稳定裕度 [stabmarg, wcu] robstab(feedback(G_u * K, 1));ureal定义参数变化区间robstab返回的stabmarg小于 1 表示存在区间内的参数组合会让闭环失稳等于 1 表示刚好处于临界边界大于 1 是有富余。wcu给出最坏情况下的参数值组合辅助你看看到底是哪个参数影响最大。如果想看更直观的响应簇可以用usample随机采样 30 组参数逐个仿真画成一簇曲线。这个图和单条阶跃曲线放在一起评审时说服力比单纯贴 GAM 值强得多。4.4 H∞设计常用函数速查表函数作用典型场景关键参数augw组装混合灵敏度广义对象设计入口W1, W2, W3 顺序不能换hinfsynH∞控制器综合核心求解nmeas, ncont, Methodhinfnorm计算系统 H∞ 范数验证等价条件 ‖Tzw‖∞返回范数值与对应频率loopmargin计算开环幅值/相位裕度快速检查裕度是否够返回多段裕度信息robstab不确定系统鲁棒稳定裕度参数摄动分析输入必须含 ureal 不确定元素musynμ 综合控制器强结构不确定性对象通常比 hinfsyn 迭代慢一个量级5. 把 H∞控制器落地降阶、离散化与离散闭环验证5.1 先用 hankelsv 看控制器阶数再用 balred 降阶H∞ 控制器的阶数等于广义被控对象 P 的阶数。上面这个算例 P 有 7 阶K 也就有 7 阶嵌入式平台上直接跑 7 阶状态空间并不是不能接受但配合其他滤波器一起部署就显得重了。降阶前先用hankelsv看奇异值分布选择奇异值突变处作为降阶目标阶数。hankelsv(K); % 画 Hankel 奇异值找拐点 Kred balred(K, 3); % 降到 3 阶 norm(K - Kred, inf) % 计算降阶误差的 H∞ 范数norm(K - Kred, inf)返回降阶前后控制器的最大奇异值之差。这个值只要远小于控制器在工作频段的增益降阶对闭环的影响就很小。一般以 0.05 为经验阈值超过就换更高阶数重试。降阶后应该重新跑一遍第 4 章的 sigma 和阶跃验证不要默认降阶模型和原模型等价。控制器降阶是有误差界的但误差界只在控制器自身定义域内有效和闭环系统的稳定性不能直接画等号。5.2 离散化H∞ 控制器带直通项选对方法比选对频率更关键H∞ 控制器往往不是严格正则的分子分母同阶状态空间模型的 D 矩阵非零。这带来一个实际坑c2d用tustin方法时部分 MATLAB 版本要求系统严格正则遇到 D 非零会拒绝计算或给出警告。我一般直接用零阶保持器离散化最省事也最贴近实际嵌入式实现wb 5; % 之前设定的闭环带宽 Ts 1 / (100 * wb / (2*pi)); % 采样周期约 20 倍带宽以上 Kd c2d(Kred, Ts, zoh);采样周期按带宽折算闭环带宽 5 rad/s 对应约 0.8 Hz100 倍就是 80 Hz取整用 0.01 秒足够。如果控制器的目标是 50 rad/s 带宽的快速回路采样频率至少要上 kHz 量级。离散化之后用zpk(Kd)快速看一眼零极点离散控制器若出现单位圆外的零点通常是采样频率过低导致。5.3 离散闭环的对比验证把被控对象一起离散化离散控制器最终要配合连续被控对象工作但 MATLAB 里直接混合连续对象和离散控制器做feedback会报时间域冲突。通用的预验证方案是把被控对象也按零阶保持离散化然后做全离散闭环仿真。Gd c2d(G, Ts, zoh); % 被控对象离散化 figure; step(feedback(G*Kred, 1), 10); % 连续设计参考曲线 hold on; step(feedback(Gd*Kd, 1), 10); % 全离散闭环曲线 legend(连续闭环, 离散闭环);全离散闭环和被控对象连续、控制器离散的真实系统之间存在采样保持误差但在工程预研阶段足够说明问题。检查三个点稳态是否一致、超调量是否变化、20 rad/s 柔性模态是否还压得住。若离散闭环多出明显振荡用sigma(Kd)检查控制器在奈奎斯特频率附近有没有过高的谐振增益。我习惯把这三行检查写成一个独立脚本每次改完加权函数直接跑一遍连续与离散差异控制在 5% 以内就交付给嵌入式同事。本文还有配套的精品资源点击获取