Matlab中使用LMI toolboxLMI

(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]);

注意:用第三种方法表示变量时,被表示变量只能用 已声明变量的正一倍或负一倍或转置或0矩阵表示。
		(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 + XACTSCXB, 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
 
  

你可能感兴趣的:(Matlab中使用LMI toolboxLMI)