In this experiment, the specific model is
Where, the truth value of each parameter is:
a1=-1.8;a2=0.9; b1=1.3;b2=0.7;c1=1.3;c2=0.8;d1=1.1;d2=0.3。
In the experiment, the parameters are updated once to verify the stability and reliability of the model,after update(when time >=update_time, and we can set update_time):
a1=-0.9;a2=0.6; b1=1.6;b2=0.3;c1=1.7;c2=1.0;d1=1.5;d2=0.5。
Recursive generalized extended least squares algorithm,the derivation is as follows:
%广义最小二乘的递推算法
%z(k)-1.8*z(k-1)+0.9*z(k-2)=1.3*M(k-1)+0.7*M(k-2)+w(k)
%w(k)+1.3*w(k-1)+0.8*w(k-2)=v(k)+1.1*v(k-1)+0.3*v(k-2)
%参数更新后:
%z(k)-0.9*z(k-1)+0.6*z(k-2)=1.6*M(k-1)+0.3*M(k-2)+w(k)
%w(k)+1.7*w(k-1)+1.0*w(k-2)=v(k)+1.5*v(k-1)+0.5*v(k-2)
%========================================
clear all
close all
clc
%===========系统参数真值==============
a=[-1.8 0.9]';
b=[1.3 0.7]';
c=[1.3 0.8]';
d=[1.1 0.3]';
na=length(a);nb=length(b);nc=length(c);nd=length(d); %%na,nb,nc,nd 为输出输入系数矩阵 A,B,C,D 的阶数
a1=[-0.9 0.6]'; %系统参数更新后的真值
b1=[1.6 0.3]';
c1=[1.7 1.0]';
d1=[1.5 0.5]';
%========================================
time=1200; %仿真总时间长度
update_time=500;%更新参数的时间节点
uk=zeros(nb,1);yk=zeros(na,1); %输入输出初始化
u=randn(time,1); %输入信号,采用方差为1的白噪声序列
xi=sqrt(0.1)*randn(time,1); %干扰信号,采用方差为0.1的白噪声序列
vk=sqrt(0.1)*randn(nd,1);wk=zeros(nc,1); %w输入输出初始化
vk_estimate=zeros(nd,1);wk_estimate=zeros(nc,1); %w输入输出估计初始化
%========================================
thetae_1=zeros(na+nb+nc+nd,1); %参数初值
P=10^6*eye(na+nb+nc+nd); %修正系数初值
lambda=1; %遗忘因子范围[0.9 1],遗忘因子=1时,即为标准递推最小二乘
for k=1:time
if k>=update_time %更新参数
theta_1(:,k)=[a1;b1]; %系统参数真值
theta_2(:,k)=[c1;d1]; %系统参数真值
else
theta_1(:,k)=[a;b]; %系统参数真值
theta_2(:,k)=[c;d]; %系统参数真值
end
phi=[-yk;uk(1:nb)]; %输出输入矩阵
phi_w=[-wk;vk(1:nd)]; %w输出输入矩阵
phi_w_estimate=[-wk_estimate;vk_estimate(1:nd)];
phiall=[phi;phi_w]
y(k)=phiall'*[theta_1(:,k);theta_2(:,k)]+xi(k); %系统实际输出
phiall_estimate=[phi;phi_w_estimate]
%递推公式
L=P*phiall_estimate/(lambda+phiall_estimate'*P*phiall_estimate);
thetae(:,k)=thetae_1+L*(y(k)-phiall_estimate'*thetae_1);
P=(eye(na+nb+nc+nd)-L*phiall_estimate')*P/lambda;
%更新数据
thetae_1=thetae(:,k);
for i=nb:-1:2
uk(i)=uk(i-1);
end
uk(1)=u(k);
for j=nc:-1:2
wk_estimate(j)=wk_estimate(j-1);
end
wk_estimate(1)=y(k)-phi'*thetae_1(1:na+nb);
for s=nd:-1:2
vk_estimate(j)=vk_estimate(j-1);
end
vk_estimate(1)=y(k)-phiall_estimate'*thetae_1(:);
for j=nc:-1:2
wk(j)=wk(j-1);
end
wk(1)=phi_w'*theta_2(:,k)+xi(k);%w系统实际输出
for s=nd:-1:2
vk(j)=vk(j-1);
end
vk(1)=sqrt(0.1)*randn(1);
for i=na:-1:2
yk(i)=yk(i-1);
end
yk(1)=y(k);
end
%=====================输出结果及作图=========================
disp('参数 a1 a2 b1 b2 的估计结果(更新参数前):')
ab=thetae(1:na+nb,update_time-1)
disp('噪声传递系数 c1 c2 d1 d2 的估计结果(更新参数前):')
cd=thetae(na+nb+1:na+nb+nc+nd,update_time-1)
disp('参数 a1 a2 b1 b2 的估计结果(更新参数后):')
ab_updata=thetae(1:na+nb,time)
disp('噪声传递系数 c1 c2 d1 d2 的估计结果(更新参数后):')
cd_updata=thetae(na+nb+1:na+nb+nc+nd,time)
disp('参数估计的平方误差总和:')
abcd=[a;b;c;d;a1;b1;c1;d1]-[ab;cd;ab_updata;cd_updata];
erro=abcd'*abcd
i=1:time;
figure('name','参数a,b')
plot(i,thetae(1,:),i,thetae(2,:),i,thetae(3,:),i,thetae(4,:));hold on;plot(i,theta_1(:,:),'k:');
xlabel('k');ylabel(' 参数估计a1 a2 b1 b2 ');
legend('a1','a2','b1','b2');
title(' 参数a1 a2 b1 b2的估计过程 ');
figure('name',' 参数c,d ')
plot(i,thetae(5,:),i,thetae(6,:),i,thetae(7,:),i,thetae(8,:));hold on;hold on;plot(i,theta_2(:,:),'k:');
xlabel('k');ylabel('参数估计c1 c2 d1 d2 ');
legend('c1','c2','d1','d2');
title('噪声传递系数c1 c2 d1 d2的估计过程');
As can be seen from the comparison in the table,the experimental results are close to the real value.Compare the experimental results produced by different forgetting factor,when we take the forgetting factor=0.996,sum of squared errors is minimum,about 1.4298,that means parameter estimation works best.