系统辨识,即在已知系统阶次的情况下辨识出系统的参数或辨识系统阶次,一般用到的方法有最小二乘法、辅助变量法等,对于离线与在线辨识,只是加入一个递推的问题。下面本文给出系统辨识方法的实现代码。
首先是处理数据:
U1=importdata('uy1.txt');
W1=U1.data;%第一列u,第二列y
s=length(W1(:,1));n=2;N=s-n;
A1=zeros(N,1);B1=zeros(N,4);
for i=1:N
A1(i)=W1(i+2,2);%y3,y4,y5,....
B1(i,:)=[-W1(i+1,2),-W1(i,2),W1(i+1,1),W1(i,1)];%[-y2,-y1,u2,u1]...
end
%解析法
for i=1:N
X1(:,i)=A1(i)*pinv(B1(i,:));
end
a1=sum(X1(1,:));a2=sum(X1(2,:));
b1=sum(X1(3,:));b2=sum(X1(4,:));
X=[a1/N,a2/N,b1/N,b2/N]';
%最小二乘法
% fi=B;y=A;
Xls=inv((B1'*B1))*B1'*A1;
%递推最小二乘法
c=100;
Xdls=[0;0;0;0];P=c^2*eye(4);
for i=1:N
ps=B1(i,:)';
K=P*ps*1/(1+ps'*P*ps);
P=P-P*ps*1/(1+ps'*P*ps)*ps'*P;
Xdls=Xdls+K*(A1(i)-ps'*Xdls);
end
%辅助变量法
Xiv=Xls;
u1=W1(:,1);
Z1=B1;
for j=1:1000
y1=Z1*Xiv;
y1=cat(1,W1(1:2,2),y1);
for i=1:N
Z1(i,:)=[-y1(i+1),-y1(i),u1(i+1),u1(i)];
end
Xiv0=Xiv;
Xiv=inv((Z1'*B1))*Z1'*A1;
if sum(abs(Xiv0-Xiv))<0.1%收敛
break
end
end
%递推辅助变量法
c=100;
Xdiv=Xls;P=c^2*eye(4);
u1=W1(:,1);
Z1=B1;
for i=1:N
ps=B1(i,:)';
y1=Z1*Xdiv;
y1=cat(1,W1(1:2,2),y1);
Z1(i,:)=[-y1(i+1),-y1(i),u1(i+1),u1(i)];
K=P*Z1(i,:)'*1/(1+ps'*P*Z1(i,:)');
P=P-K*ps'*P;
Xdiv=Xdiv+K*(A1(i)-ps'*Xdiv);
end
%广义最小二乘法
m=2;
Xols=Xls;
e1(1)=0;e1(2)=0;
for p=1:100
for k=n+1:n+N
e1(k)=A1(k-2)-B1(k-2,:)*Xols;
end
for i=1:N
for j=1:m
O1(i,j)=-e1(n+i-j);
end
end
f1=inv((O1'*O1))*O1'*e1(n+1:n+N)';
for k=n+1:n+N
y1(k)=W1(k,2)+f1(1)*W1(k-1,2)+f1(2)*W1(k-2,2);
u1(k)=W1(k,1)+f1(1)*W1(k-1,1)+f1(2)*W1(k-2,1);
end
y1(1)=W1(1,2);y1(2)=W1(2,2);
for i=1:N
fi(i,:)=[-y1(i+1),-y1(i),u1(i+1),u1(i)];
end
Xols0=Xols;
Xols=inv((fi'*fi))*fi'*y1(n+1:n+N)';
if sum(abs(Xols-Xols0))<0.1
break
end
end
%递推广义最小二乘法
c=100;m=2;
Xdols=Xls;
P1=c^2*eye(4);
f=[0;0];
y1(1)=W1(1,2);y1(2)=W1(2,2);
e1(1)=0;e1(2)=0;
for k=n+1:n+N
y1(k)=W1(k,2)+f1(1)*W1(k-1,2)+f1(2)*W1(k-2,2);
u1(k)=W1(k,1)+f1(1)*W1(k-1,1)+f1(2)*W1(k-2,1);
ps=[-y1(k-1),-y1(k-2),u1(k-1),u1(k-2)]';
e1(k)=A1(k-2)-B1(k-2,:)*Xdols;
w=[-e1(k-1),-e1(k-2)]';
for i=1:k-n
for j=1:m
O(i,j)=-e1(n+i-j);
end
end
for i=1:k-n
fi(i,:)=[-y1(i+1),-y1(i),u1(i+1),u1(i)];
end
P1=inv((fi'*fi));
K1=P1*ps*1/(1+ps'*P1*ps);
P1=P1-K1*ps'*P1;
Xdols=Xdols+K1*(y1(k)-ps'*Xdols);
if det(O'*O)~=0
P2=inv((O'*O));
K2=P2*w*1/(1+w'*P2*w);
P2=P2-K2*w'*P2;
f=f+K2*(e1(k)-w'*f);
end
end
%夏氏偏差修正法
Xls=inv((B1'*B1))*B1'*A1;
L=inv((B1'*B1))*B1';
M=eye(N)-B1*inv((B1'*B1))*B1';
Xx=Xls;Xb=0;
for p=1:1000
e=A1-B1*Xx;
for i=1:N-2
for j=1:2
O(i,j)=-e(n+i-j);
end
end
D=O'*M*O;
f=inv(D)*O'*M*A1;
Xb0=Xb;
Xb=L*O*f;
Xx=Xx-Xb;
if abs(sum(Xb-Xb0))<0.1
break
end
end
%夏氏改良法
L=inv((B1'*B1))*B1';
Xxg=Xls;Xb=0;
for p=1:1000
e=A1-B1*Xxg;
for i=1:N-2
for j=1:2
O(i,j)=-e(n+i-j);
end
end
f=inv((O'*O))*O'*e;
Xx0=Xxg;
Xxg=Xxg-L*O*f;
if abs(sum(Xxg-Xx0))<0.1
break
end
end
%递推的夏氏法
e(1)=0;e(2)=0;
P=eye(6);beta=zeros(6,1);
for k=1:N
ps=[-W1(k+1,2),-W1(k,2),W1(k+1,1),W1(k,1),-e(k+1),-e(k)]';
e(k+2)=A1(k)-ps'*beta;
r=P*ps*1/(1+ps'*P*ps);
P=P-r*ps'*P;
beta=beta+r*(W1(k+2,2)-ps'*beta);
end
Xdx=beta;
%增广矩阵法
Xm=[0;0;0;0;0;0];
P=eye(6);
for k=1:N
ps=[-W1(k+1,2),-W1(k,2),W1(k+1,1),W1(k,1),-e(k+1),-e(k)]';
e(k+2)=A1(k)-ps'*Xm;
K=P*ps*1/(1+ps'*P*ps);
P=P-K*ps'*P;
Xm=Xm+K*(W1(k+2,2)-ps'*Xm);
End
%残差序列相关的极大似然法
A2=A3;B2=B3;W2=W3;
Xls2=inv((B2'*B2))*B2'*A2;
c1=0.2;c2=0.1;
Xml=[Xls2;c1;c2];
sgm=0;
e(1)=0.1;e(2)=0.1;
de_a1=zeros(N+n,1);de_a2=zeros(N+n,1);
de_b1=zeros(N+n,1);de_b2=zeros(N+n,1);
de_c1=zeros(N+n,1);de_c2=zeros(N+n,1);
dJ_X=zeros(6,1);dJ_X2=zeros(6,6);
for p=1:1000
for k=n+1:n+N
ps=[-W2(k-1,2),-W2(k-2,2),W2(k-1,1),W2(k-2,1),-e(k-1),-e(k-2)]';
e(k)=A2(k-2)-ps'*Xml;
de_a1(k)=W2(k-1,2)-c1*de_a1(k-1)-c2*de_a1(k-2);
de_a2(k)=W2(k-2,2)-c1*de_a2(k-1)-c2*de_a2(k-2);
de_b1(k)=-W2(k-1,1)-c1*de_b1(k-1)-c2*de_b2(k-2);
de_b2(k)=-W2(k-2,1)-c1*de_b2(k-1)-c2*de_b2(k-2);
de_c1(k)=-e(k-1)-c1*de_c1(k-1)-c2*de_c2(k-2);
de_c2(k)=-e(k-2)-c1*de_c1(k-1)-c2*de_c2(k-2);
de_X=[de_a1(k),de_a2(k),de_b1(k),de_b2(k),de_c1(k),de_c2(k)]';
dJ_X=dJ_X+e(k)*de_X;
dJ_X2=dJ_X2+de_X*(de_X)';
end
sgm0=sgm;
sgm=S/N;
Xml0=Xml;
Xml=Xml-inv(dJ_X2)*dJ_X;
if (sgm-sgm0)/sgm0<1e-3
break
end
end
下面我们进行系统阶数的确定
%按残差方差定阶
clear;
U1=importdata('uy1.txt');
W1=U1.data;%第一列u,第二列y
U2=importdata('uy2.txt');
W2=U2.data;%第一列u,第二列y
U3=importdata('uy3.txt');
W3=U3.data;%第一列u,第二列y
V=U1.textdata;
%n=1;
n1=1;N=length(W1)-n1;
A1=zeros(N,1);B1=zeros(N,3);
A2=zeros(N,1);B2=zeros(N,3);
A3=zeros(N,1);B3=zeros(N,3);e=zeros(500,1);
J1=0;
A1=A2;B1=B2;W1=W2;
% A1=A3;B1=B3;W1=W3;
for i=1:N
A1(i)=W1(i+1,2);%y3,y4,y5,....
B1(i,:)=[-W1(i,2),W1(i+1,1),W1(i,1)];%[-y2,-y1,u2,u1]...
A2(i)=W2(i+1,2);
B2(i,:)=[-W2(i,2),W2(i+1,1),W2(i,1)];
A3(i)=W3(i+1,2);
B3(i,:)=[-W3(i,2),W3(i+1,1),W3(i,1)];
end
Xls1=inv((B1'*B1))*B1'*A1;
for k=2:N+1
e(k)=A1(k-1)-B1(k-1,:)*Xls1;
J1=J1+e(k)^2;
end
sgm1=e'*e/500
%n=2
n2=2;N=length(W1)-n2;
A1=zeros(N,1);B1=zeros(N,5);
A2=zeros(N,1);B2=zeros(N,5);
A3=zeros(N,1);B3=zeros(N,5);e(1)=0;e=zeros(500,1);
J2=0;
A1=A2;B1=B2;W1=W2;
% A1=A3;B1=B3;W1=W3;
for i=1:N
A1(i)=W1(i+2,2);%y3,y4,y5,....
B1(i,:)=[-W1(i+1,2),-W1(i,2),W1(i+2,1),W1(i+1,1),W1(i,1)];%[-y2,-y1,u2,u1]...
A2(i)=W2(i+2,2);
B2(i,:)=[-W2(i+1,2),-W2(i,2),W2(i+2,1),W2(i+1,1),W2(i,1)];
A3(i)=W3(i+2,2);
B3(i,:)=[-W3(i+1,2),-W3(i,2),W3(i+2,1),W3(i+1,1),W3(i,1)];
end
Xls2=inv((B1'*B1))*B1'*A1;
for k=3:N+2
e(k)=A1(k-2)-B1(k-2,:)*Xls2;
J2=J2+e(k)^2;
end
sgm2=e'*e/500
%n=3
n3=3;N=length(W1)-n3;
A1=zeros(N,1);B1=zeros(N,7);
A2=zeros(N,1);B2=zeros(N,7);
A3=zeros(N,1);B3=zeros(N,7);e=zeros(N+n3,1);
J3=0;
A1=A2;B1=B2;W1=W2;
% A1=A3;B1=B3;W1=W3;
for i=1:N
A1(i)=W1(i+3,2);%y3,y4,y5,....
B1(i,:)=[-W1(i+2,2),-W1(i+1,2),-W1(i,2),W1(i+3,1),W1(i+2,1),W1(i+1,1),W1(i,1)];%[-y2,-y1,u2,u1]...
A2(i)=W2(i+3,2);
B2(i,:)=[-W2(i+2,2),-W2(i+1,2),-W2(i,2),W2(i+3,1),W2(i+2,1),W2(i+1,1),W2(i,1)];
A3(i)=W3(i+3,2);
B3(i,:)=[-W3(i+2,2),-W3(i+1,2),-W3(i,2),W3(i+3,1),W3(i+2,1),W3(i+1,1),W3(i,1)];
end
Xls3=inv((B1'*B1))*B1'*A1;
for k=4:N+3
e(k)=A1(k-3)-B1(k-3,:)*Xls3;
J3=J3+e(k)^2;
end
sgm3=e'*e/500
%n=3
n4=4;N=length(W1)-n4;
A1=zeros(N,1);B1=zeros(N,9);
A2=zeros(N,1);B2=zeros(N,9);
A3=zeros(N,1);B3=zeros(N,9);e=zeros(N+n4,1);
J4=0;
A1=A2;B1=B2;W1=W2;
% A1=A3;B1=B3;W1=W3;
for i=1:N
A1(i)=W1(i+4,2);%y3,y4,y5,....
B1(i,:)=[-W1(i+3,2),-W1(i+2,2),-W1(i+1,2),-W1(i,2),W1(i+4,1),W1(i+3,1),W1(i+2,1),W1(i+1,1),W1(i,1)];%[-y2,-y1,u2,u1]...
A2(i)=W2(i+4,2);
B2(i,:)=[-W2(i+3,2),-W2(i+2,2),-W2(i+1,2),-W2(i,2),W2(i+4,1),W2(i+3,1),W2(i+2,1),W2(i+1,1),W2(i,1)];
A3(i)=W3(i+4,2);
B3(i,:)=[-W3(i+3,2),-W3(i+2,2),-W3(i+1,2),-W3(i,2),W3(i+4,1),W3(i+3,1),W3(i+2,1),W3(i+1,1),W3(i,1)];
end
Xls4=inv((B1'*B1))*B1'*A1;
for k=5:N+4
e(k)=A1(k-4)-B1(k-4,:)*Xls4;
J4=J4+e(k)^2;
end
sgm4=e'*e/500
plot([n1,n2,n3,n4],[J1,J2,J3,J4])
hold on
plot(n1,J1,'*',n2,J2,'*',n3,J3,'*',n4,J4,'*')
xlabel('n')
ylabel('J')
title('按估计误差方差最小法')
%F检验法
t2=(J1-J2)/J2*(500-2*2)/2*(2-1);
t3=(J2-J3)/J3*(500-2*3)/2*(3-2);
t4=(J3-J4)/J4*(500-2*4)/2*(4-3)
%白噪声的AIC法
%na=1,nb=2;
n1=1;N=length(W1)-n1;
A1=zeros(N,1);B1=zeros(N,4);
e=zeros(500,1);
for i=1:N-1
A1(i)=W1(i+1,2);
B1(i,:)=[-W1(i,2),W1(i+2,1),W1(i+1,1),W1(i,1)];
end
Xls1=inv((B1'*B1))*B1'*A1;
for k=2:N+1
e(k)=A1(k-1)-B1(k-1,:)*Xls1;
end
sgm12=e'*e/N
%na=1;nb=3;
A1=zeros(N,1);B1=zeros(N,5);
e=zeros(500,1);
for i=1:N-2
A1(i)=W1(i+1,2);
B1(i,:)=[-W1(i,2),W1(i+3,1),W1(i+2,1),W1(i+1,1),W1(i,1)];
end
Xls1=inv((B1'*B1))*B1'*A1;
for k=2:N+1
e(k)=A1(k-1)-B1(k-1,:)*Xls1;
end
sgm13=e'*e/N
%na=1;nb=4;
A1=zeros(N,1);B1=zeros(N,6);
e=zeros(500,1);
for i=1:N-3
A1(i)=W1(i+1,2);
B1(i,:)=[-W1(i,2),W1(i+4,1),W1(i+3,1),W1(i+2,1),W1(i+1,1),W1(i,1)];
end
Xls1=inv((B1'*B1))*B1'*A1;
for k=2:N+1
e(k)=A1(k-1)-B1(k-1,:)*Xls1;
end
sgm14=e'*e/N