基于MATLAB控制系统辨识系列2-最小二乘法

最小二乘算法及优化算法,纵向比较得出结论:只需要在程序中更改响应的迭代公式即可,简单明了。

目录

一.辨识算法之最小二乘法

 二、程序代码

 三、程序运行结果


一.辨识算法之最小二乘法

方法递推公式性能指标
经典最小二乘法(CAR)

递推最小二乘法

(CAR)

带遗忘因子递推最小二乘法

(CAR)

递推增广最小二乘法

(CARMA)

 二、程序代码

CAR模型:假设控制系统为

 CARMA模型:假设控制系统为:

 具体代码集合如下,需要运行那一算法,则更改logical(0)为logical(1),同时保证其余logical(0)

clear all;close all;

a=[1 -1.5 0.7]';
b=[1 0.5]';d=3;
c=[1 -1 0.2]';%对象参数
na=length(a)-1;
nb=length(b)-1;
nc=length(a)-1;%na,nb.nc分别为A,B,C阶次
mode=1;%1:递推最小二乘 0:标准最小二乘
L=1000;
uk=zeros(d+nb,1);%输入初始值:uk(i)表示u(k-i)
yk=zeros(na,1);%输出初始值
xik=zeros(nc,1);%噪声初值
xiek=zeros(nc,1);%噪声估计值
lambda=0.977;%遗忘因子0.95-1之间
x1=1;x2=1;x3=1;x4=0;S=1;%移位寄存器,方波初始值
u=randn(L,1);%输入采用白噪声序列
xi=sqrt(1)*randn(L,1); %输入采用白噪声系列,方差为1
xi_LSQ=sqrt(0.1)*randn(L,1);%白噪声序列
theta=[a(2:na+1);b];%对象参数真值
theae_1=zeros(na+nb+1,1);%theae初始值
theta_zg=[a(2:na+1);b;c(2:nc+1)];%增广最小二乘对象参数
theae_zg_1=zeros(na+nb+1+nc,1);%na+nb+1+nc为辨识参数
P=10^6*eye(na+nb+1);%CAR模型
P_zg=10^6*eye(na+nb+1+nc);%增广模型
%%%%%%%%%%%%%%%%%%%%%%%%%%最小二乘法%%%%%%%%%%%%%%%%%%%%%%%%%%%
if logical(0)
    for k=1:L
        phi(k,:)=[-yk;uk(d:d+nb)]';%此处phi(k,:)为行向量,便于组成phi矩阵
        
        y(k)=phi(k,:)*theta + xi(k);%采集输出数据
        
        M=xor(x3,x4); %产生M序列
        IM=xor(M,S);%产生逆M序列
        
        if IM==0
            u(k)=-1;
        else
            u(k)=1;
        end
        S=not(S);%产生方波
        
        
        %更新数据
        x4=x3;x3=x2;x2=x1;x1=M; 
    
        for i=d+nb:-1:2
            uk(i)=uk(i-1);
        end
        uk(1)=u(k);
        for i=na:-1:2
            yk(i)=yk(i-1);
        end
        yk(1)=y(k);
        
    end

    thetae=inv(phi'*phi)*phi'*y' %计算参数估计值theta
end

%%%%%%%%%%%%%%%%%%%%%%%%%%递推最小二乘法%%%%%%%%%%%%%%%%%%%%%%%%%%%
if logical(0)
    for k=1:L
        
        phi=[-yk;uk(d:d+nb)];%此处phi(k,:)为列向量,便于组成phi矩阵
        
        y(k)=phi'*theta + xi_LSQ(k);%采集输出数据
        
        %递推最小二乘公式
        K=P*phi/(1+phi'*P*phi);
        thetae(:,k)=theae_1+K*(y(k)-phi'*theae_1);
        P=(eye(na+nb+1)-K*phi')*P;
        
        %更新数据
        
        theae_1=thetae(:,k);
        
        for i=d+nb:-1:2
            uk(i)=uk(i-1);
        end
        uk(1)=u(i);
        for i=na:-1:2
            yk(i)=yk(i-1);
        end
        yk(1)=y(k);
      
    end


    plot([1:L],thetae);
    xlabel('k');
    ylabel('参数估计a、b');
    legend('a_1','a_2','b_0','b_1');
    axis([0 L -2 1.5]);
end


%%%%%%%%%%%%%%%%%%%%%%%%%%遗忘因子递推最小二乘法%%%%%%%%%%%%%%%%%%%%%%%%%%%

if logical(0)
    for k=1:L
        if k==501
            a=[1 -1 0.4]';
            b=[2 0.8]';%对象参数突变
            
        end
        theta(:,k)=[a(2:na+1);b];%对象参数真值
        
        phi=[-yk;uk(d:d+nb)];%此处phi为列向量   
        y(k)=phi'*theta(:,k) + xi_LSQ(k);%采集输出数据
        
        M=xor(x3,x4); %产生M序列
        IM=xor(M,S);%产生逆M序列
        
        if IM==0
            u(k)=-1;
        else
            u(k)=1;
        end
        S=not(S);%产生方波
        
        
        %更新数据
        x4=x3;x3=x2;x2=x1;x1=M; %输入数据为M序列
        
        %遗忘因子递推最小二乘法
        K=P*phi/(lambda+phi'*P*phi);
        thetae(:,k)=theae_1+K*(y(k)-phi'*theae_1);
        P=(eye(na+nb+1)-K*phi')*P/lambda;
        
        %更新数据
        
        theae_1=thetae(:,k);
      
        for i=d+nb:-1:2
            uk(i)=uk(i-1);
        end
        uk(1)=u(k);
        for i=na:-1:2
            yk(i)=yk(i-1);
        end
        yk(1)=y(k);
        
    end
    subplot(1,2,1)
    plot([1:L],thetae(1:na,:));
    hold on;
    plot([1:L],theta(1:na,:));
    xlabel('k');
    ylabel('参数估计a');
    legend('a_1','a_2');
    axis([0 L -2 2]);
    subplot(1,2,2)
    plot([1:L],thetae(na+1:na+nb+1,:));
    hold on;
    plot([1:L],theta(na+1:na+nb+1,:));
    xlabel('k');
    ylabel('参数估计a');
    legend('b_0','b_1');
    axis([0 L -1 4]);
end


%%%%%%%%%%%%%%%%%%%%%%%%%%递推增广最小二乘法%%%%%%%%%%%%%%%%%%%%%%%%%%%

if logical(1)
    for k=1:L
        
        phi=[-yk;uk(d:d+nb);xik];%此处phi(k,:)为列向量,便于组成phi矩阵
        
        y(k)=phi'*theta_zg + xi_LSQ(k);%采集输出数据
        phie=[-yk;uk(d:d+nb);xiek];%组建\hat\phi
        %递推最小二乘公式
        K=P_zg*phie/(1+phie'*P_zg*phie);
        thetae(:,k)=theae_zg_1+K*(y(k)-phie'*theae_zg_1);
        P_zg=(eye(na+nb+1+nc)-K*phie')*P_zg;
        xie=y(k)-phie'*thetae(:,k);%白噪声的估计值 
        
        %更新数据 
        theae_zg_1=thetae(:,k);
        
        for i=d+nb:-1:2
            uk(i)=uk(i-1);
        end
        uk(1)=u(k);
        for i=na:-1:2
            yk(i)=yk(i-1);
        end
        yk(1)=y(k);
        for i=nc:-1:2
            xik(i)=xik(i-1);
            xiek(i)=xiek(i-1);
        end
        xik(1)=xi(k);
        xiek(1)=xie;
    end

    figure(1)
    
    plot([1:L],thetae(1:na,:));
    xlabel('k');
    ylabel('参数估计a');
    legend('a_1','a_2');
    axis([0 L -2 2]); 
    
    figure(2)
    
    plot([1:L],thetae(na+1:na+nb+1,:));
    xlabel('k');
    ylabel('参数估计b');
    legend('b_0','b_1');
    axis([0 L 0 1.5]);
    
    figure(3)
    
    plot([1:L],thetae(na+nb+2:na+nb+1+nc,:));
    xlabel('k');
    ylabel('参数估计c');
    legend('c_1','c_2');
    axis([0 L -2 2]);   
end

 三、程序运行结果

 

参考文献:系统辨识与自适应控制MATLAB仿真(第3版)庞中华、崔红编著

  • 13
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
Matlab最小二乘类辨识方法的比较-辨识作业.rar 很久以前做过的一篇课程论文,是系统辨识中最基础的几种最小二乘类辨识方法的比较,最小二乘法,递推最小二乘和广义最小二乘,发上来和大家分享一下, 注意: 本附件免费提供,但是每下载一次系统会扣一个M币以控制下载流量,右键单击另存为,不要用迅雷.迅雷下载时每线程收费1M币,如默认设置为5个线程时收费就是5个M币! 课题内容为 已知系统模型:x-1.5x 0.7x=2u 0.5u, y=x ν, ν=αγ, u、x、y、ν分别为模型输入、模型输出、测量输出、干扰噪声。输入u为逆m序列:信号幅值a=1、寄存器位数为n=5,重复周期数q=40。α为噪信比调整因子,噪信比定义为:NSR=σv/σx*100% ,σx、σv分别为模型输出x和噪声ν的均方差(标准差),γ有两种模型:γ为白噪声,γ为有色噪声,噪声模型为: γ=e 0.5e 0.9γ-0.95γ ,e为白噪声。定义辨识误差值:δ= ,其中:N为独立的实验次数, 为模型真值, 为估计值。 完成下列问题: 1.编制Matlab程序,产生u,x,取前1024点绘制u和x图形。(10分) 2.编制Matlab程序,取NSR=20%,用同一噪声源产生两种噪声模型,分别绘制ν、y曲线。(10分) 3.编制Matlab程序,取NSR=0%、5%、10%、15%、20%、25%、30%、35%、40%、45%、50%,ν分别采用白噪声模型和有色噪声模型,每种工况下取独立试验次数N=50(每次独立产生噪声),数据序列取前1024点,用批次最小二乘法辨识模型,分别画出NSR~δ曲线,以此说明噪声对辨识精度的影响。(20分) 4.编制Matlab程序,取NSR=10%、40%,ν分别取白噪声模型和有色噪声模型,用递推最小二乘法辨识模型参数,对比画出各参数辨识结果随递推次数变化的曲线。为了对比研究,必须保证在同一组u、x序列下,用同一白噪声源γ产生给定噪信比的白噪声和有色噪声干扰。(30分) 5.编制Matlab程序,取NSR=10%、30%,ν取有色噪声模型,分别用递推最小二乘和广义最小二乘递推法辨识系统参数,对比画出各参数辨识结果随γ次数变化的曲线。为了对比研究,必须保证在同一组u、y序列下进行辨识试验。(30分) 摘要:本文系统的探讨了三种最小二乘类辨识方法的原理和性能,并对各种方法在各种不同的环境下进行了MATLAB仿真,仿真结果证明:最小二乘法不适合实时处理,在同等情况下,递推最小二乘的辨识速度较快,但在有色噪声干扰下效果不理想,广义最小二乘法辨识效果最好,且不受噪声是否有色的影响,但是费时最多。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ayuan0211

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值