LMI工具箱的使用

本文讲述了作者在使用Matlab的LMI工具箱时遇到的问题,即定义的1*2维长方矩阵变量显示为1*1。通过排查,确定不是工具箱安装问题,而是显示方法错误。最终发现正确显示矩阵变量维度的方法是使用dec2mat()函数,同时分享了解决帮助文档打不开的链接。

 我在网上找到的一篇博客。难能可贵的是,作者将自己的程序完全放在上面了,并且程序比较详细,效果和原文一致。Matlab中LMI(线性矩阵不等式)工具箱使用教程-cy_xiaoxiao-ChinaUnix博客http://blog.chinaunix.net/uid-7586065-id-2048679.html?page=2

Matlab中LMI(线性矩阵不等式)工具箱使用教程 - 豆丁网Docinhttps://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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值