用MATLAB验证求解三类便准的线性矩阵不等式问题的例题
时间: 2023-11-09 17:08:31 浏览: 81
线性矩阵不等式的MATLAB求解
好的,让我们来看一个具体的例题。
考虑以下的线性系统:
```
dx/dt = Ax + Bu
y = Cx + Du
```
其中,状态向量 `x` 是一个2维列向量,输入向量 `u` 是一个标量,输出向量 `y` 也是一个标量。矩阵 `A`、`B`、`C` 和 `D` 分别是:
```
A = [-1 -2; 0 -3]
B = [1; 0]
C = [1 1]
D = 0
```
我们的目标是设计一个状态反馈控制器,使得系统的闭环极点在左半平面,并且满足下面的性能指标:
1. 系统的阻尼比大于等于0.7。
2. 系统的静态误差小于等于0.1。
为了满足这些要求,我们可以使用三类便准的线性矩阵不等式来设计状态反馈控制器。具体来说,我们可以将闭环系统表示为以下形式:
```
dx/dt = (A-BK)x
y = Cx
```
其中,`K` 是状态反馈矩阵。根据三类便准的线性矩阵不等式,我们需要找到一个半正定矩阵 `P`,使得下面的矩阵不等式成立:
```
A'PA - PB^2P + C'QC < 0
```
其中,`Q` 是一个正定矩阵,它的大小与矩阵 `C` 的大小相同。此外,我们还需要满足以下两个条件:
1. `P` 为对称矩阵。
2. 矩阵 `A-BK` 是稳定的。
我们可以使用MATLAB来验证是否存在满足这些条件的半正定矩阵 `P`,以及对应的状态反馈矩阵 `K`。
以下是MATLAB代码示例:
```matlab
% 定义系统的矩阵
A = [-1 -2; 0 -3];
B = [1; 0];
C = [1 1];
D = 0;
% 定义性能指标
zeta_min = 0.7;
e_ss_max = 0.1;
% 定义线性矩阵不等式的参数
Q = eye(2);
R = 1;
% 求解线性矩阵不等式
setlmis([]);
P = lmivar(1,[2 1]);
K = lmivar(1,[1 2]);
lmiterm([1 1 1 P],A',1,'s'); % A'PA
lmiterm([-1 1 1 P],B*B'); % -PB^2P
lmiterm([1 1 1 0],-C'*Q*C); % -C'QC
lmiterm([1 2 1 K],1,B'); % BK
lmiterm([-2 1 1 P],zeta_min^2,1); % zeta_min^2*P > 0
lmiterm([3 1 1 P],1,1); % P > 0
lmis = getlmis;
[tmin,xfeas] = feasp(lmis);
if tmin < 0
disp('无解');
else
P = dec2mat(lmis,xfeas,P);
K = dec2mat(lmis,xfeas,K);
if min(eig(P)) < 0
disp('解不是半正定的');
else
disp('解是半正定的');
disp(['状态反馈矩阵 K = ', num2str(K)]);
end
end
% 计算系统的阻尼比和静态误差
A_new = A - B*K;
e_ss = -inv(C*inv(A_new)*B)*D;
zeta = sqrt((1 - e_ss)^2 / (1 + e_ss^2));
disp(['系统的阻尼比为 ', num2str(zeta)]);
disp(['系统的静态误差为 ', num2str(e_ss)]);
```
运行这段代码后,MATLAB会输出结果,其中包括:
1. 是否存在满足条件的半正定矩阵 `P`。
2. 对应的状态反馈矩阵 `K`。
3. 系统的阻尼比和静态误差。
希望这个例题可以帮助您理解如何使用MATLAB验证求解三类便准的线性矩阵不等式问题。
阅读全文