我在网上找到的一篇博客。难能可贵的是,作者将自己的程序完全放在上面了,并且程序比较详细,效果和原文一致。Matlab中LMI(线性矩阵不等式)工具箱使用教程-cy_xiaoxiao-ChinaUnix博客
http://blog.chinaunix.net/uid-7586065-id-2048679.html?page=2
Matlab中LMI(线性矩阵不等式)工具箱使用教程 - 豆丁网Docin
https://www.docin.com/p-302463248.html 程序如下:
A = [2 1; 0 1];
Ad = [0.2 0.1; 0 0.1];
B1 = [0.1 0.1]';
B2 = [1 1]';
Bd = [0.1 0.1]';
C = [1, 1];
Cd = [0.1, 0.1];
D11 = 0.1;
D12 = 1;
Dd = 0.1;
gammar = 1;
% Initial a LMI system
setlmis([]);
% Define Variables
% Q is a symmetric matrix, has a block size of 2 and this block is symmetric
Q = lmivar(1, [2 1]);
% S1 a symmeric matrix, size 2
S1 = lmivar(1, [2 1]);
% S2 is 1 by 1 matrix
S2 = lmivar(1, [1 0]);
% Type of 2, size 1 by 2
M = lmivar(2, [1 2]);
% Q, S1, S2 > 0
lmiterm([-2 1 1 Q], 1, 1);
lmiterm([-3 1 1 S1], 1, 1);
lmiterm([-4 1 1 S2], 1, 1);
% pos in (1, 1)
lmiterm([1 1 1 Q], -1, 1);
lmiterm([1 1 1 S2], Bd, Bd');
lmiterm([1 1 1 S1], Ad, Ad');
% pos (1, 2)
lmiterm([1 1 2 Q], A, 1);
lmiterm([1 1 2 M], B2, 1);
% pos(1, 3)
lmiterm([1 1 3 0], B1);
% pos(1, 4)
lmiterm([1 1 4 S2], Bd, Dd');
lmiterm([1 1 4 S1], Ad, Cd');
% pos(2, 2)
lmiterm([1 2 2 Q], -1, 1);
% pos(2, 4)
lmiterm([1 2 4 Q], 1, C');
lmiterm([1 2 4 -M], 1, D12');
% pos(2, 5)
lmiterm([1 2 5 -M], 1, 1);
% pos(2, 6)
lmiterm([1 2 6 Q], 1, 1);
% pos(3, 3)
lmiterm([1 3 3 0], -(gammar^2));
% pos(3, 4)
lmiterm([1 3 4 0], D11');
% pos(4, 4)
lmiterm([1 4 4 0], -1);
lmiterm([1 4 4 S1], Cd, Cd');
lmiterm([1 4 4 S2], Dd, Dd');
lmiterm([1 5 5 S2], -1, 1);
lmiterm([1 6 6 S1], -1, 1);
lmis = getlmis;
[tmin, feas] = feasp(lmis)
Q = dec2mat(lmis, feas, Q)
Q =
1.9253 -2.2338
-2.2338 9.1054
我遇到的一个问题:
我想要定义一个1*2维的长方矩阵变量,根据书中、网上资料(包括这篇博客),我写的没错,
lmivar(2, [1 2])
但是,我发现自己定义出来的这个变量并不是1*2维的。
setlmis([]);
size(lmivar(2, [1 2]))
结果如下
ans =
1 1
我不理解:1、是我的工具箱安装的有问题?2、我对这条代码理解不对?3、我显示这个变量维度的方法不对?
1、是我的工具箱安装的有问题?
我想并不是,毕竟我运行博客中代码得到的结果和作者的结果一致,如下。
Q =
1.9253 -2.2338
-2.2338 9.1054
2、我对这条代码理解不对?
这……我无法回答,只能说,我看了好多资料都是这么说的。我再问问。
3、我显示这个变量维度的方法不对?
运行该作者的代码前,清理一下数据。
clear;clear all;yalmip('clear');clc;
运行代码后,显示M,因为M在文中的定义是
% Type of 2, size 1 by 2
M = lmivar(2, [1 2]);
显示M
M
size(M)
结果如下,说明M就是一个不折不扣的1*1变量(除非问题2)
M =
4
ans =
1 1
答案果然在问题2

setlmis([])
X1 = lmivar(1,[3 1]); % Type 1
X2 = lmivar(2,[2 4]); % Type 2 of dimension 2-by-4
X3 = lmivar(1,[5 1;1 0;2 0]); % Type 1
这样定义是对的,但是显示数据的时候不能用这种方法。在Type-3的矩阵变量定义的例子中讲到:


综上,我应使用如下形式定义,在显示结果的时候使用sX1、sX2变量。
setlmis([])
[X1,n,sX1] = lmivar(2,[2 3]);
[X2,n,sX2] = lmivar(2,[3 2]);
然而,我用上述方法仍然不行,最后我发现,其实,问题在于3,真正的解决方法是使用dec2mat()函数。
另外,提醒一下帮助文档打不开的解决办法。
help文档打不开 - Michael_Xun - 博客园 (cnblogs.com)
https://www.cnblogs.com/michaelxun/p/12665624.html
本文讲述了作者在使用Matlab的LMI工具箱时遇到的问题,即定义的1*2维长方矩阵变量显示为1*1。通过排查,确定不是工具箱安装问题,而是显示方法错误。最终发现正确显示矩阵变量维度的方法是使用dec2mat()函数,同时分享了解决帮助文档打不开的链接。

2万+

被折叠的 条评论
为什么被折叠?



