%--------------------------------------------------------------------------
%实验三:设计最小方差自校正调节器
%初始化
clear all;
close all;
%--------------------------------------------------------------------------
%产生白噪声
s=randn(1,200);
d=std(s);
m=mean(s);
s=(s-m)/d;
a=0;
b=sqrt(1);
s=a+b*s;
%--------------------------------------------------------------------------
%设置u为一个200行的列向量,且为伪随机信号
u = idinput(200,'prbs');
y(1)=0;
y(2)=0;
for k=3:15
y(k)=0.9*y(k-1)+u(k-2)+s(k)-0.7*s(k-1);
end
%--------------------------------------------------------------------------
%递推最小二乘算法
%遗忘因子λ的设置
lambda =0.999;
%给定参数的初值θ
theta0=[0.01 0.01 0.01 0.01]';
%为了递推计算给出的P(k)初值P(0)
p0=10^6*eye(4,4);
%开辟内存空间
theta=[theta0,zeros(4,14)];
e=zeros(4,15);
for k=3:15
x=[-y(k-1),u(k-2),s(k),s(k-1)]';
k1=p0*x*inv(x'*p0*x+lambda);
theta1=theta0+k1*(y(k)-x'*theta0);
e1=theta1-theta0;
e2=e1/theta0;
theta0=theta1;
theta(:,k)=theta1;
p1=(p0-k1*k1'*(x'*p0*x+lambda))/lambda;
p0=p1;
%判断是否收敛
if e2<=0.000000005
break;
end
end
theta,e;
alpha1=theta(1,:);
alpha2=theta(2,:);
beta1=theta(3,:);
beta2=theta(4,:);
q=zeros(1,4);
for j=1:4
for i=2:15
if abs(theta(j,i))>0
q(1,j)=theta(j,i)
end
end
end
%--------------------------------------------------------------------------
%将辨识出的参数代替调节器参数
u_1=0.0;
u_2=0.0;
u_3=0.0;
y_1=0.0;
y_2=0.0;
y_3=0.0;
e_1=0.0;
e_2=0.0;
for k=2:1:200
time(k)=k;
rin(k)=0;
yout(k)=-q(1,1)*y_1+q(1,2)*u_2+q(1,3)*s(k)+q(1,4)*s(k-1);
u(k)=-(q(1,1)+q(1,4))*q(1,1)*yout(k)+(q(1,1)+q(1,4))*u_1;
u_3=u_2;u_2=u_1;u_1=u(k);
y_3=y_2;y_2=y_1;y_1=yout(k);
end
plot(alpha1,'r')
hold on
plot(alpha2,'g')
hold on
plot(beta1,'b')
hold on
plot(beta2,'y')
hold on
legend('α1','α2','β1','β2',-1)
grid
title('参数变化曲线','fontName','楷体_GB2312',...
'fontsize',20)
xlabel('样本数量');
ylabel('参数变化');
axis([0 10 -1.5 1.5])
figure(2)
plot(time,rin,'b',time,yout,'r');
axis([0 200 -20 20])
grid
title('y(k)变化曲线','fontName','楷体_GB2312',...
'fontsize',20)
xlabel('时间轴 t(s)');
ylabel('y(k)');
- 1
- 2
- 3
- 4
- 5
前往页