第一次接触H无穷控制时,我被这个“无穷”弄得头大,直觉上总觉得它和经典频域设计是两条路子。直到真正把一个加权灵敏度H无穷控制问题做进伺服系统项目里,才意识到它其实就是在处理控制工程师最熟悉的那个矛盾——既要快、准、稳,又要能扛得住模型偏差和高频干扰。加权灵敏度就是把这个矛盾定量化,写成可以交给计算机求解的优化问题:给定一组反映性能与鲁棒性要求的权函数,设计控制器,使闭环灵敏度函数的H无穷范数满足指标。这篇文章不仅讲清单概念,更重要的是把权函数怎么选、控制器怎么解、解出来怎么降阶、哪些坑我踩过,完整走一遍。
1. 加权灵敏度H无穷问题到底在解决什么
1.1 一个典型场景:高精度伺服系统的“既要又要”
想一个常见的例子:设计一个高精度转台伺服回路。标称模型大约是一个双积分环节,再加上驱动器延迟、机械谐振、负载惯量变化、传感器噪声。用经典PID,你会发现参数怎么调都有点别扭——把带宽拉高,跟踪误差小了,可机械谐振处容易激起振荡;把带宽压低,系统稳了,可抗扰动能力和跟踪精度又达不到指标。问题本质在于:PID设计通常只针对一个固定的标称模型,模型偏差、外部扰动、传感器噪声这些“不速之客”并没有被系统地纳入设计目标。
H无穷控制换了一个思路:我不再追求“某个特定工作点最优”,而是追求“最坏情况下仍然可以接受”。假设模型偏差在某个界内、扰动在某个频段内,设计一个控制器,使得闭环系统对这些坏情况的灵敏度都有上界。这正是H无穷范数的含义——系统传递函数在整个频率范围内的最大增益。这个思想直接对应到经典控制里的灵敏度函数S和补灵敏度函数T上,于是就有了加权灵敏度H无穷控制问题这个经典方向。
1.2 两个矛盾目标如何被写进同一个范数
灵敏度函数S(s) = 1/(1+P(s)K(s)),描述的是外部输入到跟踪误差的传递特性,S的幅值越小,说明系统对低频指令跟踪越好、对低频扰动的抑制能力越强。补灵敏度函数T(s) = P(s)K(s)/(1+P(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的增益低于比如-20dB,W_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,说明你提的指标本身不可行,需要放宽某个权函数。很多人遇到gamma=3甚至gamma=10还是一脸蒙地继续用,这是不对的,必须先回去调整权函数。
2.4 从求解到部署:控制器阶数压制
H∞控制器有个特点:阶数等于广义被控对象的阶数。如果一个5阶对象配上3个一阶权函数,控制器就是8阶;如果权函数选成二阶甚至三阶,控制器轻易超过10阶。这样的控制器直接部署到实时控制系统里,不仅计算量大,而且数值敏感、难以调试。
处理顺序是固定的。先用minreal消除控制器内部可约的零极点对,有时能直接降一两阶;然后用balred做平衡截断降阶。降阶不是机械地砍到某个阶数就完事,要边降阶边看校验指标:闭环极点是否明显移动、开环Bode图的相位裕度和增益裕度是否保持、S和T曲线是否还在权函数包络内、时域阶跃响应是否仍然满足要求。
我第一次做H∞控制器降阶时,直接一口气降到2阶,频域曲线看着差别不大,结果阶跃响应出来一个奇怪的慢漂移。后来查原因,才知道某个位于低频的弱可观模态被截掉了,它对频率响应幅值影响很小,却决定了闭环的稳态行为。所以降阶之后,必须有意识地在1/10到10倍截止频率范围内扫描检查,尤其注意低频段的响应。
3. 权函数与可行性:为什么你的问题求解失败
3.1 频域约束违背了S+T=1的物理底线
新手做加权灵敏度H∞控制时,最容易犯的错误是权函数参数拍脑袋,结果求解器报错或者gamma大得离谱。这背后是S+T=1这个恒等式在起作用。你不可能既要求S在1 rad/s处降到-80dB,又要求T在2 rad/s处降到-40dB,因为这两个频率太近了,S和T的过渡区根本来不及完成交换。
打个比方,S和T就像两个人在一根绳子上做交接,一个往下走另一个才能往上走。如果要求往下走的频段和往上走的频段离得太近,交接的坡道就会变得非常陡,系统只能靠高增益控制器硬凑,最终要么gamma很大,要么直接无解。经验上,W_S的带宽和W_T的起始频率至少拉开10倍频程,如果拉开20倍频程,设计一般会顺利很多。实在拉不开,比如被控对象本身带宽就窄,那就要接受一个偏保守的性能指标,或者换用更先进的μ综合方法。
另一个常见问题是W_S的低频增益取到无限大。理论上要让稳态误差为0,W_S需要含有一个积分项,确实可以这样设计。但积分项会让广义对象含有积分环节,hinfsyn解出来的控制器会包含一个积分器,这没问题,只是对数值求解更敏感。我建议先用一个很大的常数(比如1e4)来代替无穷大,如果性能不够再考虑真正的积分权。
3.2 我对权函数参数的一次真实调整经历
有一个项目经历非常典型。对象是一个惯量约0.02 kg·m²的直驱电机,我最初把W_S带宽定在10 rad/s,W_T在20 rad/s处就开始上升,W_T高频增益设为20。求解后gamma=4.7,指标完全没满足。我一开始怀疑是对象模型的问题,反复检查P_aug的构建和传递函数方向,都没问题。
后来我画出S和T的实际曲线,发现T在10 rad/s附近就已经开始被W_T压了,而S在这个频段还没降到1以下,S和T在几乎相同的频段内“抢地盘”。这显然不合理。我的调整是:把W_S带宽降到3 rad/s,W_T的起始频率推到50 rad/s,W_T高频增益从20降到10。再求解,gamma直接变成0.95,一条曲线都不超。
性能看起来确实比以前“差”了一点,但那是名义上的差,实际系统跑下来反而更稳,因为中频段的裕度真正被释放出来了。这件事让我印象深刻:权函数不是“越严格越好”,而是“越合理越好”。求解之前先告诉自己,S和T各自的领地在哪里,中间至少留出一个十倍频程的过渡地带。
3.3 “求解出来”不等于“能用”:关于几何裕度的提醒
还有一类问题,gamma很好,频率曲线也漂亮,但接上非线性环节或者时变参数就出问题。这是因为H∞设计保证的是范数意义下的稳定性和性能,它并不直接等价于经典控制里的相位裕度和增益裕度。你可以在设计完成后查看开环传递函数L=P·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.1,50rad/s处过1,高频增益10 Wks = 0.1; % 控制量惩罚常数W_S采用(s/5+1)/(s·1e-4+1),低频增益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带宽降到3,gamma会立刻降到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²+40s+2000),这个谐振大约在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),它直接把开环回路L=PK的形状作为设计目标,而不是间接约束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∞控制的基本功就算真正打下去了。