系统辨识的几种方法实现MATLAB代码

系统辨识,即在已知系统阶次的情况下辨识出系统的参数或辨识系统阶次,一般用到的方法有最小二乘法、辅助变量法等,对于离线与在线辨识,只是加入一个递推的问题。下面本文给出系统辨识方法的实现代码。

首先是处理数据:

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

你可能感兴趣的:(Matlab)