递推最小二乘,遗忘因子递推最小二乘,模糊遗忘因子最小二乘系统辨识的实验分析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
以下是仿真所用代码

%遗忘因子递推最小二乘参数估计(FFRLS)
clear all; close all;
a=[1 -1.5 0.7]'; b=[1 0.5]'; d=3; %对象参数
na=length(a)-1; nb=length(b)-1; %na、nb为A、B阶次
L=400; %仿真长度
uk=zeros(d+nb,1); %输入初值:uk(i)表示u(k-i)
yk=zeros(na,1); %输出初值
u=randn(L,1); %输入采用白噪声序列
xi=sqrt(0.1)*randn(L,1)/5; %白噪声序列
lambda=[0.99 0.98 0.95 0.9 0.85 0.80 0.75 0.70];
lambda11=[0.99];
lambda2=0.98; %带遗忘因子最小二乘辨识的遗忘因子
for lambda2=lambda11
    close all;
a=[1 -1.5 0.7]'; b=[1 0.5]'; d=3; %对象参数
thetae_1=zeros(na+nb+1,1); %带分段遗忘因子最小二乘辨识的thetae初值
thetae_2=zeros(na+nb+1,1); %带遗忘因子最小二乘辨识的thetae初值
thetae_3=zeros(na+nb+1,1); %标准最小二乘辨识的thetae初值
P1=10^6*eye(na+nb+1);  %带遗忘因子最小二乘辨识的P0
P2=10^6*eye(na+nb+1); %带分段遗忘因子最小二乘辨识的P0
P3=10^6*eye(na+nb+1); %标准最小二乘辨识的P0
lambda1=0.98; %带分段遗忘因子最小二乘辨识的遗忘因子
lasr_e=0;
% delat_k=1;
u_kk=0;
for k=1:L
    if k==201
        a=[1 -1 0.4]';b=[1.5 0.2]'; %对象参数突变
    end
    k
    theta(:,k)=[a(2:na+1);b]; %对象参数真值
    
    phi=[-yk;uk(d:d+nb)];
    y(k)=phi'*theta(:,k)+xi(k); %采集输出数据
    
    %遗忘因子递推最小二乘法
    K1=P1*phi/(lambda1+phi'*P1*phi);
    K2=P2*phi/(lambda2+phi'*P2*phi);
    K3=P3*phi/(1+phi'*P3*phi);
    e=y(k)-phi'*thetae_1;
    e_k(:,k)=e;
    dd=e-lasr_e;
    delat_k(:,k)=d; 
    lasr_e=e;
  %  e=y(k)-phi'*thetae_1_n;
    if(abs(e)<0.1)  
        u_kk=0.99;
    end
    if(abs(e)<0.25)  
        u_kk=0.98;
    end
    if(abs(e)<1)
        u_kk=0.98;
    end
    if(abs(e)>1)
        u_kk=0.8;
    end
    if(abs(e)>2)
        u_kk=0.75;
    end
    lambda1=u_kk;
    thetae1(:,k)=thetae_1+K1*(y(k)-phi'*thetae_1);
    thetae2(:,k)=thetae_2+K2*(y(k)-phi'*thetae_2);
    thetae3(:,k)=thetae_3+K3*(y(k)-phi'*thetae_3);
    a2=readfis("Untitled");
    lambda2=evalfis(e,a2);
    P1=(eye(na+nb+1)-K1*phi')*P1/lambda1;
    P2=(eye(na+nb+1)-K2*phi')*P2/lambda2;
    P3=(eye(na+nb+1)-K3*phi')*P3;
    %更新数据
    thetae_1=thetae1(:,k);
    thetae_2=thetae2(:,k);
    thetae_3=thetae3(:,k);
    error_1(:,k)=norm(thetae_1-theta(:,k))/norm(theta(:,k));
    error_2(:,k)=norm(thetae_2-theta(:,k))/norm(theta(:,k));
    error_3(:,k)=norm(thetae_3-theta(:,k))/norm(theta(:,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
figure
subplot(1,2,1)
plot([1:L],thetae1(1:na,:)); hold on; plot([1:L],theta(1:na,:),'k:');
xlabel('k'); ylabel('参数估计a');
legend('a_1','a_2'); axis([0 L -2 2]);
subplot(1,2,2)
plot([1:L],thetae1(na+1:na+nb+1,:)); hold on; plot([1:L],theta(na+1:na+nb+1,:),'k:');
xlabel('k'); ylabel('参数估计b');
legend('b_0','b_1'); axis([0 L -0.5 2]);
figure
subplot(1,2,1)
plot([1:L],thetae2(1:na,:)); hold on; plot([1:L],theta(1:na,:),'k:');
xlabel('k'); ylabel('参数估计a');
legend('a_1','a_2'); axis([0 L -2 2]);
subplot(1,2,2)
plot([1:L],thetae2(na+1:na+nb+1,:)); hold on; plot([1:L],theta(na+1:na+nb+1,:),'k:');
xlabel('k'); ylabel('参数估计b');
legend('b_0','b_1'); axis([0 L -0.5 2]);

figure
subplot(1,2,1)
plot([1:L],thetae3(1:na,:)); hold on; plot([1:L],theta(1:na,:),'k:');
xlabel('k'); ylabel('参数估计a');
legend('a_1','a_2'); axis([0 L -2 2]);
subplot(1,2,2)
plot([1:L],thetae3(na+1:na+nb+1,:)); hold on; plot([1:L],theta(na+1:na+nb+1,:),'k:');
xlabel('k'); ylabel('参数估计b');
legend('b_0','b_1'); axis([0 L -0.5 2]);
figure
hold
plot(error_1')
plot(error_2')
plot(error_3')
end

模糊模块下载:
https://pan.baidu.com/s/1VHV1xGm0XNiSvYdsxVKpPA

  • 17
    点赞
  • 118
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
下面是一个简单的MATLAB脚本,实现了多新息小二辨识算法(MI-RLS): ```matlab clear; clf; format short g % 设置参数 p = 1; % 创新长度 p=1,5,10 length1 = 1000; % 数据长度 lambda = 0.98; % 遗忘因子 % 多项式A(z),B(z),D(z)的阶数 na = 2; nb = 2; nc = 2; nd = 2; nl = na + nb; n2 = nc + nd; n = na + nb + nc + nd; % A(z),B(z),D(z)的系数向量 a = [1, -0.56, 0.42]; b = [0, 0.9, 0.6]; c = [1, -0.3, 0.2]; d = [1, 0.3, 0, -0.20]; c1 = conv(a, c); theta = [a(2:na+1); b(2:nb+1); c(2:nc+1); d(2:nd+1)]; % 参数向量 theta n = length(theta); fprintf('\nMI-RLS算法\n'); fprintf('创新长度p=%d\n', p); % 准备输入数据和噪声数据 rand('state', 15); % 设置随机变量的状态 u = (rand(length1, 1) - 0.5) * sqrt(12); % 输入随机序列 randn('state', 15); v = randn(length1, 1); % 噪声随机序列 % 生成输出数据 y = zeros(length1, 1); w = zeros(n, 1); for t = n:length1 w(t) = theta' * [-w(t-1:-1:t-nc); v(t-1:-1:t-nd)] + v(t); y(t) = theta(1:na)' * [-y(t-1:-1:t-na); u(t-1:-1:t-nb)] + w(t); end % MI-RLS算法 Phi = eye(n*p) / lambda; % 初始协方差矩阵 theta_hat = zeros(n*p, 1); % 初始参数估计 for t = p:length1 phi = [-y(t-1:-1:t-na); u(t-1:-1:t-nb); -w(t-1:-1:t-nc); v(t-1:-1:t-nd)]; K = Phi * phi / (lambda + phi' * Phi * phi); % RLS增益 e = y(t) - phi' * theta_hat; % 预测误差 theta_hat = theta_hat + K * e; % 参数更新 Phi = (Phi - K * phi' * Phi) / lambda; % 协方差更新 end % 输出结果 fprintf('真实参数向量:\n'); disp(theta); fprintf('估计参数向量:\n'); disp(theta_hat); ``` 请注意,这只是一个简单的示例,可能需要根据您的具体需求进行修改和优化。希望对您有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值