基于 Matlab的LMI矩阵理论与算法、矩阵不等式 待求矩阵在lmi中的一个小矩阵中 区间观测器设计LMI这玩意儿搞控制的老铁肯定不陌生尤其是设计观测器的时候总得和矩阵不等式打交道。最近帮学弟调区间观测器代码发现有个坑特别容易踩——待求矩阵被嵌套在LMI的小块矩阵里这时候用Matlab的LMI工具箱处理起来得讲究点技巧。先举个栗子假设咱们要处理形如AP PA Q 0这种经典不等式这时候直接上feasp或者mincx可能没啥问题。但实际情况往往更复杂比如观测器增益矩阵L被藏在某个子矩阵块里[ AP PA - CL - LC * ][ BP -γI ]基于 Matlab的LMI矩阵理论与算法、矩阵不等式 待求矩阵在lmi中的一个小矩阵中 区间观测器设计这种结构下传统写法容易把变量位置搞错。这时候就得用lmivar的三明治操作了——先定义矩阵块结构再通过偏移量定位变量位置。setlmis([]); P lmivar(1,[n 1]); % 对称正定矩阵 L lmivar(2,[m,n]); % 全矩阵结构 % 构建块矩阵 lmiterm([1 1 1 P],A,1,s); % AP PA lmiterm([1 1 1 L],-1,C); % -LC lmiterm([1 1 1 0],Q); % Q lmiterm([1 2 2 0],-gamma*eye(p));这里有个骚操作当L出现在非对角线位置时得注意转置顺序。比如- CL其实等价于转置后的结构这时候用lmiterm的参数顺序调整比手动转置更安全。遇到变量耦合的情况建议先纸上推导分块结构标出每个块的变量依赖关系。比如观测误差动态方程中的交叉项处理% 处理观测误差中的耦合项 lmiterm([-2 1 1 P],1,1); % P 0 lmiterm([3 1 1 P],1,A,s); % P(A-LC) (A-LC)P lmiterm([3 1 1 L],-1,C); % 关键在这行隐含了PL的耦合这时候如果直接写P(A-LC)会出大事得拆解成多个lmiterm。有个验证技巧把生成的LMI用getlmis检查矩阵块维度是否匹配特别是变量块的位置是否产生冲突。最后上求解器前记得用decinfo检查决策变量映射关系。曾经有个bug折腾了我两小时最后发现是L变量被错误映射到了P的对称位置。代码检查阶段可以这样操作LMIsys getlmis; [P_idx, L_idx] decinfo(LMIsys); disp(决策变量结构:); disp([P_idx; L_idx]);解出来后用dec2mat提取变量时注意维度对齐。特别是当L被多个不等式约束时可能出现解不唯一的情况这时候加个迹最小化的目标函数会更稳。总之处理嵌套变量的LMI就像搭乐高得先看清图纸结构再动手码代码。多试几个测试用例用issymmetric检查生成矩阵的对称性能省下不少debug时间。