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

首先是处理数据:

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代码相关推荐

  1. python演示验证图像叠加过程_Python叠加矩形框图层2种方法及效果代码实例

    本篇文章小编给大家分享一下Python叠加矩形框图层2种方法及效果代码实例,代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 两种方式以及效果: 方式一,使用 ...

  2. 由浅入深CIL系列:5.抛砖引玉:判断string是否为空的四种方法的CIL代码看看效率如何?...

      本节将接触几个新的CIL操作码如下 ldc.i4.0    将整数值 0 作为 int32 推送到计算堆栈上 Ceq         比较两个值.如果这两个值相等,则将整数值 1 (int32) ...

  3. matlab 仿真光学实验报告,光学实验数值仿真的三种方法及MATLAB实现

    光学实验数值仿真的三种方法及 MATLAB实现 5 结 论 (1)数值模拟结果表明三种方法都能对光学 实验现象进行正确地仿 真,因此在课 堂教学 中适 当应用这种仿真模拟 ,将光学实验 中复杂的数学 ...

  4. 图像灰度化的三种方法(matlab、C++、Python实现)

    灰度化处理就是将一幅色彩图像转化为灰度图像的过程.彩色图像分为R,G,B三个分量,分别显示出红绿蓝等各种颜色,灰度化就是使彩色的R,G,B分量相等的过程.灰度值大的像素点比较亮(像素值最大为255,为 ...

  5. 随机信号功率谱密度函数理论、估计方法及MATLAB代码

    文章的内容整理自网络,仅Matlab代码部分进行了部分修正,具体而言: 理论部分来自:现代通信原理2.5:确定信号的能量谱密度.功率谱密度与自相关函数 估计和代码部分来自: 随机信号功率谱密度估计 P ...

  6. 独家 | 使用Python实现机器学习特征选择的4种方法(附代码)

    作者:Sugandha Lahoti 翻译:李洁 校对:杨光 本文约3500字,建议阅读13分钟. 本文中,我们将研究从数据集中选择特征的不同方法;同时通过使用Python中Scikit-learn  ...

  7. java 隐藏标题栏_两种方法一句代码隐藏Activity的标题栏

    把Activity的标题栏隐藏有两种方法.一种是在在Activity里面设置javacode.还有一种是在项目的清单文件AndroidManifest.xml中设置模版样式. 一.在Activity中 ...

  8. matlab 求矩阵秩,求矩阵秩的两种方法及MATLAB的应用

    摘    要: 高等代数是一门逻辑思维比较强和理论知识比较深的学科, 它具有丰富的数学知识, 涉及许多重要的数学思想, 其在数学领域的应用很广泛, 如行列式.矩阵的相关计算和求解线性方程组的解方面的应 ...

  9. Caputo 分数阶一维问题基于 L1 逼近的空间二阶方法(附Matlab代码)

    Caputo 分数阶一维问题基于 L1 逼近的空间二阶方法 Caputo 分数阶一维问题基于 L1 逼近的快速差分方法(附Matlab程序) 文章目录 Caputo 分数阶一维问题基于 L1 逼近的空 ...

最新文章

  1. Google发布三大新品,Pixel手机价格直逼苹果
  2. 带有支付功能的产品如何进行测试
  3. POJ2455 Secret Milking Machine【二分,最大流】
  4. 题目1188:约瑟夫环
  5. Matplotlib实例教程(十一)堆栈图
  6. bzoj 1968: [Ahoi2005]COMMON 约数研究【枚举】
  7. linux g++ 关闭 ‘typedef’ 警告_Linux学习13CentOS安装mysql5.6环境
  8. how is my real odata request hijacked by Mock server
  9. Python 开发者在迁移到 Go(lang) 时需要知道哪些事?
  10. hdu 4280 最大流sap
  11. java treemap_Java TreeMap lastEntry()方法与示例
  12. Python 输入一些数,统计最大值及其出现的频率,求一个数的全部质因数
  13. QT设置画笔/画刷颜色
  14. svn —— 版本回退
  15. 计算机复制功能快捷键,电脑复制快捷键是什么(全部复制粘贴的快捷键是什么)...
  16. 数字化住宅小区对计算机网络有需求,浅谈智能小区宽带接入及其技术发展趋势...
  17. conda创建管理虚拟环境
  18. 天下武功唯快不破------实验吧
  19. jdk1.8的安装教程
  20. HTML转义字符、Javascript转义字符、HTML特殊字符对照表

热门文章

  1. 决战秋招 -- 经典面试题集锦
  2. android开发常用的ADB命令
  3. linuxoracle图形界面无法跳出_Linux 7图形化安装Oracle或者其他软件,打不开图形界面的问题 | 信春哥,系统稳,闭眼上线不回滚!...
  4. 【python】Dpark源码分析
  5. 【python】批量实现modis数据的辐射定标,大气校正及地形校正
  6. vscode在html看到图片的插件_利用花瓣插件 下载高清大图
  7. GPU 编程与CG 语言之阳春白雪下里巴人——CG学习读书笔记之数学函数(之一)。
  8. atoi()函数的实现
  9. 高数(下) 第八章:空间解析集合与向量代数
  10. Excel合并多列增加指定字符指定字符替换为换行符调整行高步骤