%分散广义预测控制(C=1)(对象参数已知)
clear all;
clc;
close all;
%---------------参数设置----------------------
num=1;den=[10,1];L=20;
Ts=10;
[A,B,d]=tf2AB(num,den,L,Ts)
[na,nb]=rankn(A,B);
N=5;
Nu=2;
lambda=0.5*eye(Nu); deta=1;
alpha=0.2;
A1=conv(A,[1 -1]);naa=na+1;
[E,F]=diophantine(A,N,d);
G=getGij(B,E);
[Gk,Gpk,Gku]=getG(G,Nu)
%-------------------------------------------
tend=100;
uk=zeros(d+nb+1,1);
duk=zeros(d+nb+1,1);
yk=zeros(naa,1);
w=ones(tend+d+N,1);
for k=1:tend
time(k)=k*Ts;
y(k)=-A1(2:naa+1)*yk+B*duk(d+1:nb+d+1);
Yk=[y(k); yk(1:na)];
dUk=duk(1:d+nb);
%----------参考轨迹-------------
r=filter((1-alpha),[1 -alpha],w);
Yr=zeros(N,1);
Yr=[r(k+d+1:k+d+N)];
%-----------求控制量-----------
dU=inv(Gku'*Gku+lambda)*Gku'*(Yr-Gpk*dUk-F*Yk);
du(k)=dU(1); u(k)=uk(1)+du(k);
%----------更新数据------------
for i=1+d+nb:-1:2
uk(i)=uk(i-1);
duk(i)=duk(i-1);
end
uk(1)=u(k);
duk(1)=du(k);
for i=naa:-1:2
yk(i)=yk(i-1);
end
yk(1)=y(k);
end
%-------------绘图--------------------
subplot(2,1,1);
plot(time(1:tend),w(1:tend),'r:',time(1:tend),y(1:tend));
grid on;
xlabel('time(s)'); ylabel('w,y');
axis([0,tend*Ts,0,1.2]);
legend('w','y');
title('generalized predictive control');
subplot(2,1,2);
plot(time,u);
grid on;
xlabel('time(s)'); ylabel('u');
axis([0,tend*Ts,-0.1,1.5]);
legend('u');
title('Control action');
- 1
- 2
- 3
- 4
- 5
- 6
前往页