(1)使用环境:matlab 2014a 。LMI工具包不用安装,可以直接使用。
(2)LMI toolbox: Linear Matrix Inequality,线性矩阵不等式。
(3)如何定义一个LMI系统:
1.初始化一个 LMI 系统
setlmis([]) 注意这只是定义一个LMI系统,并不是定义了一个 LMI不等式。LMI不等式需要用newlmi函数定义。
如果想把一个之前定义好的LMI系统LMIS0引入进来
setlmis(LMIS0)
2.定义LMI变量
X = lmivar(1,[6 1]); S = lmivar(1,[2 0;2 1]);上面的函数定义了两个矩阵型LMI矩阵变量 X 和 S
lmivar() 函数说明:
第一个参数表示矩阵的类型,可以是1,2,3
1:对称块对角结构
X3 = lmivar(1,[5 1;1 0;2 0]); % Type 1
2:矩形结构
如lmivar(2,[3 5])表示大小为3*5的普通矩阵
3:一般结构
为了有助于描述这一类型的矩阵变量,lmivar提供了两个额外的输出,它的一般表达式是:[X,n,sX]=lmivar(type,struct) 其中n和sX是提供的两个额外输出n表示到目前为止使用的决策变量的总数,sX表明了变量X中的每一个元依赖于决策变量的哪个元。
例:定义,其中X1和X2分别是2*3维和3*2维的长方矩阵
(第三种结构可以用来表示矩阵型中间变量,例如上面的X变量依赖于矩阵变量X1和X2。可以用下面的代码表示这个中间变量)
%定义X1和X2
setlmis([])
[X1,n,sX1] = lmivar(2,[2 3]);
[X2,n,sX2] = lmivar(2,[3 2]);
%定义第三类型矩阵X
[X,n,sX] = lmivar(3,[sX1,zeros(2);zeros(3),sX2]);
(each entry of X is specified independently as either 0, xn, or –xn where xn denotes the n-th decision variable in the problem.)
setlmis([])
[R,~,SR]=lmivar(1,[3 1]);
[P,~,SP]=lmivar(1,[3 1]);
A=[2,0,0;0,2,0;0,0,2];
[ph1,~,Sph1]=lmivar(3,A*SR);%错误的,不会报错,但这样得到的解ph1不会等于 A*变量R
[ph2,~,Sph2]=lmivar(3,2*SR);%也是错误的,不会报错,但这样得到的解ph2不会等于变量R的二倍
[ph3,~,Sph3]=lmivar(3,-SR);%正确的,解出的ph3会等于-R
[ph4,~,Sph4]=lmivar(3,SR');%正确的,解出的ph4会等于变量R的转置
第二组变量([]内的内容): 描述矩阵中的块矩阵的结构
以X为例:第一个参数数表示块矩阵的大小 6*6的块矩阵
第二个参数表示块矩阵的形式,可以是1,0,-1
1:全对称块
0:标量矩阵:即单位矩阵乘以常数
-1:0矩阵
以S为例:[] 中用;隔开的有两组数据,表示S的对角线上有两个矩阵块
(S的例子)
3.定义LMI不等式中的每一个项(lmiterm)
线性矩阵不等式(LMI)中的项:
以这个LMI不等式为例,其中的项(lmiterm)有ATX + XA, CTSC, XB, and –S
定义lmiterm:
lmiterm([1 1 1 1],1,A,'s'); %定义了ATX + XA lmiterm([1 1 1 2],C',C); %定义了CTSC lmiterm([1 1 2 1],1,B); %定义了XB lmiterm([1 2 2 2],-1,1); %定义了–S
lmiterm()函数说明:
第一个参数是一个四维向量:
向量中的第一个参数:
表示这个项属于哪个不等式,正数表示该项在不等式的左边,负数表示在不等式的右边。
向量中的第二个和第三个参数:
表示该项属于矩阵中的哪个矩阵块
向量中的第四个参数:
表示该项中包含哪个LMI变量(可以参考2.定义LMI变量)
K表示包含第K个LMI变量(也就是第K个被定义的LMI变量,如2中X是第一个LMI变量,S是第二个LMI变量)
-K表示包含第K个LMI变量的转置
0表示单位矩阵I
例如上面第一个lmiterm:lmiterm([1 1 1 1],1,A,'s'); %定义了ATX + XA
中的[1 1 1 1]表示该项在第一个不等式的左边矩阵的 (1,1)处的矩阵块中,包含第一个LMI变量(X)
第二个参数和第三个参数:
表示该项中矩阵变量两边乘上的系数:
可以是常量值,也可以将矩阵作为系数。
例如 lmiterm([1 1 1 2],C',C); %定义了CTSC 第二个和第三个参数表示矩阵变量(S)左乘矩阵C的转置,右乘矩阵C
额外参数: lmiterm([1 1 1 1],1,A,'s'); %定义了ATX + XA
中多了一个额外参数,'s'表示symmetry,即加上本项的转置。
lmiterm([1 1 1 1],1,A);表示XA lmiterm([1 1 1 1],1,A,'s');表示该项加上自身的转置,所以该项为ATX + XA 在lmiterm函数中直接使用名称:
四维向量中第一个参数如果是数字K则表示第K个LMI不等式,也可以直接用不等式的名称代替。
例如:Xpos = newlmi; lmiterm([-Xpos 1 1 X],1,1); 表示定义了一个新LMI不等式,这次定义的项在Xpos不等式的右边部分。
四维向量第四个参数如果是常数K,表示该项中含有第K个被定义的LMI变量。也可以直接用变量的名称作为这个参数。
例如:lmiterm([-Slmi 1 1 S],1,1); 表示该项中包含的LMI变量是S
4.得到问题的内部表示
当LMI系统完全定义完成之后,即lmivar(变量),lmiterm(项),lmi(项)都定义完毕。使用下面的命令行结束定义。该命令行只能使用一次。
LMISYS = getlmis;
(4)LMI系统求解
对于LMI Lab, 其中有三种求解器(solver): feasp,mincx和gevp。 每个求解器针对不同的问题: feasp:解决可行性问题(feasibility problem),例如:A(x) mincx:在线性矩阵不等式的限制下解决最小化问题(Minimization of a linear objective under LMI constraints),例如最小化c'x,在限制条件A(x) < B(x)下。 gevp:解决广义特征值最小化问题。例如:最小化lambda
1.利用feas得到LMI的解
lmis = getlmis; [tmin, feas] = feasp(lmis) %该式中的feas就是求得的解
2.运行后,就调用dec2mat把决策变量转化为矩阵形式。 Q = dec2mat(lmis, feas, Q) Q = 1.9253 -2.2338 -2.2338 9.1054
LMI toolbox的更详尽的使用可以参考以下连接:
http://read.pudn.com/downloads104/ebook/428541/LMI%20%E5%B7%A5%E5%85%B7%E7%AE%B1%E4%BB%8B%E7%BB%8D.pdf
matlab官网的相关资料:
https://cn.mathworks.com/help/robust/ug/specify-lmi-system-at-the-command-line.html
https://cn.mathworks.com/help/robust/lmis.html