加权灵敏度H∞控制实战:从权函数选取到控制器降阶的完整指南

发布时间:2026/9/15 17:04:30
加权灵敏度H∞控制实战:从权函数选取到控制器降阶的完整指南 第一次接触H无穷控制时我被这个“无穷”弄得头大直觉上总觉得它和经典频域设计是两条路子。直到真正把一个加权灵敏度H无穷控制问题做进伺服系统项目里才意识到它其实就是在处理控制工程师最熟悉的那个矛盾——既要快、准、稳又要能扛得住模型偏差和高频干扰。加权灵敏度就是把这个矛盾定量化写成可以交给计算机求解的优化问题给定一组反映性能与鲁棒性要求的权函数设计控制器使闭环灵敏度函数的H无穷范数满足指标。这篇文章不仅讲清单概念更重要的是把权函数怎么选、控制器怎么解、解出来怎么降阶、哪些坑我踩过完整走一遍。1. 加权灵敏度H无穷问题到底在解决什么1.1 一个典型场景高精度伺服系统的“既要又要”想一个常见的例子设计一个高精度转台伺服回路。标称模型大约是一个双积分环节再加上驱动器延迟、机械谐振、负载惯量变化、传感器噪声。用经典PID你会发现参数怎么调都有点别扭——把带宽拉高跟踪误差小了可机械谐振处容易激起振荡把带宽压低系统稳了可抗扰动能力和跟踪精度又达不到指标。问题本质在于PID设计通常只针对一个固定的标称模型模型偏差、外部扰动、传感器噪声这些“不速之客”并没有被系统地纳入设计目标。H无穷控制换了一个思路我不再追求“某个特定工作点最优”而是追求“最坏情况下仍然可以接受”。假设模型偏差在某个界内、扰动在某个频段内设计一个控制器使得闭环系统对这些坏情况的灵敏度都有上界。这正是H无穷范数的含义——系统传递函数在整个频率范围内的最大增益。这个思想直接对应到经典控制里的灵敏度函数S和补灵敏度函数T上于是就有了加权灵敏度H无穷控制问题这个经典方向。1.2 两个矛盾目标如何被写进同一个范数灵敏度函数S(s) 1/(1P(s)K(s))描述的是外部输入到跟踪误差的传递特性S的幅值越小说明系统对低频指令跟踪越好、对低频扰动的抑制能力越强。补灵敏度函数T(s) P(s)K(s)/(1P(s)K(s))描述的是输出对传感器噪声和模型不确定性的敏感程度T的幅值在模型不确定性大的频段越小越好。关键约束来了S和T满足S T 1。这意味着你不能同时把S和T压到任意小。低频段要让S小传感器噪声和未建模动态的影响就必然在对应频段被放大高频段要让T小低频的跟踪性能就会受到限制。这不是某个控制器的问题是反馈系统本身的代数守恒类似一个人在一条船上往左走多少往右的余量就少多少。那么怎么在工程上处理这个矛盾答案是加权。我不强求所有的频率上S和T都小而是指定某些频段重点照顾S、另一些频段重点照顾T。对应的数学表达就是设计K使得||W_S S||∞ 1且||W_T T||∞ 1。W_S是我们关心的性能加权函数在低频段幅值高逼迫S在低频段变小W_T是鲁棒性加权函数在高频段幅值高逼迫T在高频段变小。这样就把“频段分工”的思维精确化了。1.3 混合灵敏度问题不止是S和T实际设计时你会发现光约束S和T还不够。控制器输出可能非常大执行器直接饱和或者控制器在高频段的增益异常高放大了测量噪声。所以在经典S/T混合灵敏度基础上通常还要把控制量加权KS也放进来。标准的加权灵敏度H无穷控制问题写成目标最小化 γ满足 || [ W_S S ; W_KS K S ; W_T T ] ||∞ γ其中W_KS是对控制量幅度的惩罚权函数。做工程的人看到这个式子应该直接想到Bode图上的三条线1/|W_S|是灵敏度上界1/|W_T|是补灵敏度上界1/|W_KS|是控制量频响上界。控制器设计要求三条闭环传递函数的幅频曲线都待在对应上界之下。至于被控对象和这三个通道的组合就是所谓的广义被控对象P_aug。它把原对象P和三个权函数打包成一个带有多输入多输出的增广系统然后求解针对这个增广系统的H∞控制器。如果你用过MATLAB控制工具箱一个augw函数就能把这个系统组好。下一节就顺着这个思路讲完整的设计流程。2. 一套可复现的加权灵敏度H∞控制器设计流程2.1 把性能要求翻译成三条频率曲线设计加权灵敏度问题第一步不是写代码而是把脑子里那几条控制指标翻译成频率曲线。我一般分四步问自己第一低频跟踪精度要做到多少如果要求系统对斜坡输入稳态误差小于某个值那么灵敏度函数在低频段的幅值必须足够小。对应到W_S上就是低频增益要给足。举例如果要求低频灵敏度达到-60dB那么W_S的低频增益就要高于60dB也就是1000倍量级。第二闭环带宽要求多少带宽意味着灵敏度函数从低增益转到高增益的转折位置。W_S的穿越频率大致对应这个位置。注意带宽设得太高会和高频鲁棒性要求打架因为中间过渡频带有限S和T之间必须有一段平滑的交换。第三高频未建模动态有多大机械谐振、驱动延迟、传感器高频噪声这些通常集中在某个频率之上。要求在这个频段T的增益低于比如-20dBW_T高频增益就要高于20dB对应10倍以上。第四执行器的输出限制是多少最大控制电压、最大电流、最大力矩这些约束决定W_KS的基准水平。如果执行器余量大W_KS可以取小一点如果执行器容易饱和W_KS要适当放大宁可牺牲一点闭环响应速度也要保证控制量在合理范围。当你把这四件事想清楚权函数的基本形状其实已经出来了。每一条都是一条直线或者折线接下来只是把它表达成传递函数。2.2 三种权函数的工程取法灵敏度权函数W_S最经典的取法是一阶低通整型W_S(s) (s/M_s ω_B) / (s ω_B·ε)这里ω_B是你期望的带宽M_s是灵敏度峰值上限一般取1.3~2.0可以稍微留一点超调余量ε是一个很小的数比如1e-4用来保证足够的低频增益。这个传递函数在低频的增益约为1/ε高频增益约为1/M_s转折发生在ω_B附近。画成1/|W_S|的Bode图就是一个带宽为ω_B、下界接近0、上界为M_s的允许区间非常直观。补灵敏度权函数W_T通常取一阶高通整型我习惯直接用MATLAB的makeweight函数生成。makeweight(a, wc, b)返回一个在低频增益为a、在频率wc处增益为1、在高频增益为b的一阶传递函数。比如makeweight(0.1, 30, 10)就是低频只有0.1几乎不影响标称性能在30 rad/s处穿过1高频增益10对应要求T在高频衰减到-20dB以下。这个函数比手动凑零极点要稳得多强烈建议使用。控制量权函数W_KS最简单可以先取一个常数。比如W_KS 0.1或者0.01表示对控制量的惩罚力度。它的大小需要根据被控对象增益和执行器极限来回试一般从0.01到10之间几个数量级逐个尝试。W_KS在这三种权函数里是最容易被忽略的但恰恰是最影响实际可行性的一个。权重取得太小控制器会倾向于用非常大的控制量来压制误差仿真相对于标称模型好看一接入饱和环节就完蛋。权重太大系统响应变慢低频性能又满足不了。实际调整时把W_KS的增益从一个较小值逐步增大观察控制量的峰值和闭环响应速度取一个折中。2.3 用augw和hinfsyn把控制器求解出来权函数定好之后MATLAB里的操作就非常机械了。第一步把被控对象和三个权函数打包成广义对象P_aug augw(P, W_S, W_KS, W_T);这一步会自动构造把w(外部输入)、u(控制输入)映射到z(加权输出)、y(测量输出)的增广系统。如果你的问题不需要某个通道对应的权函数参数传[]即可比如augw(P, W_S, [], W_T)就是只考虑S/T的混合灵敏度问题。第二步调用hinfsyn求解[K, CL, gamma] hinfsyn(P_aug, 1, 1);参数里的两个1分别表示测量输出个数和控制输入个数对于单输入单输出问题就是1和1。这套函数是基于Riccati方程的经典求解方法适合中小规模模型。如果被控对象很大或者你只想优化控制器中的部分参数可以换用hinfstruct做非光滑优化但加权灵敏度问题通常用不到。求解完成后第一个要看的不是控制器而是gamma。gamma是闭环系统实际的H∞范数与权函数指标的比值。如果gamma小于1说明所有约束都满足而且还有余量如果gamma刚好接近1说明设计正卡在性能极限附近如果gamma远大于1说明你提的指标本身不可行需要放宽某个权函数。很多人遇到gamma3甚至gamma10还是一脸蒙地继续用这是不对的必须先回去调整权函数。2.4 从求解到部署控制器阶数压制H∞控制器有个特点阶数等于广义被控对象的阶数。如果一个5阶对象配上3个一阶权函数控制器就是8阶如果权函数选成二阶甚至三阶控制器轻易超过10阶。这样的控制器直接部署到实时控制系统里不仅计算量大而且数值敏感、难以调试。处理顺序是固定的。先用minreal消除控制器内部可约的零极点对有时能直接降一两阶然后用balred做平衡截断降阶。降阶不是机械地砍到某个阶数就完事要边降阶边看校验指标闭环极点是否明显移动、开环Bode图的相位裕度和增益裕度是否保持、S和T曲线是否还在权函数包络内、时域阶跃响应是否仍然满足要求。我第一次做H∞控制器降阶时直接一口气降到2阶频域曲线看着差别不大结果阶跃响应出来一个奇怪的慢漂移。后来查原因才知道某个位于低频的弱可观模态被截掉了它对频率响应幅值影响很小却决定了闭环的稳态行为。所以降阶之后必须有意识地在1/10到10倍截止频率范围内扫描检查尤其注意低频段的响应。3. 权函数与可行性为什么你的问题求解失败3.1 频域约束违背了ST1的物理底线新手做加权灵敏度H∞控制时最容易犯的错误是权函数参数拍脑袋结果求解器报错或者gamma大得离谱。这背后是ST1这个恒等式在起作用。你不可能既要求S在1 rad/s处降到-80dB又要求T在2 rad/s处降到-40dB因为这两个频率太近了S和T的过渡区根本来不及完成交换。打个比方S和T就像两个人在一根绳子上做交接一个往下走另一个才能往上走。如果要求往下走的频段和往上走的频段离得太近交接的坡道就会变得非常陡系统只能靠高增益控制器硬凑最终要么gamma很大要么直接无解。经验上W_S的带宽和W_T的起始频率至少拉开10倍频程如果拉开20倍频程设计一般会顺利很多。实在拉不开比如被控对象本身带宽就窄那就要接受一个偏保守的性能指标或者换用更先进的μ综合方法。另一个常见问题是W_S的低频增益取到无限大。理论上要让稳态误差为0W_S需要含有一个积分项确实可以这样设计。但积分项会让广义对象含有积分环节hinfsyn解出来的控制器会包含一个积分器这没问题只是对数值求解更敏感。我建议先用一个很大的常数比如1e4来代替无穷大如果性能不够再考虑真正的积分权。3.2 我对权函数参数的一次真实调整经历有一个项目经历非常典型。对象是一个惯量约0.02 kg·m²的直驱电机我最初把W_S带宽定在10 rad/sW_T在20 rad/s处就开始上升W_T高频增益设为20。求解后gamma4.7指标完全没满足。我一开始怀疑是对象模型的问题反复检查P_aug的构建和传递函数方向都没问题。后来我画出S和T的实际曲线发现T在10 rad/s附近就已经开始被W_T压了而S在这个频段还没降到1以下S和T在几乎相同的频段内“抢地盘”。这显然不合理。我的调整是把W_S带宽降到3 rad/sW_T的起始频率推到50 rad/sW_T高频增益从20降到10。再求解gamma直接变成0.95一条曲线都不超。性能看起来确实比以前“差”了一点但那是名义上的差实际系统跑下来反而更稳因为中频段的裕度真正被释放出来了。这件事让我印象深刻权函数不是“越严格越好”而是“越合理越好”。求解之前先告诉自己S和T各自的领地在哪里中间至少留出一个十倍频程的过渡地带。3.3 “求解出来”不等于“能用”关于几何裕度的提醒还有一类问题gamma很好频率曲线也漂亮但接上非线性环节或者时变参数就出问题。这是因为H∞设计保证的是范数意义下的稳定性和性能它并不直接等价于经典控制里的相位裕度和增益裕度。你可以在设计完成后查看开环传递函数LP·K的Bode图确认相位裕度至少大于30度、增益裕度至少大于6dB。如果发现裕度偏小哪怕gamma小于1也建议调整权函数加一些“余量”。此外H∞设计考虑的模型不确定性通常是非结构化的也就是用一个范数界覆盖了各种可能偏差。这既是它的优点也是它的局限它不会区分“谐振峰偏移”和“惯量增大30%”这两种本质上差别很大的不确定性只会用一个最坏的包络去统一处理结果就是设计可能偏保守。如果项目里已经知道不确定性的具体结构比如某个参数在某个范围内变化那更好的选择是μ综合。加权灵敏度H∞控制更适合在项目初期对不确定性只有粗糙频段估计时使用。4. 用一个双积分对象走通全流程加权灵敏度H∞设计实例4.1 对象、控制目标与权函数选型纸上谈兵不如直接跑一遍。我用的示例对象是双积分环节P(s) 1 / s²这个模型看起来简单但它有非常真实的工程背景——转台、天线、卫星姿态的刚体动力学在忽略阻尼和柔性模态后本质上都是双积分环节。由于它开环不稳定、相位恒定-180度任何一点的模型偏差都会对闭环稳定性造成威胁非常适合演示加权灵敏度H∞设计。控制目标有三条第一系统对阶跃指令的稳态误差为0带宽大约5 rad/s第二对100 rad/s以上的未建模动态补灵敏度T的增益至少衰减到-20dB以下第三控制量峰值不超过单位阶跃输入下某个可接受值。按这个目标我选的权函数如下Ws tf([1/5, 1], [1e-4, 1]); % 低频增益约80dB带宽约5rad/s峰值上界1 Wt makeweight(0.1, 50, 10); % 低频0.150rad/s处过1高频增益10 Wks 0.1; % 控制量惩罚常数W_S采用(s/51)/(s·1e-41)低频增益1e4对应灵敏度最低可以达到0.0001倍也就是-80dB带宽附近的幅值约1灵敏度上界约0.7和通常带宽定义吻合。W_T用makeweight(0.1, 50, 10)低频几乎不约束但50 rad/s开始逐渐压T高频要求T低于0.1。W_KS先取0.1让控制量的权重温和一点后面如果控制量太大再加大。4.2 求解结果与频域校验构建广义对象并求解P tf(1, [1, 0, 0]); P_aug augw(P, Ws, Wks, Wt); [K, CL, gamma] hinfsyn(P_aug, 1, 1);在我的环境里gamma大约在0.9左右说明设计指标和实际闭环响应之间的余量很少但满足要求。控制器阶数为5阶这是一个没有过多余量的结果——如果你想留更多裕度可以把W_S带宽降到3gamma会立刻降到0.5以下。频域校验是必须做的。画出闭环灵敏度S、补灵敏度T以及1/W_S、1/W_T的对应关系重点确认两点S的幅频曲线在整个频段上不高于1/|W_S|T不高于1/|W_T|。如果gamma小于1这条检查一定会通过但画图能看到余量主要在哪里这对后续调整非常有用。我实际跑下来的情况是S在低频段比1/|W_S|低大约10dB余量充足T在高频段比1/|W_T|低大约6dB余量一般。这说明如果后续还想提高一点闭环带宽W_T方向还有一点让步空间。4.3 时域仿真与鲁棒性检查频域满足不等于时域可用。接下来做三个仿真单位阶跃响应看超调量和调节时间单位阶跃扰动作用于对象输入端看扰动抑制效果控制量曲线看是否超过执行器限幅。以我的参数阶跃响应大约在0.8秒内进入稳态超调量在10%以内控制量峰值在5以内整体属于可接受范围。鲁棒性检查这步不能少。我把被控对象乘性增加一个30%的高频不确定性比如在原来双积分基础上串联一个高阶谐振项2000/(s²40s2000)这个谐振大约在45 rad/s附近。重新闭环后发现系统仍然稳定阶跃响应只是多了一个小抖动这验证了W_T设计确实在起作用。如果没有W_T的约束直接把这个谐振项串进去系统多半会在谐振频率附近失稳——这是加权灵敏度设计能够带来的实打实的保护不是仿真里的好看指标。4.4 控制器降阶与效果对比初始5阶控制器对一个实时系统来说勉强能用但我还是按流程走一遍降阶看看能省到什么程度。先minreal可约的零极点对不多仍保持5阶然后用balred逐步降到4阶、3阶、2阶每次都检查带降阶控制器的闭环系统。降到3阶时S和T曲线与5阶几乎重合阶跃响应差异小于2%这个控制器可以直接使用。降到2阶时问题开始显现相位裕度从原来的约45度掉到25度左右阶跃响应开始出现小幅振荡如果再加上谐振项稳定裕度已不充足。最终我把控制器定在3阶既能保留加权灵敏度设计的大部分频域特性又满足实时性要求。降阶过程中一个值得注意的细节是用balred降阶之前先用minreal把控制器内部的近似零极点对消除否则balred可能会花力气去保留一对几乎抵消的模态导致降阶效果变差。5. 学习加权灵敏度H∞控制后还有几条经验值得记住5.1 加权灵敏度是“入口”不是终点学加权灵敏度H∞控制最大的价值不在于它能直接解决所有控制问题而在于它逼迫你把“性能”和“不确定性”放在同一个坐标系里思考。经典控制里你调一个PID参数心里想的其实也是这个东西——只是PID参数和频域要求之间的映射关系非常模糊调试全凭经验。加权灵敏度把这个过程系统化了你定义频率区间定义每个区间的上下界然后计算机去找那个满足所有约束的控制器。即使你后续不用H∞方法这种“频段划分上下界包络”的设计思想也会让你回去调整PID时更有方向感。不过要清楚它的局限。加权灵敏度H∞控制处理的是非结构化不确定性所以结果偏保守。还有它只约束S、T、KS三个传递函数的范数不直接约束闭环极点阻尼、不做时域指标优化。你可能会得到一个范数达标但超调偏大的控制器这时要回到权函数调节或者换用时域H∞综合。5.2 从加权灵敏度走向回路成形与μ综合如果加权灵敏度设计让你感受到H∞思想的威力下一步值得看两个方向。第一个是回路成形Loop Shaping它直接把开环回路LPK的形状作为设计目标而不是间接约束S和T。回路成形对相位裕度和增益裕度的控制更加直观适合那些对相对稳定性有硬性要求的工程问题。第二个是μ综合它针对结构化不确定性设计不再用一个简单的范数界覆盖所有可能偏差而是显式考虑“参数A在范围1~3内谐振频率B在±10%内变化”这类具体信息。μ综合的控制器阶数通常比加权灵敏度更高计算量也大但当加权灵敏度方法做出来的结果因为保守性而无法满足性能指标时μ综合往往是最终解法。5.3 我的个人建议动手从最简单的模型开始最后分享一点个人经验。我自己学这部分内容时最有效的路径是不直接啃论文先拿一个简单对象比如双积分器设一组权函数跑通augw和hinfsyn盯着Bode图调整参数反复体会“权函数变了gamma怎么变S和T怎么变”。这个过程跑过两三遍之后再去看教材里的定理和推导就完全不一样了——你会知道每一个数学条件背后对应的是一条什么样的频率曲线和一个什么样的工程权衡。调试权函数时有个小技巧先固定W_T和W_KS只调W_S带宽观察gamma的变化曲线然后固定W_S调W_T的起始频率。这样一次只动一个变量才能建立对参数-性能关系的直觉。等到你能预测“把W_T起始频率从50挪到30会让gamma上升多少”的时候加权灵敏度H∞控制的基本功就算真正打下去了。