利用最小二乘类算法辨识系统的参数
首先设计一个可以利用递推最小二乘方法辨识参数的例子,并且编程将其参
数辨识出来。
设计系统如下:
(
Z k
2) 1.8 (
z k
1) 0.9 ( ) 0.75 (
u k
z k
1) 0.5 ( )
u k
( )
v k
其中 ( )
v k 为白噪声,此时系统满足极点位于单位圆内,系统稳定。
程序如下:
%利用最小二乘递推算法进行参数辨识
%Z(k+2)=1.8*Z(k+1)-0.9*Z(k)+0.75*u(k+1)+0.5*u(k)+v(k)
%==========产生500点的M序列作为输入==============
x=[0 1 0 1 1 0 1 1 1];
n=503;
N=500;
for i=1:n
%寄存器初值
%脉冲数目
temp=xor(x(4),x(9));
M(i)=x(9);
for j=9:-1:2
%M序列
x(j)=x(j-1);
end
x(1)=temp;
end
%===========产生方差为1 的白噪声========
v=randn(1,N);
%==============生成观测数列=================
z=zeros(N+2,1);
z(1)=-1;
z(2)=0;
for i=3:N+2
z(i)=1.8*z(i-1)-0.9*z(i-2)+0.75*M(i-1)+0.5*M(i-2)+v(i-2);
%估计方差
end
%==============递推求解=================
P=100*eye(4);
Pstore=zeros(4,N+1);
Pstore(:,1)=[P(1,1),P(2,2),P(3,3),P(4,4)];
Theta=zeros(4,N+1);
%参数估计值
%参数估计初值
Theta(:,1)=[1;1;1;1];
K=[1;1;1;1];
%增益矩阵初值
for i=3:N+2
h=[-z(i-1);-z(i-2);M(i-1);M(i-2)];
K=P*h*inv(h'*P*h+1);
Theta(:,i-1)=Theta(:,i-2)+K*(z(i)-h'*Theta(:,i-2));
P=(eye(4)-K*h')*P;
Pstore(:,i-1)=[P(1,1),P(2,2),P(3,3),P(4,4)];
End
%==============作图=================
i=1:N+1;
figure(1)
plot(i,Theta(1,:),i,Theta(2,:),i,Theta(3,:),i,Theta(4,:),i,-1.8,i,0.9,i,0.75,i,0.5)
grid on;
title('参数估计过程');
辨识结果如下图所示:
由图可知,利用最小二乘递推算法可以辨识系统的参数,但是辨识结果会与
其精确值始终着偏差。
然后在将程序改为渐消记忆最小二乘算法,进行仿真计算,得到如下结果:
修改语句K=P*h*inv(h'*P*h+1)和P=(eye(4)-K*h')*P分别为K=P*h*inv(h'*P*h+0.998)
和P=(eye(4)-K*h')*P/0.998,得到了较为准确的结果。