Shur补无疑是简单好用的方法,但是投影定理有例程,更炫酷。
非奇异描述方式当然更好,但是奇异可以减少耦合项。
现在我只掌握了Shur补的一般系统仿真,奇异和投影都用不好。
综上,一共有三种:
1、Shur补一般系统(常见,已可);
2、Shur补奇异系统(这一种我不确定是否可行,我认为可行,但是没有见过);
3、投影定理奇异系统(王老师用,有王老师程序)。
王老师最简程序(通过王老师的程序修剪得到的),先放上
clear all; % This The convex optimization algorithm is solved by invoking the solver MOSEK through YALMIP.
yalmip('clear');
[A,B,E,C,D,F,rule,b_min,b_max,v_max]=exp_sys; % system matrices of Type-2 Fuzzy systems
mu_1=[1;1;1;1]; % stablity
[~,n_d]=size(B{1});
[~,n_f]=size(E{1});
n_r=1;
[n_y,n_x]=size(C{1});
H1=[mu_1(1)*eye(n_x);mu_1(2)*eye(n_x);mu_1(3)*eye(n_x);mu_1(4)*eye(n_x)];
P=sdpvar(2*n_x,2*n_x);
G1=sdpvar(n_x,n_x,'full');
for s=1:1:rule
X{s}=sdpvar(4*n_x,n_x,'full');
barAF{s}=sdpvar(n_x,n_x,'full');
barBF{s}=sdpvar(n_x,n_y,'full');
end
for s=1:1:rule
for k=1:1:rule
Xi_1{s}{k}=[zeros(2*n_x,2*n_x) P;P zeros(2*n_x,2*n_x)]...
+[-X{k} -H1*G1 X{k}*A{s}+H1*barBF{k}*C{k} H1*barAF{k}]...
+[-X{k} -H1*G1 X{k}*A{s}+H1*barBF{k}*C{k} H1*barAF{k}]';
end
end
LMI_S= [lmi(P>=0):'P'];
for s=1:1:rule
for k=1:1:rule
LMI_S=LMI_S+[lmi(Xi_1{s}{k}<=0):'LMI_S'];
end
end
options = sdpsettings('solver','mosek','shift','0.00');
solution = optimize(LMI_S, [],options)
check(LMI_S)
这个程序也存在一些问题,主要是性能指标太小,而且求出来的余量是正的(王老师说这样是不对的,但是他自己的求出来也是这样)……应该是对的程序。这是我的目标程序。
Shur补定理的程序(只考虑的输出反馈)
clear all;yalmip('clear');
A=[0.1 0.4;0.8 0.9];B=[1;1];C=[1 0];D1=[1;0];CZ=[1 0];D2=[0];
n_x=2;
n_d=1;
theta=6.0490e-2;
gamma_2=sdpvar(1,1,'full');
P=sdpvar(n_x,n_x);
Y=sdpvar(n_d,n_d);
G=sdpvar(n_d,n_x);
Q=[-P zeros(n_x,n_d) (P*A+B*G)' CZ' ;
zeros(n_d,n_x) -gamma_2*eye(n_d) (P*D1)' D2' ;
(P*A+B*G) (P*D1) -P zeros(n_x,n_d);
CZ D2 zeros(n_d,n_x) -eye(n_d) ];
Theta=[-theta*eye(n_d) (P*B-B*Y)';
(P*B-B*Y) -eye(n_x)];
LMI_S= [lmi(gamma_2>=0):'gamma_2'];
LMI_S= LMI_S+[lmi(P>=0):'P'];
LMI_S= LMI_S+[lmi(Q<=0):'Q'];
LMI_S= LMI_S+[lmi(Theta<=0):'Theta'];
options = sdpsettings('solver','mosek','shift','0.00');
solution = optimize(LMI_S, gamma_2,options)
check(LMI_S)
gamma_2= sqrt(value(gamma_2))
这个求出来一切正常。
我要把这个用投影奇异系统写出来。
投影奇异系统程序
% This The convex optimization algorithm is solved by invoking the solver MOSEK through YALMIP.
clear all;yalmip('clear');
A=[0.1 0.4;-0.8 0.9];B=[1;1];C1=[1 0];D1=[0.1;0];C2=[0.1 0.2];D2=[0];
[~,n_u]=size(B);
[n_y,n_x]=size(C1);
n_d=1;n_z=1;
mu_1=[1;1];
H0=[eye(n_x) zeros(n_x,n_u);zeros(n_u,n_x) zeros(n_u,n_u)];
H1=[zeros(n_x,n_u);mu_1(1)*eye(n_u);zeros(n_d,n_u);zeros(n_x,n_u);mu_1(2)*eye(n_u);zeros(n_d,n_u)];
gamma2=sdpvar(1,1,'full');
P=sdpvar(n_x+n_u,n_x+n_u);
X11=sdpvar(2*(n_x+n_u+n_d),n_x,'full');
G=sdpvar(n_u,n_u,'full');
X2=sdpvar(2*(n_x+n_u+n_d),n_z,'full');
GK=sdpvar(n_u,n_y,'full');
Psi_d=[P zeros(n_x+n_u,n_d);
zeros(n_d,n_x+n_u) eye(n_d,n_d)];
Sigma_d=mdiag(Psi_d,-H0'*P*H0,-gamma2*eye(n_d));
Xi=Sigma_d...
+[-X11 -H1*G -X2 [X11*A+H1*GK*C1+X2*C2 X11*B-H1*G] X11*D1+X2*D2]...
+[-X11 -H1*G -X2 [X11*A+H1*GK*C1+X2*C2 X11*B-H1*G] X11*D1+X2*D2]';
LMI_S= [lmi(gamma2>=0):'gamma_d'];
LMI_S= LMI_S+[lmi(P>=0):'P'];
LMI_S=LMI_S+[lmi(Xi<=0):'LMI_S'];
options = sdpsettings('solver','mosek','shift','0.00');
solution