1. 线性定常系统综合到底在解决什么问题学完前四章如果你对状态空间表达式建模、状态转移矩阵、能控能观性判断这些概念已经能熟练运用那么到第五章会明显感到一个分水岭从前四章开始我们在“分析”一个给定的系统从这一章开始我们要反过来“设计”一个满足性能要求的系统。打个比方之前你是医生拿到化验单要做诊断现在你是工程师要开药方甚至做手术把病人的指标调回到正常范围。这个从“分析”到“综合”的跳跃就是现代控制理论最核心的价值所在。“综合”这个词听起来很高大上其实就是回答一个问题给定一个线性定常系统如何加入合适的控制规律使得闭环系统具备期望的动态性能期望可能是让系统更快稳定、消除稳态误差、抑制扰动或者把某些状态维持在一定范围内。实现方式有很多比如状态反馈、输出反馈、引入积分环节、设计观测器等等。这些手段统称为“系统的综合”。这一章之所以在整门课里重量级极高是因为它把前面所有铺垫的工具全部串了起来。你要设计一个状态反馈控制器前提是通过能控性判断这个系统能不能被任意配置极点你要设计一个状态观测器前提是系统必须能观。你会发现前四章像是给你准备工具箱第五章才开始真正的“动工”。对初学者来说这个阶段最需要扭转的一个思维是分析问题往往是“确定性”的给定模型和输入输出就是确定的而综合问题充满了“设计自由度”同样一个性能要求可能有多组控制器参数都能满足也可能没有一组能满足。你需要学会的不是找唯一答案而是建立一套取舍逻辑——这也是我们在实际工程里常说的“设计感”。我见过不少同学卡在这一章不是因为公式复杂而是因为不知道每个设计步骤到底在干什么。一旦把“为什么”想清楚后面的计算推导其实都是简单的线性代数运算。这篇博文会从状态反馈、极点配置、观测器和分离定理几个核心模块出发把常见的设计流程、条件判断、典型算法和工程坑点都过一遍争取让你看完之后能直接上手做题也大概知道在MATLAB里怎么验证。2. 状态反馈最直接的“毛病哪里不对就治哪里”2.1 状态反馈不只是“负反馈”这么简单经典控制里我们常用输出反馈也就是拿传感器测到的输出量去和参考值比较然后形成控制信号。但这里有个天然的局限有些动态行为在输出里看不到或者看到的时候已经太晚了。状态反馈的思路不一样——它默认你手上有全部状态变量的实时信息然后用这些状态按比例叠加去形成控制输入。考虑一个线性定常系统x_dot A x B u y C x状态反馈就是把输入取成u -K x v其中K是反馈增益矩阵v是外部参考输入。代入原方程x_dot (A - B K) x B v这样得到一个新系统动态矩阵变成了A - BK。状态反馈的实质就是你亲手修改了系统矩阵的特征结构从而改变系统的模态。你不需要更换任何硬件也不需要改变A、B本身只要算出一组增益就能把闭环极点放到你想要的位置。为什么说它是最根本的控制手段因为动态系统的本质就是由极点决定的。极点决定了振型是衰减快还是慢、是振荡还是单调也决定了系统是否稳定。状态反馈可以直接指定这些极点的位置这是一种“外科手术式”的干预比输出反馈要灵活得多。当然前提是你得能测到状态。很多物理量比如电机内部的转子磁链、化学反应器的中间浓度并没有现成的传感器直接能测。这时候观测器就该上场了这个我放到后面细讲。2.2 能控性是极点可任意配置的充要条件讲到极点配置最核心的一个结论必须背得滚瓜烂熟系统状态反馈能任意配置极点当且仅当系统完全能控。为什么是能控而不是能观道理很直观——状态反馈是通过输入u去影响状态的如果某个状态根本不受输入控制影响那无论你怎么设计K都不可能改变这个状态的运动模式自然也就没法把它的极点挪到希望的位置。能控性描述的就是输入对状态的控制权限权限不够不可能实现任意极点配置。证明思路也很简单核心是利用线性变换把系统化成能控标准型。在能控标准型下A和B有很特殊的结构特征多项式的系数就明明白白地写在矩阵的最后一列。你只要让反馈增益K去逐一匹配想要的极点对应的特征多项式系数问题就化成了解一组线性方程。这也是后面算法能够实现的理论基础。做题时判断能控性最常用的方法就是构造能控性矩阵Qc [B, AB, A^2B, ..., A^(n-1)B]然后看它的秩是不是满秩。MATLAB里直接执行 [B AB A^2B ...] 然后计算 rank 就行。实际工程中我一般还会看一眼能控性矩阵的条件数别看它满秩如果病态严重后面算出来的反馈增益数值可能非常夸张这种极端增益在工程上往往不可用。2.3 单变量系统的极点配置五步法对单输入单输出系统极点配置有一套相对固定的算法建议考试时按步骤来不容易出错。假设我们要找反馈增益向量K [k1, k2, ..., kn]。第一步写出系统的特征多项式 det(sI - A)化简成标准形式det(sI - A) s^n a1 s^(n-1) ... an第二步确定你想要的闭环极点。这些极点可能由超调量、调节时间、阻尼比等动态指标换算出来。假设期望极点为 p1, p2, ..., pn那么期望闭环特征多项式为α(s) (s - p1)(s - p2)...(s - pn) s^n α1 s^(n-1) ... αn第三步判断系统是否完全能控。不能控直接停别浪费时间。第四步如果系统不在能控标准型先通过变换矩阵把系统化成能控标准型然后在能控标准型下求出反馈增益K_hat最后再逆变换回原坐标得到K。第五步验证。把算出来的K代回A - BK求一下特征值确认极点位置符合预期。这里我特别想提醒一下很多初学者拿到一个简单系统看到A和B直接试图用待定系数法即假设K [k1,k2]然后展开特征多项式再和期望多项式对比。这个方法在二阶系统里确实有效但不能形成常规流程而且一旦阶数上去了会非常痛苦。所以我建议第一遍学习时老老实实走标准型变换流程虽然步骤多一点但是每一步都明确不容易乱。MATLAB提供了一个直接函数可以让这个过程变成一行K place(A, B, P); % P 为期望极点向量place函数使用的地方在于它适用于多变量系统也能处理重极点。不过如果系统阶次较高或者极点排布比较苛刻有时候会得到数值很大的增益这是后面要警惕的。2.4 多变量系统的自由度与麻烦多变量系统MIMO的极点配置比单变量复杂一个维度。最大区别在于反馈增益矩阵K不再是1×n而是m×n有mn个元素。如果系统维数是n期望极点只有n个位置那么剩下mn - n个自由度可以自行决定。也就是说多变量系统能任意配置极点的前提下你还额外拥有一大堆设计余度。这些余度可以用来做其他事情比如改善状态之间的耦合、降低增益数值、提高鲁棒性但这也意味着没有唯一的K设计需要你去权衡。一个非常常见的做法是先把系统化为某种标准型比如通过反正态变换或者用“同时使极点配置和特征向量整形”的策略。不过这些内容在本科第五章一般不会展开太多大家只需要知道多变量系统计算K并不像单变量那样一套公式走到底工程上多用 place 函数配合反复仿真调参。另外多变量系统有个隐蔽的问题是零极点对消。你在设计过程中如果某个输入对某个状态的通道本来就不可控或者不能观强行去配置极点会出现所谓“固定模”问题——也就是某些极点无论怎么配置都动不了。这是多变量系统的“坎”考试中经常用一个矩阵判定题来考察这个概念。固定模的存在可以通过能控性和能观性的结合判断具体说就是检查系统是否存在不可控或不可观的模态这部分内容值得多花点时间理解。3. 观测器设计当状态测不出来的时候怎么办3.1 状态反馈的现实瓶颈现实里我们经常没法直接测到全部状态。比如倒立摆系统杆的角度可以通过编码器测量但是角速度往往要靠差分来计算差分出来的信号噪声极大直接用来反馈的话控制效果会很差。再比如异步电机的转子磁链你根本不可能在旋转的转子上安装传感器。这时候如果还坚持用纯状态反馈就陷入了“巧妇难为无米之炊”。解决办法有两个方向一个是用传感器测量并构造状态的估计另一个是设计一个“软件传感器”用系统的输入输出信息实时估计状态这就是状态观测器。经典控制里我们习惯说“测不到的量没办法反馈”现代控制理论把这个问题用动态系统自身的信息来解决思路很巧妙既然系统的模型已知输入已知输出已知那么我就可以建立一个和原系统结构相同的模型把真实输入同时喂给这个模型理论上模型的状态就是原系统状态的重现。可是模型只是数学模型它不存在于物理世界我们也拿不到它的“真实状态”。关键点在于模型初始状态往往和真实状态不一样时间一长模型状态和真实状态就会偏离。观测器的作用就是引入输出误差修正项用实际输出和模型输出的差值来不断校正模型状态使估计值收敛到真值。3.2 全维观测器的结构与增益计算全维观测器的动态方程长这样x_hat_dot A x_hat B u L (y - C x_hat)这里x_hat是状态估计L是一个n×p的观测器增益矩阵。注意看和原系统相比多了一项L(y - C x_hat)。如果x_hat和x完全相等那么y - C x_hat 0观测器方程就退化成了原系统的复制品。如果存在偏差这一项就会根据偏差的大小和方向来修正x_hat的走向。定义估计误差 e x - x_hat求导代入可得e_dot (A - L C) e这个式子极其关键——它表明估计误差的动态矩阵是A - LC和原来的状态反馈问题在数学形式上完全对称。状态反馈是调整A - BK的特征值观测器是调整A - LC的特征值。因此观测器增益L的设计也变成一个极点配置问题只不过现在要配的是“误差系统”的极点而且能任意配置极点的充要条件变成了系统完全能观。注意这里有个符号习惯有些教材写成x_hat_dot A x_hat B u L(y - C x_hat)那么误差矩阵是A - LC也有些教材写成x_hat_dot A x_hat B u L(C x_hat - y)那误差矩阵就变成A LC。考试前先看清自己教材的约定别条件背对了符号搞反导致特征值算出来全是正实部。观测器增益的设计算法和状态反馈完全同构可以直接套用能观标准型或者用MATLAB的 transpose 技巧L place(A, C, P_obs);原理很直接A - LC的特征值等于(A - LC)^T A^T - C^T L^T的特征值所以把原对偶系统(A^T, C^T)看成状态反馈系统设计反馈增益L^T然后再转置回来。3.3 分离定理状态反馈和观测器各干各的如果控制器需要状态反馈而状态又测不到最常见的方案是先设计观测器把观测器估计出来的x_hat当作真实状态去反馈。直观上这会有个疑问观测器的误差会不会影响控制系统的极点毕竟控制器使用的是“假状态”。分离定理告诉我们可以放心只要原系统能控误差系统能观那么状态反馈极点和观测器极点是相互独立的。由控制率u -K x_hat v 和观测器方程联立起来得到的整个闭环系统的特征值正好等于A - BK的特征值和A - LC的特征值取并集。也就是说你可以分别设计K和L最后把它们拼在一起不需要来回迭代。这个性质极大简化了工程实现。但在物理世界中有一条实际心法观测器的响应速度一般要比期望的闭环极点快3到5倍。为什么因为控制器是靠观测器输出工作的如果观测器收敛太慢初始阶段控制器相当于在用错误的状态值反馈即使闭环极点设计得再好实际动态也会被观测器的“拖后腿”带偏。快3到5倍通常能保证在控制器主要动态发展阶段观测误差几乎已经衰减完毕。不过也不能快得离谱观测器增益太大会把测量噪声放大估计出来的状态抖动严重反而降低控制品质。3.4 降维观测器能省则省的技巧全维观测器把n个状态全部估计一遍但现实中有些状态是可以直接测量的直接量到的分量就没必要再去估计。降维观测器只估计那些不能直接测量的状态阶数从n降到n - qq是能直接测量的输出个数。这样做可以减少计算负担也能减弱噪声影响。降维观测器的推导有一定技巧通过坐标变换把系统状态分解成可测部分x1和不可测部分x2然后利用输出y x1假设输出直接对应部分状态作为已知输入设计一个相对低阶的观测器来估计x2。核心方程形式上仍是Luenberger观测器只是矩阵块要重新组合。考试和工程中如果输出矩阵C已经长得像[I, 0]那就非常方便如果不是需要先做坐标变换z T x。很多人在这一步耽误很久因为他们不愿意做矩阵求逆。实际建议是如果对算法流程还不熟先掌握全维观测器因为原理相同降维观测器无非是省了一部分计算性能优势在你的课程设计里通常体现不明显。4. 反馈结构的选择与设计权衡4.1 状态反馈、输出反馈与动态补偿器怎么选状态反馈理论上很强但它要求状态可测或者可估计。输出反馈直接使用传感器信号实现简单但是反馈信号的维度有限一般很难任意配置极点。动态补偿器则是把一个控制器本身也做成一个动态系统输入是误差信号输出是控制量经典控制里的PID就是最简单的动态补偿器之一。在实际项目里状态反馈通常要搭配观测器整个控制律算下来并不比经典PID简单多少。所以一个很实际的考虑是能用输出反馈满足性能就尽量不引入观测器。经典控制中的滞后超前校正、PID就是这样因为它的结构简单、调试直观、鲁棒性好。现代控制理论的优势体现在多变量强耦合系统和非最小相位系统的处理上此时用经典方法很难对付状态反馈观测器才是正道。设计时先问问自己系统的相对阶是不是低耦合严重不严重外部扰动有什么特点如果只是一个单回路PID就能解决你偏要上一套LQR加观测器那就是用大炮打蚊子后期维护也痛苦。4.2 LQR从极点配置到最优控制的延伸第五章很多教材会在最后引入二次型最优控制也就是LQR。LQR的实质是通过最小化一个包含状态和输入的性能指标J来间接确定反馈增益K。性能指标J ∫(x^T Q x u^T R u) dt其中Q和R是加权矩阵Q惩罚状态偏差R惩罚控制量大小。解对应的代数黎卡提方程得到最优反馈律u -R^(-1) B^T P x。这里P是黎卡提方程的正定解。和直接极点配置相比LQR有一个好处是能自动在“控制量有多大”和“状态偏差降多快”之间做最优权衡。设计时不需要指定一组极点而是指定Q和R然后让系统自己算出一个有“最优味道”的极点组合。工程中调整Q、R比调整一组极点更直观比如你觉得控制量太冲就增大R你觉得状态收敛太慢就增大Q。不过LQR也有个大坑它对模型精度要求较高而且本身是“全状态反馈”同样需要观测器支持。在做课程设计时通常可以先用LQR算出K再手动调整R看仿真效果和极点位置变化后续加入观测器和扰动找感觉。4.3 工程实现中的积分作用与抗扰学完状态反馈、观测器很多同学会兴奋地搭出一套状态反馈系统仿真波形也漂亮但到了实物阶段发现稳态误差根本压不下来。原因是模型有偏差、外部有常值扰动而纯状态反馈没有积分作用系统的型别通常为零型或者只有有限型别于是存在无法消除的静态误差。解决办法之一是在状态反馈路径上再串联一个积分器把误差的积分也作为一个新的“状态”引入系统这就得到了增广状态空间模型x_aug [x; x_i]其中 x_i_dot r - y对新系统重新做极点配置或LQR设计就实现了一种带积分作用的现代控制器。这样做带来的额外好处是对常值扰动和模型误差具有鲁棒性本质上接近经典控制中的PI控制器但又能处理多变量耦合。代价是系统阶数上升了一阶极点数量多了调参空间也变大。另外要注意增广系统的能控性问题原系统必须能控而且没有传输零点在原点或者说不存在不稳定的固定模否则积分器的状态可能不受控制设计出来的控制器会出问题。5. 常见问题与调试经验实录5.1 能控性判了半天问题出在数据维度有一道很经典的题目给定A和B让你判断能控性并设计状态反馈。不少学生直接用det(能控性矩阵)不等于0来判断计算量巨大不说遇到4阶以上系统很容易出错。其实秩判据计算rank即可而且数值上要容忍误差。现实中我更推荐先看约当标准型同一个约当块对应的行是否有B的对应行分量不为0这个判断方式不需要求逆直观且稳定。还有一个常见的低级错误是拿稳能控矩阵时漏写某一项。A是n×n时能控性矩阵应该包含A^0B, A^1B, ..., A^(n-1)B一共n块每一块的维度是n×m。千万别只列到A^(n-2)B少一块直接导致秩判断错误后面设计K就全乱套。我建议在代码里用循环生成不要手写长串。5.2 期望极点到底怎么选别拍脑袋考卷上通常会直接给你一组期望极点比如s -2 ± j3或者给出阻尼比和自然频率让你自己算。但实际工程里极点位置的选择更多是基于经验与约束折中。经验公式如果主导极点对应的自然频率为ωn那么系统上升时间大致约在1.8/ωn超调量由阻尼比z决定调节时间约4/(zωn)。选极点时先看你能不能接受对应的响应指标。另外还要注意零点对动态的影响如果闭环零点接近极点会显著改变超调和上升时间教材上所谓的“主导极点”只是近似仿真还是要看完整零极点。还有一条很关键的坑期望极点不能选得离原系统的非主导零点太远否则为了把这些极点“拉”过去反馈增益会变得巨大执行器会饱和。一个常见的建议是把期望极点限制在以原点为圆心、半径约为原系统动态矩阵范数的几倍以内具体数值要通过仿真试。先跑一版看控制量是否在约束范围内再微调。5.3 观测器增益太大会发生什么前面说观测器极点要快3到5倍但总有人把这个倍数推得过高比如几十倍。观测器增益L越大意味着输出误差被放大得越厉害。系统输出里永远有测量噪声噪声是高频成分被这个高增益放大后估计出的x_hat就会高频剧烈抖动而控制器再用这个抖动的x_hat去反馈整个闭环系统就会跟着抖动严重时执行机构一直在高频动作很快就会损坏。这其实就是经典控制中“带宽”的问题。观测器本质上也是一个滤波器它的带宽取决于特征值虚部的模。想要跟踪快速变化的真实状态就得把带宽做高但高带宽会把高频噪声带进来。工程上这个折中要从频谱分析出发对噪声的主要频带做抑制对真实状态的频带做跟踪。如果没有频谱数据就用不同增益多跑几次仿真观察估计误差和控制量的平滑程度。5.4 离散化之后的坑现代控制理论是连续时间体系但实际嵌入式实现都是离散的采样周期存在必然的零阶保持效应。直接把连续时间设计出来的L和K用于离散系统只要采样速率比系统带宽高很多一般是带宽的10倍以上经验上问题不大。如果采样率不高就必须先离散化模型然后在离散域重新做极点配置或LQR设计。离散化的一个隐蔽问题是在连续域里观测器的离散化如果直接取一阶微分近似会引入额外的延迟可能改变稳定性。稳妥的做法是用零阶保持法离散模型再用离散的能控性/能观性重新设计控制器。MATLAB里先用 c2d 把连续模型转为离散模型再对自己的离散模型做 place 或者 dlqr而不是直接把连续矩阵代入能避免很多诡异现象。这里还有一个小技巧做实物调试时把采样周期与控制周期分开状态估计器用较高的频率运行控制器以较低频率运行这样能在不增加主循环计算负担的情況下获得更好的抗噪性。不过这也带了同步问题需要引入时间戳复杂度会上去建议先简单做等系统工作稳定后再优化。5.5 模型误差和鲁棒性理论设计只是起点学完这一章很容易产生一种幻觉只要我能控能观极点想放哪就放哪系统性能完全由我掌控。实际工程里没有这么美好因为你的A和B是建模得到的存在参数误差。一个在标称模型中能稳定工作的控制器放在真实系统里可能因为参数偏差导致闭环极点偏离甚至跑到右半平面。经典鲁棒性指标比如稳定裕度、补灵敏度函数在第五章里未必详细讲但你应该至少养成这样一个习惯设计完成后把模型参数上下浮动10%到20%做敏感性测试看看闭环极点是否仍然位于稳定区域。如果稍微扰动一下就不稳定说明你的设计过于依赖模型精确度这时应该考虑提高阻尼、降低带宽或者采用更保守的极点位置。我碰到过一个实际项目某设备的状态空间模型是从辨识数据得到的当时设计的状态反馈控制器在仿真里表现很好但一上实物就低频振荡。后来排查发现是执行器存在死区控制量在小范围内出现了非线性而这个非线性在模型中完全没有体现。解决办法是把死区补偿加进去同时稍微降低反馈增益给系统留些余量。这类经历告诉我第五章的数学工具只是起点真正想做出稳定好用的控制器必须对模型不确定性保持敬畏。结语一点个人体会写到这里我还是想说回这一章对思维方式的改变。很多人以为“综合”就是套公式、算增益实际上它要求你在可控性、可观性这些理论约束和物理实现、噪声、饱和这些工程约束之间来回穿梭。我自己带过几个课程项目发现能把第五章学活的人往往不是背教程背得最多的人而是愿意做完一个设计后把期望极点往左推一推、往右拉一拉亲自看仿真波形变化的人。如果你正在学这一章我的建议是先别急着记算法动手写一个二阶系统手动配一组极点看反馈增益怎么变再把观测器加上观察估计误差的收敛过程最后把系统参数改动百分之几看看还稳不稳。把这三个实验做一遍比你刷十道题都管用。多变量系统的自由度和极点配置的那些微妙之处也只有在你亲自动手时会露出真面目。