⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 riv01.m

📁 本人用matlab编写的rels(最小二乘法)
💻 M
字号:
%RIV(2阶)
fidin1=fopen('test1.txt');                               % 打开test1.txt文件              
fidout1=fopen('data1.txt','w');                          % 创建data1.txt文件 
while ~feof(fidin1)                                     % 判断是否为文件末尾                
   tline=fgetl(fidin1);                                 % 从文件读行    
   fprintf(fidout1,'%s\n\n',tline);                     % 把此行数据写入文件data1.txt 
end 
fclose(fidout1); 
u=importdata('data1.txt');      % u
fidin2=fopen('test2.txt');                               % 打开test2.txt文件              
fidout2=fopen('data2.txt','w');                          % 创建data2.txt文件 
while ~feof(fidin2)                                     % 判断是否为文件末尾                
   tline=fgetl(fidin2);                                 % 从文件读行    
   fprintf(fidout2,'%s\n\n',tline);                     % 把此行数据写入文件data.txt 
end 
fclose(fidout2); 
y=importdata('data2.txt');      % y
%RIV,RLS启动
C0=[0.0001 0.0001 0.0001 0.0001]';%直接给出被辨识参数的初始值,即一个充分小的实向量
P0=10^6*eye(4,4);%直接给出初始状态P0,即一个充分大的实数单位矩阵
r=0.99;
C=[C0,zeros(4,299)];%被辨识参数矩阵的初始值及大小
e=zeros(4,300);%相对误差的初始值及大小
for k=3:100; %开始求K 
x=[-y(k-1),-y(k-2),u(k-1),u(k-2)]'; m=r+x'*P0*x; n=inv(m); K=P0*x*n;%求K的值
C1=C0+K*(y(k)-x'*C0);%求被辨识参数C
P1=(P0-K*x'*P0)/r;%求出 P(k)的值
P0=P1;
e1=C1-C0;%求参数当前值与上一次的值的差值
e2=e1./C0;%求参数的相对变化
e(:,k)=e2; 
C0=C1;%新获得的参数作为下一次递推的旧参数
C(:,k)=C1;%把辨识参数c 列向量加入辨识参数矩阵的最后一列 
end%RLS启动结束
C1
z=zeros(300,1);
for k=101:300; %开始求K 
x=[-y(k-1),-y(k-2),u(k-1),u(k-2)]';z1=[-z(k-1),-z(k-2),u(k-1),u(k-2)]';
m=r+x'*P0*z1; n=inv(m); K=P0*z1*n;%求K的值
C1=C0+K*(y(k)-x'*C0);%求被辨识参数C
P1=(P0-K*x'*P0)/r;%求出 P(k)的值
P0=P1;
z1(k)=z1'*C1;%求z(k)
e1=C1-C0;%求参数当前值与上一次的值的差值
e2=e1./C0;%求参数的相对变化
e(:,k)=e2; %把当前相对变化的列向量加入误差矩阵的最后一列 
C0=C1;%新获得的参数作为下一次递推的旧参数
C(:,k)=C1;%把辨识参数c 列向量加入辨识参数矩阵的最后一列 
end%循环结束
%分离参数
C1
a1=C(1,:); a2=C(2,:) ; b1=C(3,:) ; b2=C(4,:) ; ea1=e(1,:) ; ea2=e(2,:) ; eb1=e(3,:) ; eb2=e(4,:) ; 
subplot(2,1,1)
i=1:300;%横坐标从1到300
plot(i,a1,'r',i,a2,'r:',i,b1,'g',i,b2,'g:') %画出a1,a2,b1,b2的各次辨识结果
title('被辨识参数每次递推估计值的图形')
subplot(2,1,2)
i=1:300; %横坐标从1到300
plot(i,ea1,'r',i,ea2,'g',i,eb1,'b',i,eb2,'r:') %画出a1,a2,b1,b2的各次辨识结果的收敛情况
title('被辨识参数的相对误差变化的图形')

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -