📄 gpc.m
字号:
clear;close all;
%----------------设定计算步数和精度----------------%
step=1000; %步数
err=0.00001; %精度
eps1=0.001;
%----------------数据生成----------------%
k0=0:step+1;
%u=sin(2*pi.*k0/step*10);
u=rand(1,step+2)*2-1;
y=zeros(1,step+2);
y(1)=0;
y(2)=0;
for t=1:step
y(t+2)=y(t+1)*y(t)*(y(t+1)-2.5)/(1+y(t+1)*y(t+1)+y(t)*y(t))+u(t+1);
end
%----------------绘制输入及输出信号波形----------------%
figure(1);
plot(y(3:step+2),'r');
hold;
plot(u(2:step+1),'g');%pause
legend('输出y','输入u');
%----------------初始化隶属函数----------------%
c=[-4,-3,-2,-1,0,1];
U=zeros(6,step+2);
for t=1:step+2
if(y(t)<=c(1))
U(1,t)=1;
elseif(y(t)<=c(2))
U(1,t)=(c(2)-y(t))/(c(2)-c(1));U(2,t)=(y(t)-c(1))/(c(2)-c(1));
elseif(y(t)<=c(3))
U(2,t)=(c(3)-y(t))/(c(3)-c(2));U(3,t)=(y(t)-c(2))/(c(3)-c(2));
elseif(y(t)<=c(4))
U(3,t)=(c(4)-y(t))/(c(4)-c(3));U(4,t)=(y(t)-c(3))/(c(4)-c(3));
elseif(y(t)<=c(5))
U(4,t)=(c(5)-y(t))/(c(5)-c(4));U(5,t)=(y(t)-c(4))/(c(5)-c(4));
elseif(y(t)<=c(6))
U(5,t)=(c(6)-y(t))/(c(6)-c(5));U(6,t)=(y(t)-c(5))/(c(6)-c(5));
else
U(6,t)=1;
end
end
%----------------模糊聚类----------------%
U1=U.';
U=zeros(step+2,6);
while(norm(U1-U)>err)
U=U1;
c=y*U./sum(U);
d=abs(y.'*ones(1,6)-ones(step+2,1)*c);
zflag=0;
for t=1:step+2
num=find(d(t,:)<=eps1*2);
len=length(num);
if(len~=0)
zflag=1;
U1(t,:)=0;
for m=1:len
U1(t,num(m))=1/len;
end
end
end
if (zflag==0)
U1=(ones(6,1)*(1./(sum(1./d.')))).'./d;
end
end
U=U1;
%----------------用同样方法对输入信号u进行聚类----------------%
% Uu=zeros(6,step+2);
% for t=1:step+2
% if(u(t)<=-0.75)
% Uu(1,t)=1;
% elseif(u(t)<=-0.45)
% Uu(1,t)=-u(t)+0.25;Uu(2,t)=u(t)+1.45;
% elseif(u(t)<=-0.15)
% Uu(2,t)=-u(t)+0.55;Uu(3,t)=u(t)+1.15;
% elseif(u(t)<=0.15)
% Uu(3,t)=-u(t)+0.85;Uu(4,t)=u(t)+0.85;
% elseif(u(t)<=0.45)
% Uu(4,t)=-u(t)+1.15;Uu(5,t)=u(t)+0.55;
% elseif(u(t)<=0.75)
% Uu(5,t)=-u(t)+1.45;Uu(6,t)=u(t)+0.25;
% else
% Uu(6,t)=1;
% end
% end
%
% Uu1=Uu.';
% Uu=zeros(step+2,6);
% while(norm(Uu1-Uu)>err)
% Uu=Uu1;
% cu=u*Uu./sum(Uu);
% d=abs(u.'*ones(1,6)-ones(step+2,1)*cu);
% zflag=0;
% for t=1:step+2
% num=find(d(t,:)<=eps1*5);
% len=length(num);
% if(len~=0)
% zflag=1;
% Uu1(t,:)=0;
% for m=1:len
% Uu1(t,num(m))=1/len;
% end
% end
% end
% if (zflag==0)
% Uu1=(ones(6,1)*(1./(sum(1./d.')))).'./d;
% end
% end
% Uu=Uu1;
%----------------用最小二乘法辨识参数θ----------------%
for t=1:step
temp=U(t,:).';%*U(t+1,:);
%temp1=Uu(t+1,:).'*temp(:).';
beta(t,:)=temp(:);
end
beta1=beta.';
beta2=beta1*diag(1./sum(beta1));
beta3=beta2.';
fy=[beta3,diag(y(2:step+1))*beta3,diag(y(1:step))*beta3,diag(u(2:step+1))*beta3];
th=inv(fy.'*fy)*fy.'*y(3:step+2).';
%----------------测试模型的拟合能力----------------%
U=zeros(6,step);
yt(1)=0;
yt(2)=0;
for t=1:step
if(yt(t)<=c(1))
U(1,t)=1;
elseif(yt(t)<=c(2))
U(1,t)=(c(2)-yt(t))/(c(2)-c(1));U(2,t)=(yt(t)-c(1))/(c(2)-c(1));
elseif(yt(t)<=c(3))
U(2,t)=(c(3)-yt(t))/(c(3)-c(2));U(3,t)=(yt(t)-c(2))/(c(3)-c(2));
elseif(yt(t)<=c(4))
U(3,t)=(c(4)-yt(t))/(c(4)-c(3));U(4,t)=(yt(t)-c(3))/(c(4)-c(3));
elseif(yt(t)<=c(5))
U(4,t)=(c(5)-yt(t))/(c(5)-c(4));U(5,t)=(yt(t)-c(4))/(c(5)-c(4));
elseif(yt(t)<=c(6))
U(5,t)=(c(6)-yt(t))/(c(6)-c(5));U(6,t)=(yt(t)-c(5))/(c(6)-c(5));
else
U(6,t)=1;
end
yt(t+2)=th.'*[U(:,t);yt(t+1)*U(:,t);yt(t)*U(:,t);u(t+1)*U(:,t)];
end
figure(2);
plot(y(3:end),'r');
hold on;
plot(yt(3:end),'y');
legend('原模型输出y','T-S模型输出yt');
%----------------基于该模型的预测控制设计----------------%
steps = 500;
Y=zeros(1,steps+2).';%系统输出量y记录值
dUr=zeros(1,steps+1).';%△u记录值
Ur=zeros(1, steps+1).';%控制量u的记录值
p=4;%预测步长
L=1;%控制步长
Q=eye(p);%关于输出偏差的权值矩阵
R=10*eye(L);%关于△u的权值矩阵
a=0.3;%柔化因子
%s=-2*ones(1,steps);
s=sin(2*pi/steps*(1:steps)*2)+1.2;%要实现的标准输出
Y(1:2)=[0 0]';%初始化系统输出量
Ur(1)=0;%初始化系统u的值
Uy=zeros(6,steps);
for t=1:steps
if(Y(t)<=c(1))
Uy(1,t)=1;
elseif(Y(t)<=c(2))
Uy(1,t)=(c(2)-Y(t))/(c(2)-c(1));Uy(2,t)=(Y(t)-c(1))/(c(2)-c(1));
elseif(Y(t)<=c(3))
Uy(2,t)=(c(3)-Y(t))/(c(3)-c(2));Uy(3,t)=(Y(t)-c(2))/(c(3)-c(2));
elseif(Y(t)<=c(4))
Uy(3,t)=(c(4)-Y(t))/(c(4)-c(3));Uy(4,t)=(Y(t)-c(3))/(c(4)-c(3));
elseif(Y(t)<=c(5))
Uy(4,t)=(c(5)-Y(t))/(c(5)-c(4));Uy(5,t)=(Y(t)-c(4))/(c(5)-c(4));
elseif(Y(t)<=c(6))
Uy(5,t)=(c(6)-Y(t))/(c(6)-c(5));Uy(6,t)=(Y(t)-c(5))/(c(6)-c(5));
else
Uy(6,t)=1;
end
%----------------计算A(z),B(z)----------------%
C = Uy(:,t).'*th(1:6);
A(1)=1;
A(2)=-Uy(:,t).'*th(7:12);
A(3)=-Uy(:,t).'*th(13:18);
B=Uy(:,t).'*th(19:24);
%----------------解丢番图方程----------------%
e=zeros(1,p);
f=zeros(3,p);
g=zeros(1,p);
h=zeros(L,p);
e(1)=1;
e(2)=-(A(2)-A(1))/A(1)*e(1);
e(3)=-((A(2)-A(1))*e(2)+(A(3)-A(2))*e(1))/A(1);
for j=4:p
e(j)=(-(A(2)-A(1))*e(j-1)-(A(3)-A(2))*e(j-2)+A(3)*e(j-3))/A(1);
%e(j)=-((A(2)-A(1))*e(j-1)+(A(3)-A(2))*e(j-2))/A(1);
end
for j=1:p
f(1,j)=-(A(2)-A(1))*e(j);
f(2,j)=-(A(3)-A(2))*e(j);
f(3,j)=A(3)*e(j);
end
for j=1:p
g(j)=e(j)*B;
end
for m=1:L
for j=1:p-m
h(m,j)=-g(m+j);
end
end
G=zeros(p,L);
for j=1:p
for m=1:min(j,L)
G(j,m)=g(j-m+1);
end
end
D=inv(G.'*Q*G+R)*G.'*Q;
%----------------计算柔化后的预测步长内系统的期望输出,并将其保存在Yd中----------------%
Yk=Y(t+1)*Y(t)*(Y(t+1)-2.5)/(1+Y(t+1)^2+Y(t)^2)+Ur(t);
Yd=zeros(p, 1);
Yd(1)=Yk;
for j=1:p-1
Yd(j+1)=a*Yd(j)+(1-a)*s(t);
end
%----------------求出在给定权值下的系统最小偏差所对应的△u----------------%
Y0=f.'*[Yk,Y(t+1),Y(t)].'+h.'*dUr(t);
dU=D*[Yd-Y0];
%----------------依次记录本次运行的△u,u和y值----------------%
dUr(t+1)=dU(1);
Ur(t+1)=dUr(t+1)+Ur(t);
Y(t+2)=Yk;
end
%----------------绘制信号波形----------------%
figure(3);
plot(s);
hold on;
plot(Y(3:end),'r');
plot(Ur(2:end),'g');
legend('设定输出s','实际输出Y','实际输入Ur');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -