在MATLAB中,可以通过以下步骤编程实现LMI(线性矩阵不等式)的求解:
初始化LMI系统
使用`setlmis([])`命令初始化一个LMI系统。这个命令只是定义一个LMI系统,而不是定义一个LMI不等式。如果需要引入一个之前定义好的LMI系统,可以使用`setlmis(lmisys0)`命令。
定义LMI变量
使用`lmivar`函数定义不同类型的矩阵变量。`lmivar`函数的语法为`X = lmivar(type, struct)`,其中`type`表示矩阵的类型,`struct`表示矩阵的结构。
`type=1`:定义块对角的对称矩阵。`struct`应该是一个二维矩阵,其中`struct(r,1)`表示第`r`个块的大小,`struct(r,2)`表示第`r`个块的类型(1--全矩阵,0--标量,-1--零阵)。
`type=2`:定义`mxn`阶的矩阵,只需写作`struct = [m,n]`。
`type=3`:定义一般形式的矩阵变量,其中每个条目被定义为0或±xn,此处`xn`代表第`n`个决策变量。
添加LMI项
使用`lmiter`函数向LMI系统中添加术语。例如,`lmiter([1 1 1 X], A1, 1, 's')`表示将矩阵`X`与矩阵`A1`的转置相乘并加上`X`的转置乘以`A1`,然后加上标量1乘以矩阵`X`。
获取LMI系统描述
使用`getlmis`函数获取LMI系统的内部表示。这个函数只能使用一次,并且必须在声明所有矩阵变量和所有LMI项之后使用。
求解LMI
使用LMI工具箱中的求解器求解LMI系统。例如,`feasp`、`mincx`和`gevp`是三种常用的求解器。
```matlab
% 初始化LMI系统
setlmis([]);
% 定义矩阵变量
P = lmivar(1, [2, 1]);
M1 = lmivar(2, [1, 4]);
M2 = lmivar(2, [1, 4]);
K1 = lmivar(2, [1, 4]);
K2 = lmivar(2, [1, 4]);
% 添加LMI项
lmiter([1 1 1 P], A1, 1, 's');
lmiter([1 1 1 M1], B1, 1, 's');
lmiter([2 1 1 P], A2, 1, 's');
lmiter([2 1 1 M2], B2, 1, 's');
lmiter([3 1 1 P], A1, 1, 's');
lmiter([3 1 1 M2], B1, 1, 's');
lmiter([3 1 1 P], A2, 1, 's');
lmiter([3 1 1 M1], B2, 1, 's');
% 获取LMI系统描述
lmisys = getlmis;
% 求解LMI
[tmin, xfeas] = feasp(lmisys);
```
在这个示例中,我们定义了一个包含两个对角块的对称矩阵`P`和其他几个矩阵变量,然后添加了一个LMI项,最后使用`feasp`求解器求解LMI系统。