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

Matlab

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