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

📄 pfdemo.m

📁 采用误差校正算法改进的粒子滤波器
💻 M
字号:
% 版本    :2.0% 时间    :2007-1-30% 作者    :zll% 功能    :对下面的状态空间模型进行粒子滤波,使用SIR算法%         : x(t+1) = 0.5x(t) + [25x(t)]/[(1+x(t))^(2)] %         :           + 8cos(1.2t) + process noise%         : y(t) =  x(t)^(2) / 20  + measurement noise%         :包括预测过程,权值递推及权值归一化过程,重采样过程,加入了是否进行重采样的判断%         :增加了均方差,显示更直观,用matlab表达式替代for循环,加快运行速度% 基本思想:通过给定的状态初始值以及状态方程,测量方程,递推得到每一时刻的状态值和测量值。%         :然后根据得到的测量值利用SIS算法求得每一时刻状态的估计值,将估计值与真值进行对比。%         :重要性函数选为高斯分布函数。%         :通过误差校正来提高估计精度                          clear;echo off;% 初始化参数% ==========N = 100;                % 算法迭代的时间步数t = 1:1:N;             % 时间序列  x0 = 0.1;                % 状态初始值n = 1;                 % z维的大小,缺省为1,当状态变量为多维时,n>1,此时可对z维中的每一层进行同步滤波x = zeros(N,1,n);      % 状态变量初始化y = zeros(N,1,n);      % 测量值初始化x(1,1,n) = x0;         % 迭代初值 R = 1;                 % 测量噪声方差Q = 1;                 % 过程噪声方差     initVar = 5;           % 状态初始方差  numSamples = 500;      % 采样粒子数目Nstd = 2;              % 误差条设置Cr = zeros(N,2,n);     %测量误差方差真实值       00/070129xCr = zeros(N,1,n);    %误差校正估计值           00/070130xFCr = zeros(N,1,n);   %MH估计值           00/070208wPre = zeros(N,1);no_of_runs=100;       %执行次数PxTomeanPost=zeros(no_of_runs,1);PxTomeanWeight=zeros(no_of_runs,1);PxToFCr=zeros(no_of_runs,1);PxToCr=zeros(no_of_runs,1);for r=1:no_of_runs,r% 产生过程噪声和测量噪声% ======================v = randn(N,1);w = sqrt(Q)*randn(N,1);   % 递推得到状态真值以及测量值% ==========================y(1,1) = (x(1,1)^(2))./20 + v(1,1); for t = 2:N,  x(t,1) = 0.5*x(t-1,1) + 25*x(t-1,1)/(1+x(t-1,1)^(2)) + 8*cos(1.2*(t-1)) + w(t,1);  y(t,1) = (x(t,1).^(2))./20 + v(t,1); end;% 进行粒子滤波:SIR算法% =====================[rows,cols] = size(y);       S = numSamples;              xSamples = zeros(S,rows);     % 后验状态估计值初始化xPre = zeros(S,rows);         % 状态预测值初始化xMH = zeros(numSamples,1);    % MH法候选值 q = 1/S.*ones(S,rows);        % 重要性权值初始化qF = 1/S.*ones(S,rows);        % 完全MH重要性权值初始化% 初始采样% ========initSamples = sqrt(initVar)*randn(S,1);          xPre(:,1) = predictstates(initSamples,1,Q);q(:,1) = importanceweights(xPre(:,1),y(1,1),R,q(:,1));        [xSamples(:,1),q(:,1)] = updatestates(xPre(:,1),q(:,1));             % 00/070129% 预测与更新过程% ==============for t = 1:rows-1,      xPre(:,t+1) = predictstates(xSamples(:,t),t,Q);                            % 状态预测  q(:,t+1) = importanceweights(xPre(:,t+1),y(t+1,1),R,q(:,t));               % 权值计算  [xSamples(:,t+1), q(:,t+1)] = updatestates(xPre(:,t+1),q(:,t+1));          % 根据测量值进行状态更新和权值更新  %00/070129end;% 计算后验均值估计,极大后验估计,后验加权估计% ============================================samples=xSamples;meanPost = mean(samples);               % 后验均值估计  meanWeight = sum(samples .* q);         % 后验加权估计PxTomeanPost(r,1) = sqrt(1/N * sum((x-meanPost').^2));     % 真实值与后验均值估计之间的均方差PxTomeanWeight(r,1) = sqrt(1/N * sum((x-meanWeight').^2));  % 真实值与后验加权估计之间的均方差% 获得误差真实值Cr(k),利用测量误差与估计误差间的对应关系,调节估计值,提高估计精度% ===================00/070129,30 ,070202%计算估计值、预测值的一级预测测量误差和二级预测测量误差%==========================================================================tCr1=zeros(N+1,2);yPre1=zeros(N+1,2);yPre2=zeros(N+2,2);tCr2=zeros(N+2,2);tempCr1=zeros(N,2);tempCr2=zeros(N,2);tempCr3=zeros(N,2);wPost = sum(xSamples.*q);initSamples = sqrt(initVar)*randn(S,1);          xPre(:,1) = predictstates(initSamples,1,Q);q(:,1) = importanceweights(xPre(:,1),y(1,1),R,q(:,1));        [xSamples(:,1),q(:,1)] = updatestates(xPre(:,1),q(:,1));             % 00/070531% %=====================================================================   % MH算法for t = 2:rows,    [xFMH,qF(:,t)]=rwm(xSamples,S,xPre,q,t,y);   xSamples(:,t)=xFMH ;   xFCr(t,1)=sum(xSamples(:,t).*qF(:,t));end;xFCr(1,1)=sum(xSamples(:,1).*q(:,t));xFCr(100,1)=sum(xSamples(:,100).*q(:,100));PxToFCr(r,1)=sqrt(1/N * sum((x-xFCr).^2));     % 真实值与MH均值估计之间的均方差% 预测与更新过程% ==============for t = 2:rows-2,      xPre(:,t+1) = predictstates(xSamples(:,t),t,Q);                            % 状态预测  q(:,t+1) = importanceweights(xPre(:,t+1),y(t+1,1),R,q(:,t));               % 权值计算  [xSamples(:,t+1), q(:,t+1)] = updatestates(xPre(:,t+1),q(:,t+1));          % 根据测量值进行状态更新和权值更新  %00/070129     % %=====================================================================   % 校正MH算法  wPre(t) = 0.5.*meanWeight(t-1)+ 25.*meanWeight(t-1)/(1+meanWeight(t-1).^(2)) + 8*cos(1.2*(t-1)) ; % 计算一步和两步预测测量误差  00/070531  wPre11 = 0.5.*wPre(t)+ 25.*wPre(t)/(1+wPre(t).^(2)) + 8*cos(1.2*(t)) ;  wPre12 = 0.5.*wPost(t)+ 25.*wPost(t)/(1+wPost(t).^(2)) + 8*cos(1.2*(t)) ;  yPre1(t+1,1) = (wPre11.^(2))./20;  yPre1(t+1,2) = (wPre12.^(2))./20;  tCr1(t+1,1)=sqrt((yPre1(t+1,1)-y(t+1)).^2);   tCr1(t+1,2)=sqrt((yPre1(t+1,2)-y(t+1)).^2);   wPre21 = 0.5.*wPre11+ 25.*wPre11/(1+wPre11.^(2)) + 8*cos(1.2*(t+1)) ;  wPre22 = 0.5.*wPre12+ 25.*wPre12/(1+wPre12.^(2)) + 8*cos(1.2*(t+1)) ;  yPre2(t+2,1) = (wPre21.^(2))./20;  yPre2(t+2,2) = (wPre22.^(2))./20;  tCr2(t+2,1)=sqrt((yPre2(t+2,1)-y(t+2)).^2);    tCr2(t+2,2)=sqrt((yPre2(t+2,2)-y(t+2)).^2);       if t>0    M=1;  else    M=t;  end;  CrSum = 0;     for i=(t-M+1):t+1,   CrSum= CrSum+((wPost(i).^(2))./20-y(i)).^2;  end;  Cr(t+1,1)= sqrt(CrSum/M);   tempCr1(t+1,1)=sqrt(((wPre(t+1).^(2))./20-y(t+1)).^2);   if Cr(t+1,1)>2  && abs(Cr(t,1)-Cr(t+1,1))>0.5           if Cr(t+1,1)>tempCr1(t+1,1)          tempCr1(t+1,2)=1;      else          Cr(t+1,2)=1;      end;     [xMH,q(:,t)]=rwm(xSamples,S,xPre,q,t,y);     xSamples(:,t)=xMH ;     xCr(t,1)=sum(xSamples(:,t).*q(:,t));  else       xCr(t,1)=sum(xSamples(:,t).*q(:,t));end;end;xCr(1,1)=sum(xSamples(:,1).*q(:,t));xCr(99,1)=sum(xSamples(:,99).*q(:,99));xCr(100,1)=sum(xSamples(:,100).*q(:,100));mPre=mean(xPre);mPost=mean(xSamples);% xCr(1,1)=wPost(1);% xCr(N,1)=wPost(N); PxToCr(r,1)=sqrt(1/N * sum((x-xCr).^2));     % 真实值与误差校正均值估计之间的均方差% 极大后验估计bins = 20;xMap = zeros(N,1);for t = 1:N,  [p,pos] = hist(samples(:,t,1),bins);      map = find(p==max(p));  xMap(t,1) = pos(map(1));                end;PxToxMap = sqrt(1/N * sum((x-xMap).^2));           % 真实值与极大后验估计之间的均方差end;ErrorMW=mean(PxTomeanWeight);ErrorMH=mean(PxToFCr);ErrorPMH=mean(PxToCr);VarMW=var(PxTomeanWeight);VarMH=var(PxToFCr);VarPMH=var(PxToCr);disp(' ');disp('************* FINAL RESULTS *****************');disp(' ');disp('RWSE : mean and variance');disp('---------');disp(' ');disp(['PF          = ' num2str(ErrorMW) ' (' num2str(VarMW) ')']);disp(['PF-MH         = ' num2str(ErrorMH) ' (' num2str(VarMH) ')']);disp(['PF-PMH           = ' num2str(ErrorPMH) ' (' num2str(VarPMH) ')']);% 图形输出结果% ============% 绘制噪声分布图% figure(1)% clf;% subplot(221)% plot(v);% ylabel('Measurement Noise','fontsize',15);% xlabel('Time','fontsize',15);% subplot(222)% plot(w);% ylabel('Process Noise','fontsize',15);% xlabel('Time','fontsize',15);% subplot(223)% plot(x)% ylabel('State x','fontsize',15);% xlabel('Time','fontsize',15);% subplot(224)% plot(y)% ylabel('Observation y','fontsize',15);% xlabel('Time','fontsize',15);% 绘制后验均值估计与真值对比图,采用误差条% figure(2)% clf;% for t = 1:N,% plot(t,meanPost(:,t),'ro',t,x(t,1),'go',t,Cr(t,1),'bo',t,eXtoPX(t),'y*');   % plot(t,Cr(t,1),'b-o',t,eXtoPX(t),'r--o'); % hold on% errorbar(t,meanPost(:,t),Nstd*std(samples(:,t)),Nstd*std(samples(:,t)),'k');%   legend('Posterior mean estimate','True value');%   ylabel('Sequential state estimate','fontsize',15);%   xlabel('Time','fontsize',15);% end;%//0207% //20070531 for t = 1:N,%   eXtoPX(t)=(abs(x(t,1)-meanWeight(:,t)));%   xY(t,1)=(x(t,1).^(2))./20 ;%   mXtoPX(t)=(abs(xY(t,1)-y(t,1)));% end;%   plot(1:N,Cr(:,1),'b-*',1:length(eXtoPX),eXtoPX,'r--o',1:length(mXtoPX),mXtoPX,'k-'); %   hold on% %   errorbar(t,meanPost(:,t),Nstd*std(samples(:,t)),Nstd*std(samples(:,t)),'k');%   legend('measure-estimate error','estimate error','measure error');%   ylabel('error','fontsize',15);%  20070531 xlabel('Time','fontsize',15);      % % % figure(2)% % % clf;% for t = 1:N,%     if tempCr1(t,2)==1%     plot(t,meanWeight(:,t),'ko',t,x(t,1),'go',t,wPre(t),'bo',t,xCr(t,1),'b*',t,wPost(t),'yo'); %     hold on%     errorbar(t,meanWeight(:,t),Nstd*std(samples(:,t)),Nstd*std(samples(:,t)),'k');%   %     else%       if Cr(t,2)==1%         plot(t,meanWeight(:,t),'ko',t,x(t,1),'go',t,wPre(t),'bo',t,xCr(t,1),'r*',t,wPost(t),'yo');   %         hold on%        errorbar(t,meanWeight(:,t),Nstd*std(samples(:,t)),Nstd*std(samples(:,t)),'k');%       %       end;%     end;%   legend('Posterior weigth estimate','True value','Pre value','estimate');%   ylabel('Sequential state estimate','fontsize',15);%   xlabel('Time','fontsize',15);% end;% % % for t=1:N,% %   if Cr(t,1)>2 % %   plot(t,meanWeight(:,t),'yo',t,x(t,1),'g*',t,wPost(t),'k*',t,xCr(t,1),'r*');% % %   hold on% % %   errorbar(t,meanWeight(:,t),Nstd*std(samples(:,t)),Nstd*std(samples(:,t)),'k');% % %   legend('Posterior weigth estimate','True value','PF value','MHPF value');% % %   ylabel('Sequential state estimate','fontsize',15);% % %   xlabel('Time','fontsize',15);% % end;% % end;% 绘制真实值与后验均值估计,极大后验估计,后验加权均值估计的对比图% figure(3)% clf;% % plot(1:length(x),x,'g-*',1:length(x),meanPost,'r-+',1:length(x),xMap,'b-*',1:length(x),meanWeight,'c-s');% legend('True value','Posterior mean estimate','MAP estimate','Mean estimate with weights');% % plot(1:length(x),x,'g-*',1:length(x),meanPost,'r-+',1:length(y),y,'b-*');% % legend('True value','Posterior mean estimate','Measu value');% ylabel('State estimate','fontsize',15)% xlabel('Time','fontsize',15)% % % 绘制分别以后验均值估计,极大后验估计,后验加权均值估计为横坐标,真实值为纵坐标的点分布图% figure(4)% clf;% % subplot(221)% plot(meanPost,x,'+')% ylabel('True state','fontsize',15)% xlabel('Posterior mean estimate','fontsize',15)% hold on% c=-25:1:25;% plot(c,c,'r');% axis([-25 25 -25 25]);% text(0,-15,'均方差=');% text(10,-20,num2str(PxTomeanPost));% hold off% % subplot(222)% plot(xMap,x,'+')% ylabel('True state','fontsize',15)% xlabel('MAP estimate','fontsize',15)% hold on% c=-25:1:25;% plot(c,c,'r');% axis([-25 25 -25 25]);% text(0,-15,'均方差=');% text(10,-20,num2str(PxToxMap));% hold off% % subplot(223)% plot(meanWeight,x,'+')% ylabel('True state','fontsize',15)% xlabel('Mean estimate with weights','fontsize',15)% hold on% c=-25:1:25;% plot(c,c,'r');% axis([-25 25 -25 25]);% text(0,-15,'均方差=');% text(10,-20,num2str(PxTomeanWeight));% hold off% % % 绘制后验概率密度函数分布图% [row,col]=size(q);% domain = zeros(row,1);% range = zeros(row,1);% parameter = 1;% bins = 10;% support=[-20:1:20];% % % figure(5)% clf;% % u=[0 1];% caxis(u);% for t=1:1:N,%   figure(5)  %   [range,domain]=hist(samples(:,t,parameter),support);%   waterfall((domain),t,range);%   hold on% end;% % figure(5)% ylabel('Time','fontsize',15);% xlabel('Sample space','fontsize',15);% zlabel('Posterior density','fontsize',15);

⌨️ 快捷键说明

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