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

Matlab

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