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

Matlab

  1. function particle
  2. x = 0.1; % 初始状态
  3. Q = 1; % 过程噪声协方差
  4. R = 1; % 测量噪声协方差
  5. tf = 50; % 仿真长度
  6. N = 100; % 粒子滤波器粒子数
  7. xhat = x;
  8. P = 2;
  9. xhatPart = x;
  10. % 初始化粒子过滤器
  11. for i = 1 : N
  12.     xpart(i) = x + sqrt(P) * randn;
  13. end
  14. xArr = [x];
  15. yArr = [x^2 + sqrt(R) * randn];
  16. xhatArr = [x];
  17. PArr = [P];
  18. xhatPartArr = [xhatPart];
  19. close all;
  20. for k = 1 : tf
  21.     % 系统仿真
  22.     x = sqrt(40^2-(x-40)^2) + sqrt(Q) * randn;%状态方程
  23.     y = x^2  + sqrt(R) * randn;%观测方程
  24.      %  卡尔曼滤波
  25.     F = (40-xhat)/sqrt(40^2-(xhat-40)^2);
  26.     P = F * P * F' + Q;
  27.     H = xhat / 10;
  28.     K = P * H' * inv(H * P * H' + R);
  29.     xhat = sqrt(40^2-(xhat-40)^2);%预测
  30.     xhat = xhat + K * (y - xhat^2 );%更新
  31.     P = (1 - K * H) * P;
  32.     for i = 1 : N
  33.         xpartminus(i) = sqrt(40^2-(xpart(i)-40)^2) + sqrt(Q) * randn;
  34.         ypart = xpartminus(i)^2 ;
  35.         vhat = y - ypart;%观测和预测的差
  36.         q(i) = (1 / sqrt(R) / sqrt(2*pi)) * exp(-vhat^2 / 2 / R);
  37.     end
  38.     
  39.     %正常化的可能性,每个先验估计
  40.     qsum = sum(q);
  41.     for i = 1 : N
  42.         q(i) = q(i) / qsum;%归一化权重
  43.     end
  44.     % 重采样
  45.     for i = 1 : N
  46.         u = rand; % 均匀随机数介于0和1
  47.         qtempsum = 0;
  48.         for j = 1 : N
  49.             qtempsum = qtempsum + q(j);
  50.             if qtempsum >= u
  51.                 xpart(i) = xpartminus(j);
  52.                 break;
  53.             end
  54.         end
  55.     end
  56.     xhatPart = mean(xpart);
  57.     xArr = [xArr x];
  58.     yArr = [yArr y];
  59.     xhatArr = [xhatArr xhat];
  60.     PArr = [PArr P];
  61.     xhatPartArr = [xhatPartArr xhatPart];
  62.     
  63. t = 0 : tf;
  64.     if k == 20   
  65.     end
  66. end
  67. figure;
  68. plot(t, xArr, 'b.', t,xhatArr,'r',t, xhatPartArr, 'k-');
  69. xlabel('time step'); ylabel('state');
  70. legend('True state','KF', 'Particle filter estimate');