系统辨识——最小二乘估计的一次完成算法/批处理算法(LS算法)MATLAB编程实现

算法详情请参考书籍《系统辨识及其MATLAB仿真》侯媛彬.,这里不做详细介绍。(如果有需要的话,请在评论区留言,如果留言数足够多,可以更新一期)

好的,直接来看编程实例:

题目:

利用最小二乘一次完成算法对如下系统进行参数辨识:

在这里插入图片描述

假设v(k)服从正态分布的白噪声,输入信号u(k)采用幅值为1的M序列,利用LS算法进行参数估计。

分析:

在这里插入图片描述

式中,na=2,nb=2
利用式(3.7)(3.8)可写出
h(k)=[-z(k-1),-z(k-2),u(k-1),u(k-2)]T
θ=[a1,a2,b1,b2]T

数据长度取L=500;
加权矩阵为单位阵I(即无加权)

观测ZL和HL的构造,可参考公式(3.16)(3.17):

系统辨识——最小二乘估计的一次完成算法/批处理算法(LS算法)MATLAB编程实现_第1张图片

系统辨识——最小二乘估计的一次完成算法/批处理算法(LS算法)MATLAB编程实现_第2张图片

利用公式(3.27)或(3.35),可以计算参数估计值θ。
在这里插入图片描述
在这里插入图片描述

基本算法流程:

系统辨识——最小二乘估计的一次完成算法/批处理算法(LS算法)MATLAB编程实现_第3张图片

程序实现:

clear all;clc;
%% 最小二乘一次完成算法LS
a=[1,-1.5,0.7]';b=[1,0.5]';d=3;%对象参数,d是什么???
na=length(a)-1;nb=length(b)-1;%na,nb为a,b阶次
L=500;%数据长度
uk=zeros(d+nb,1);%输入初值4*1
zk=zeros(na,1);%输出初值2*1

X1=1;X2=0;X3=1;X4=0;S=1;%设置移位寄存器初值、方波初值
e=randn(L,1);%白噪声序列

theta=[a(2:na+1);b];%对象参数真值a1;a2;b1;b2

for k=1:L
    HL(k,:)=[-zk;uk(d:d+nb)]';%构建HL矩阵(每次生成一行)1,2个数为z的值,第3,4个数为u的值
    ZL(k)=HL(k,:)*theta+e(k);%构建ZL矩阵
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %生成M序列
    Y4=X4;Y3=X3;Y2=X2;Y1=X1;
    X4=Y3;X3=Y2;X2=Y1;
    X1=xor(Y3,Y4);
    if Y4==0
        M(k)=-1;
    else
        M(k)=Y4;
    end
    
%     %或生成逆M序列
%     IM=xor(S,X4);
%     if IM==0
%         u(k)=-1;
%     else
%         u(k)=1;
%     end
%     S=not(S);M=xor(X3,X4);%产生M序列
%     %更新数据
%     X4=X3;X3=X2;X2=X1;X1=M;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    %每次循环生成两个u,分别是u(2),u(1);...依次生成
    for i=d+nb:-1:2     %4:-1:2
        uk(i)=uk(i-1);
    end
    uk(1)=M(k);
    %uk(1)=u(k);  %逆M序列中
    
    %每次循环生成两个z,分别是z(2),z(1);...依次生成
    for j=na:-1:2      %j=2,zk(2)=zk(1);
        zk(j)=zk(j-1);
    end
    zk(1)=ZL(k);    

end

theta2=inv(HL'*HL)*HL'*ZL'%计算参数估计值theta2
%End

后记:

以其中一个结果为例:

系统辨识——最小二乘估计的一次完成算法/批处理算法(LS算法)MATLAB编程实现_第4张图片
最小二乘一次完成算法的辨识结果:

参数 a1 a2 b1 b2
真值 -1.5 0.7 1.0 0.5
估计值 -1.5281 0.7321 1.0014 0.5287

你可能感兴趣的:(MATLAB,系统辨识,matlab,最小二乘)