Sử dụng LMI Solver của MATLAB
Giả sử cần kiểm tra tính khả thi của bất đẳng thức ma trận tuyến tính (Linear Matrix Inequaly) cho bởi:
Khi đó BĐT là khả thi chặt (strictly feasibile) nếu tồn tại một nghiệm
sao cho:
Điều này tương đương với việc bài toán tối ưu lồi
có nghiệm
. Nếu bài toán là khả thi nhưng không chặt, sẽ nhận giá trị dương rất nhỏ.
Sử dụng MATLAB: Lệnh feasp
[tmin,xfeas]=feasp(lmisys,options,target)
Ví dụ: Xét bài toán tìm ma trận P>I thỏa mãn:
với , , .
setlmis([])
p = lmivar(1,[2 1]);
A1 = [-1 2;
1 -3];
A2 = [-0.8 1.5;
1.3 -2.7];
A3 = [-1.4 0.9;
0.7 -2.0];
lmiterm([1 1 1 p],1,A1,'s'); % LMI #1
lmiterm([2 1 1 p],1,A2,'s'); % LMI #2
lmiterm([3 1 1 p],1,A3,'s'); % LMI #3
lmiterm([-4 1 1 p],1,1); % LMI #4: P
lmiterm([4 1 1 0],1); % LMI #4: I
lmis = getlmis;
options = [0,0,10,0,0];
[tmin,xfeas] = feasp(lmis,options,-1)
P = dec2mat(lmis,xfeas,p)
Trong phần code trên lưu ý hai lệnh:
Lệnh lmivar: tạo một ma trận chứa biến trong hệ BPT ma trận
Sử dụng:
X = lmivar(TYPE,STRUCT) thêm một biến ma trận X vào hệ LMI đang có
[X,NDEC,XDEC] = lmivar(TYPE,STRUCT) trả về thứ tự của biến ma trận X, tổng số biến quyết định (decision variable) trong X, NDEC, và vị trí các biến quyết định trong X, XDEC.
Lệnh lmiterm: thêm một thành phần vào một LMI
Sử dụng: lmiterm(TERMID,A,B,FLAG) thêm một phần tử vào một LMI trong hệ đang xét. Thành phần này có thể là một hệ số ngoài, một ma trận hằng, hoặc một biến A*X*B hoặc A*X’*B trong đó X là một biến ma trận.
Do các thành phần ma trận khối nằm ngoài đường chéo chính (i,j) và (j,i) là chuyển vị của nhau, ta chỉ nhập 1 trong hai thành phần.
Ví dụ 2: Xét bất đẳng thức ma trận có dạng:
, ,
Code thực hiện với MATLAB:
A = [ -0.8715 0.5202 0.7474 1.0778 -0.9686 0.1005;
-0.5577 -1.0843 1.8912 0.2523 1.0641 -0.0345;
-0.2615 -1.7539 -1.5452 -0.2143 0.0923 -2.4192;
0.6087 -1.0741 0.1306 -2.5575 2.3213 0.2388;
-0.7169 0.3582 -1.4195 1.7043 -2.6530 -1.4276;
-1.2944 -0.6752 1.6983 1.6764 -0.3646 -1.7730];
B = [ 0 0.8998 -0.2130 0.9835;
0 -0.3001 0 -0.2977;
-1.0322 0 -1.0431 1.1437;
0 -0.3451 -0.2701 -0.5316;
-0.4189 1.0128 -0.4381 0;
0 0 -0.4087 0];
C = [ 0 2.0034 0 1.0289 0.1554 0.7135;
0.9707 0.9510 0.7059 1.4580 -1.2371 0.3174;
0 0 1.4158 0.0475 -2.1935 0.4136;
-0.4383 0.6489 -1.6045 1.7463 -0.3334 -0.5771];
setlmis([])
X = lmivar(1,[6 1]);
S = lmivar(1,[2 0;2 1]);
% 1st LMI
lmiterm([1 1 1 X],1,A,'s');
lmiterm([1 1 1 S],C',C);
lmiterm([1 1 2 X],1,B);
lmiterm([1 2 2 S],-1,1);
% 2nd LMI
lmiterm([-2 1 1 X],1,1);
% 3rd LMI
lmiterm([-3 1 1 S],1,1);
lmiterm([3 1 1 0],1);
LMISYS = getlmis;
options = [0,0,10000,0,0];
[tmin,xfeas] = feasp(LMISYS,options,-1)
P = dec2mat(LMISYS,xfeas,p)