如何用MATLAB的LMI求解器处理带等式约束的LMI可行性问题?
解决MATLAB中LMI求解器处理$M^T N = I - XY$约束的方法
原问题中的约束包含**非线性双线性项$XY$**以及矩阵非奇异要求,而MATLAB的LMI求解器(无论是Robust Control Toolbox的lmilab还是YALMIP)仅能直接处理线性矩阵不等式或可转化为LMI的约束,因此需要通过变量替换或等价变换将原约束转化为可求解的形式。
核心思路:消除双线性项
原等式约束$M^T N = I - XY$可通过以下步骤转化:
- 利用$X>0$的正定性,将等式变形为$Y = X^{-1}(I - M^T N)$;
- $Y>0$的约束等价于$I - M^T N > 0$(因为正定矩阵$X^{-1}$与矩阵$A$的乘积正定,当且仅当$A$正定);
- $M$、$N$的非奇异性可由$I - M^T N > 0$推导:$I - M^T N$正定可逆,因此$M^T N = I - (I - M^T N)$可逆,进而$M$、$N$均非奇异。
实现方案
方案1:使用YALMIP(更简洁,支持非线性SDP求解)
YALMIP可直接处理双线性约束,并自动调用合适的求解器(如SEDUMI、SDPT3):
% 替换为你的矩阵维度 n = 3; % 定义决策变量 X = sdpvar(n,n); Y = sdpvar(n,n); M = sdpvar(n,n); N = sdpvar(n,n); % 构建约束 Constraints = [ X > 0, % X正定 Y > 0, % Y正定 M'*N == eye(n) - X*Y % 原等式约束 ]; % 求解可行性问题 ops = sdpsettings('solver','sedumi'); % 选择求解器 result = solvesdp(Constraints,[],ops); % 提取结果 if result.problem == 0 X_val = value(X); Y_val = value(Y); M_val = value(M); N_val = value(N); else disp('问题不可行'); end
方案2:使用Robust Control Toolbox的lmilab(仅处理线性约束)
若需严格使用原生LMI工具箱,需将双线性项转化为线性约束:
% 替换为你的矩阵维度 n = 3; % 初始化LMI系统 setlmis([]); % 定义变量:X、K为对称正定矩阵,M、N为一般矩阵 X = lmivar(1,[n 1]); K = lmivar(1,[n 1]); M = lmivar(2,[n n]); N = lmivar(2,[n n]); % 约束1:X > 0 lmiterm([1 1 1 X],1,1); % 约束2:K > 0(K = I - M^T N) lmiterm([2 1 1 K],1,1); % 约束3:M^T N + K = I(转化为两个LMI实现等式) % 子约束3a:M^T N + K - I ≥ 0 lmiterm([3 1 1 K],1,1); lmiterm([3 1 1 M],1,N,'t'); % 表示M'*N lmiterm([3 1 1 0],-eye(n)); % 子约束3b:-(M^T N + K - I) ≥ 0 ⇒ M^T N + K - I ≤ 0 lmiterm([4 1 1 K],-1,1); lmiterm([4 1 1 M],-1,N,'t'); lmiterm([4 1 1 0],eye(n)); % 生成LMI系统 lmis = getlmis; % 求解可行性问题 [tmin,xfeas] = feasp(lmis); % 提取变量值并计算Y if tmin < 1e-5 % 判定可行(tmin接近0) X_val = dec2mat(lmis,xfeas,X); K_val = dec2mat(lmis,xfeas,K); M_val = dec2mat(lmis,xfeas,M); N_val = dec2mat(lmis,xfeas,N); Y_val = inv(X_val)*(eye(n) - K_val); % 由Y = X^{-1}(I - M^T N)计算 else disp('问题不可行'); end
注意事项
- 若使用YALMIP,需确保已安装对应的求解器(如SEDUMI、SDPT3);
- 矩阵维度需根据实际问题替换;
- 若问题不可行,可检查约束是否存在矛盾,或尝试调整初始变量猜测。
内容的提问来源于stack exchange,提问作者Optimal
相关产品推荐
相关产品推荐

