基于Matlab的LMI矩阵理论算法与矩阵不等式研究:待求矩阵在LMI区域内的优化设计与区间观...

基于 Matlab的LMI矩阵理论与算法、矩阵不等式 待求矩阵在lmi中的一个小矩阵中 区间观测器设计

LMI这玩意儿搞控制的老铁肯定不陌生,尤其是设计观测器的时候总得和矩阵不等式打交道。最近帮学弟调区间观测器代码,发现有个坑特别容易踩------待求矩阵被嵌套在LMI的小块矩阵里,这时候用Matlab的LMI工具箱处理起来得讲究点技巧。

先举个栗子,假设咱们要处理形如A'P + PA + Q < 0这种经典不等式,这时候直接上feasp或者mincx可能没啥问题。但实际情况往往更复杂,比如观测器增益矩阵L被藏在某个子矩阵块里:

A'P + PA - C'L' - LC \*

B'P -γI

这种结构下,传统写法容易把变量位置搞错。这时候就得用lmivar的三明治操作了------先定义矩阵块结构,再通过偏移量定位变量位置。

matlab 复制代码
setlmis([]); 
P = lmivar(1,[n 1]);  % 对称正定矩阵
L = lmivar(2,[m,n]);  % 全矩阵结构

% 构建块矩阵
lmiterm([1 1 1 P],A',1,'s');  % A'P + 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出现在非对角线位置时,得注意转置顺序。比如- C'L'其实等价于转置后的结构,这时候用lmiterm的参数顺序调整比手动转置更安全。

遇到变量耦合的情况,建议先纸上推导分块结构,标出每个块的变量依赖关系。比如观测误差动态方程中的交叉项处理:

matlab 复制代码
% 处理观测误差中的耦合项
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-L*C)会出大事,得拆解成多个lmiterm。有个验证技巧:把生成的LMI用getlmis检查矩阵块维度是否匹配,特别是变量块的位置是否产生冲突。

最后上求解器前,记得用decinfo检查决策变量映射关系。曾经有个bug折腾了我两小时,最后发现是L变量被错误映射到了P的对称位置。代码检查阶段可以这样操作:

matlab 复制代码
LMIsys = getlmis;
[P_idx, L_idx] = decinfo(LMIsys);
disp('决策变量结构:');
disp([P_idx; L_idx]);

解出来后用dec2mat提取变量时,注意维度对齐。特别是当L被多个不等式约束时,可能出现解不唯一的情况,这时候加个迹最小化的目标函数会更稳。

总之,处理嵌套变量的LMI就像搭乐高,得先看清图纸结构再动手码代码。多试几个测试用例,用issymmetric检查生成矩阵的对称性,能省下不少debug时间。

相关推荐
欧云服务器4 天前
怎么让脚本命令可以同时在centos、debian、ubuntu执行?
ubuntu·centos·debian
智渊AI4 天前
Ubuntu 20.04/22.04 下通过 NVM 安装 Node.js 22(LTS 稳定版)
ubuntu·node.js·vim
The️4 天前
Linux驱动开发之Read_Write函数
linux·运维·服务器·驱动开发·ubuntu·交互
再战300年4 天前
Samba在ubuntu上安装部署
linux·运维·ubuntu
qwfys2004 天前
How to install golang 1.26.0 to Ubuntu 24.04
ubuntu·golang·install
木尧大兄弟4 天前
Ubuntu 系统安装 OpenClaw 并接入飞书记录
linux·ubuntu·飞书·openclaw
小虾爬滑丫爬4 天前
ubuntu上设置Tomcat 开机启动
ubuntu·tomcat·开机启动
老师用之于民4 天前
【DAY25】线程与进程通信:共享内存、同步机制及实现方案
linux·c语言·ubuntu·visual studio code
小虾爬滑丫爬4 天前
Ubuntu 上设置防火墙
ubuntu·防火墙
林开落L5 天前
解决云服务器内存不足:2 分钟搞定 Ubuntu swap 交换区配置(新手友好版)
运维·服务器·ubuntu·swap交换区