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

Matlab

  1. function [xhatRMS, xhatPartRMS, xhatPartRegRMS] = ParticleEx3
  2. % Particle filter example, adapted from Gordon, Salmond, and Smith paper.
  3. x = 0.1; % initial state
  4. Q = 0.001; % process noise covariance
  5. R = 1; % measurement noise covariance
  6. tf = 50; % simulation length
  7. N = 3; % number of particles in the particle filter
  8. NReg = 5 * N; % number of probability bins in the regularized particle filter
  9. xhat = x;
  10. P = 2;
  11. xhatPart = x;
  12. xhatPartReg = x;
  13. % Initialize the particle filter.
  14. for i = 1 : N
  15.     xpart(i) = x + sqrt(P) * randn; % normal particle filter
  16.     xpartReg(i) = xpart(i); % regularized particle filter
  17. end
  18. % Initialization for the regularized particle filter.
  19. d = length(x); % dimension of the state vector
  20. c = 2; % volume of unit hypersphere in d-dimensional space
  21. h = (8 * c^(-1) * (d + 4) * (2 * sqrt(pi))^d)^(1 / (d + 4)) * N^(-1 / (d + 4)); % bandwidth of regularized filter
  22. % Initialize arrays.
  23. xArr = [x];
  24. yArr = [x^2 / 20 + sqrt(R) * randn];
  25. xhatArr = [x];
  26. PArr = [P];
  27. xhatPartArr = [xhatPart];
  28. xhatPartRegArr = [xhatPartReg];
  29. close all; % close all open figures
  30. for k = 1 : tf
  31.     % System simulation
  32.     x = 0.5 * x + 25 * x / (1 + x^2) + 8 * cos(1.2*(k-1)) + sqrt(Q) * randn;
  33.     y = x^2 / 20 + sqrt(R) * randn;
  34.     % Extended Kalman filter
  35.     F = 0.5 + 25 * (1 - xhat^2) / (1 + xhat^2)^2;
  36.     P = F * P * F' + Q;
  37.     H = xhat / 10;
  38.     K = P * H' * (H * P * H' + R)^(-1);
  39.     xhat = 0.5 * xhat + 25 * xhat / (1 + xhat^2) + 8 * cos(1.2*(k-1));
  40.     xhat = xhat + K * (y - xhat^2 / 20);
  41.     P = (1 - K * H) * P;
  42.     % Particle filter
  43.     for i = 1 : N
  44.         xpartminus(i) = 0.5 * xpart(i) + 25 * xpart(i) / (1 + xpart(i)^2) + 8 * cos(1.2*(k-1)) + sqrt(Q) * randn;
  45.         ypart = xpartminus(i)^2 / 20;
  46.         vhat = y - ypart;
  47.         q(i) = (1 / sqrt(R) / sqrt(2*pi)) * exp(-vhat^2 / 2 / R);
  48.     end
  49.     % Normalize the likelihood of each a priori estimate.
  50.     qsum = sum(q);
  51.     for i = 1 : N
  52.         q(i) = q(i) / qsum;
  53.     end
  54.     % Resample.
  55.     for i = 1 : N
  56.         u = rand; % uniform random number between 0 and 1
  57.         qtempsum = 0;
  58.         for j = 1 : N
  59.             qtempsum = qtempsum + q(j);
  60.             if qtempsum >= u
  61.                 xpart(i) = xpartminus(j);
  62.                 break;
  63.             end
  64.         end
  65.     end
  66.     % The particle filter estimate is the mean of the particles.
  67.     xhatPart = mean(xpart);
  68.     % Now run the regularized particle filter.
  69.     % Perform the time update to the get the a priori regularized particles.
  70.     for i = 1 : N
  71.         xpartminusReg(i) = 0.5 * xpartReg(i) + 25 * xpartReg(i) / (1 + xpartReg(i)^2) + 8 * cos(1.2*(k-1)) + sqrt(Q) * randn;
  72.         ypart = xpartminusReg(i)^2 / 20;
  73.         vhat = y - ypart;
  74.         q(i) = (1 / sqrt(R) / sqrt(2*pi)) * exp(-vhat^2 / 2 / R);
  75.     end
  76.     % Normalize the probabilities of the a priori particles.
  77.     q = q / sum(q);
  78.     % Compute the covariance of the a priori particles.
  79.     S = cov(xpartminusReg');
  80.     A = chol(S)';
  81.     % Define the domain from which we will choose a posteriori particles for
  82.     % the regularized particle filter.
  83.     xreg(1) = min(xpartminusReg) - std(xpartminusReg);
  84.     xreg(NReg) = max(xpartminusReg) + std(xpartminusReg);
  85.     dx = (xreg(NReg) - xreg(1)) / (NReg - 1);
  86.     for i = 2 : NReg - 1
  87.         xreg(i) = xreg(i-1) + dx;
  88.     end
  89.     % Create the pdf approximation that is required for the regularized
  90.     % particle filter.
  91.     for j = 1 : NReg
  92.         qreg(j) = 0;
  93.         for i = 1 : N
  94.             normx = norm(inv(A) * (xreg(j) - xpartminusReg(i)));
  95.             if normx < h
  96.                 qreg(j) = qreg(j) + q(i) * (d + 2) * (1 - normx^2 / h^2) / 2 / c / h^d / det(A);
  97.             end
  98.         end
  99.     end
  100.     % Normalize the likelihood of each state estimate for the regularized particle filter.
  101.     qsum = sum(qreg);
  102.     for j = 1 : NReg
  103.         qreg(j) = qreg(j) / qsum;
  104.     end
  105.     % Resample for the regularized particle filter.
  106.     for i = 1 : N
  107.         u = rand; % uniform random number between 0 and 1
  108.         qtempsum = 0;
  109.         for j = 1 : NReg
  110.             qtempsum = qtempsum + qreg(j);
  111.             if qtempsum >= u
  112.                 xpartReg(i) = xreg(j);
  113.                 break;
  114.             end
  115.         end
  116.     end
  117.     % The regularized particle filter estimate is the mean of the regularized particles.
  118.     xhatPartReg = mean(xpartReg);
  119.     % Plot the discrete pdf and the continuous pdf at a specific time.
  120.     if k == 5
  121.         figure; hold on;
  122.         for i = 1 : N
  123.             plot([xpartminusReg(i) xpartminusReg(i)], [0 q(i)], 'k-');
  124.             plot(xpartminusReg(i), q(i), 'ko');
  125.         end
  126.         plot(xreg, qreg, 'r:');
  127.         set(gca,'FontSize',12); set(gcf,'Color','White'); 
  128.         set(gca,'box','on');
  129.         xlabel('state estimate'); ylabel('pdf');
  130.     end
  131.     % Save data in arrays for later plotting
  132.     xArr = [xArr x];
  133.     yArr = [yArr y];
  134.     xhatArr = [xhatArr xhat];
  135.     PArr = [PArr P];
  136.     xhatPartArr = [xhatPartArr xhatPart];
  137.     xhatPartRegArr = [xhatPartRegArr xhatPartReg];
  138. end
  139. t = 0 : tf;
  140. %figure;
  141. %plot(t, xArr);
  142. %ylabel('true state');
  143. figure;
  144. plot(t, xArr, 'b.', t, xhatArr, 'k-', t, xhatArr-2*sqrt(PArr), 'r:', t, xhatArr+2*sqrt(PArr), 'r:');
  145. axis([0 tf -40 40]);
  146. set(gca,'FontSize',12); set(gcf,'Color','White'); 
  147. xlabel('time step'); ylabel('state');
  148. legend('True state', 'EKF estimate', '95% confidence region'); 
  149. figure;
  150. plot(t, xArr, 'b.', t, xhatPartArr, 'k-', t, xhatPartRegArr, 'r:');
  151. set(gca,'FontSize',12); set(gcf,'Color','White'); 
  152. xlabel('time step'); ylabel('state');
  153. legend('True state', 'Particle filter', 'Regularized particle filter'); 
  154. xhatRMS = sqrt((norm(xArr - xhatArr))^2 / tf);
  155. xhatPartRMS = sqrt((norm(xArr - xhatPartArr))^2 / tf);
  156. xhatPartRegRMS = sqrt((norm(xArr - xhatPartRegArr))^2 / tf);
  157. disp(['Kalman filter RMS error = ', num2str(xhatRMS)]);
  158. disp(['Particle filter RMS error = ', num2str(xhatPartRMS)]);
  159. disp(['Regularized particle filter RMS error = ', num2str(xhatPartRegRMS)]);