Ex3211.m
上传用户:shigeng
上传日期:2017-01-30
资源大小:122k
文件大小:3k
开发平台:

Matlab

  1. function Particle
  2. % Particle filter 
  3. x = 1; % 初始状态
  4. Q = 1; % 过程噪声协方差
  5. R = 1; % 测量噪声协方差
  6. tf = 100; % 仿真长度
  7. N = 100; % 粒子滤波器粒子数
  8. xhat = x;
  9. P = 2;
  10. xhatPart = x;
  11. % 初始化粒子过滤器
  12. N1=50;
  13. for i = 1 : N1
  14.     xpart(i) = x + sqrt(P) * randn;
  15. end
  16. xArr = [x];
  17. yArr = [3*x + sqrt(R) * randn];
  18. xhatArr = [x];
  19. PArr = [P];
  20. xhatPartArr = [xhatPart];
  21. close all;
  22.     % 系统仿真
  23.     x = 3*x + sqrt(Q) * randn;%状态方程
  24.     y = 3*x + sqrt(R) * randn;%观测方程
  25.      %  卡尔曼滤波
  26.     F = 3;
  27.     P = F * P * F' + Q;
  28.     H = xhat ;
  29.     K = P * H' * inv(H * P * H' + R);
  30.     xhat =  3*xhat ;%预测
  31.     xhat = xhat + K * (y - 3*xhat);%更新
  32.     P = (1 - K * H) * P;
  33.    
  34.     for i = 1 : N1
  35.         xpartminus(i) =3* xpart(i)  + sqrt(Q) * randn;
  36.         ypart = 3*xpartminus(i);
  37.         vhat = y - ypart;%观测和预测的差
  38.         q(i) = (1 / sqrt(R) / sqrt(2*pi)) * exp(-vhat^2 / 2 / R);
  39.     end
  40.     %正常化的可能性,每个先验估计
  41.     qsum = sum(q);
  42.     for i = 1 : N1
  43.         q(i) = q(i) / qsum;%归一化权重
  44.     end
  45.     % 重采样
  46.     for i = 1 : N1
  47.         u = rand; % 均匀随机数介于0和1
  48.         qtempsum = 0;
  49.         for j = 1 : N1
  50.             qtempsum = qtempsum + q(j);
  51.             if qtempsum >= u
  52.                 xpart(i) = xpartminus(j);
  53.                 break;
  54.             end
  55.         end
  56.    
  57.     xhatPart = mean(xpart);
  58.     xArr = [xArr x];
  59.     yArr = [yArr y];
  60.     xhatArr = [xhatArr xhat];
  61.     PArr = [PArr P];
  62.     xhatPartArr = [xhatPartArr xhatPart];
  63.     
  64.     x0=50;
  65.     xhat1 = x0;
  66.     xhatPart1 = x0;  
  67.     % 初始化粒子过滤器
  68. for i = 1 : N1
  69.     xpart1(i) = x0 + sqrt(P) * randn;
  70. end
  71. xArr1 = [x0];
  72. yArr1 = [-3*x0 + sqrt(R) * randn];
  73. xhatArr1 = [x0];
  74. xhatPartArr1 = [xhatPart1];
  75. close all;
  76.     % 系统仿真
  77.     x1 = -3* x0  + sqrt(Q) * randn;%状态方程
  78.     y1 = -3*x1+ sqrt(R) * randn;%观测方程
  79.      %  卡尔曼滤波
  80.     F1 = -3 ;
  81.     P1 = F1 * P * F1' + Q;
  82.     H1 = xhat;
  83.     K1 = P1* H1' * inv(H1 * P1 * H1' + R);
  84.     xhat1 = -3 * xhat1 ;%预测
  85.     xhat1 = xhat1 + K1 * (y1 +3*xhat1);%更新
  86.     P1 = (1 - K1 * H1) * P1;
  87.    
  88.     for i = 1 : N1
  89.         xpartminus1(i) =  -3*xpart1(i)  + sqrt(Q) * randn;
  90.         ypart1 = -3*xpartminus1(i);
  91.         vhat1 = y1 - ypart1;%观测和预测的差
  92.         vhat00=sqrt(y1.^2-ypart1.^2);
  93.         q1(i) = (1 / sqrt(R) / sqrt(2*pi)) * exp(-vhat1^2 / 2 / R);
  94.     end
  95.     %正常化的可能性,每个先验估计
  96.     qsum = sum(q1);
  97.     for i = 1 : N1
  98.         q1(i) = q1(i) / qsum;%归一化权重
  99.     end
  100.     % 重采样
  101.     for i = 1 : N1
  102.         u = rand; % 均匀随机数介于0和1
  103.         qtempsum = 0;
  104.         for j = 1 : N1
  105.             qtempsum = qtempsum + q(j);
  106.             if qtempsum >= u
  107.                 xpart1(i) = xpartminus1(j);
  108.                 break;
  109.             end
  110.         end
  111.     xhatPart1 = mean(xpart1);
  112.     xArr1 = [xArr1 x1];
  113.     yArr1 = [yArr1 y1];
  114.     xhatArr1 = [xhatArr1 xhat1];
  115.     PArr = [PArr P];
  116.     xhatPartArr1 = [xhatPartArr1 xhatPart1];
  117.     
  118. t1 = 0 : 50;t2=50:100;
  119.   
  120.     end
  121.   end
  122.  
  123. figure;
  124. plot(t1, xArr, 'b.',t2, xArr1, 'b.', t1,xhatArr,'r', t2,xhatArr1,'r',t1, xhatPartArr, 'k-',t2, xhatPartArr1, 'k-');
  125. xlabel('time step'); ylabel('state');
  126. legend('True state','KF', 'Particle filter estimate');