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

Matlab

  1. function [xArray, xhatArray] = ParticleEx2
  2. % Particle filter example.
  3. % Track a body falling through the atmosphere.
  4. % This system is taken from [Jul00], which was based on [Ath68].
  5. rho0 = 2; % lb-sec^2/ft^4
  6. g = 32.2; % ft/sec^2
  7. k = 2e4; % ft
  8. R = 10^4; % measurement noise variance (ft^2)
  9. Q = diag([0 0 0]); % process noise covariance
  10. M = 10^5; % horizontal range of position sensor
  11. a = 10^5; % altitude of position sensor
  12. P = diag([1e6 4e6 10]); % initial estimation error covariance
  13. x = [3e5; -2e4; 1e-3]; % initial state
  14. xhat = [3e5; -2e4; 1e-3]; % initial state estimate
  15. N = 100; % number of particles  
  16. % Initialize the particle filter.
  17. for i = 1 : N
  18.     xhatplus(:,i) = x + sqrt(P) * [randn; randn; randn];
  19. end
  20. T = 0.5; % measurement time step
  21. randn('state',sum(100*clock)); % random number generator seed
  22. tf = 30; % simulation length (seconds)
  23. dt = 0.04; % time step for integration (seconds)
  24. xArray = x;
  25. xhatArray = xhat;
  26. for t = T : T : tf
  27.     fprintf('.');
  28.     % Simulate the system.
  29.     for tau = dt : dt : T
  30.         % Fourth order Runge Kutta ingegration
  31.         dx1(1,1) = x(2);
  32.         dx1(2,1) = rho0 * exp(-x(1)/k) * x(2)^2 / 2 * x(3) - g;
  33.         dx1(3,1) = 0;
  34.         dx1 = dx1 * dt;
  35.         xtemp = x + dx1 / 2;
  36.         dx2(1,1) = xtemp(2);
  37.         dx2(2,1) = rho0 * exp(-xtemp(1)/k) * xtemp(2)^2 / 2 * xtemp(3) - g;
  38.         dx2(3,1) = 0;
  39.         dx2 = dx2 * dt;
  40.         xtemp = x + dx2 / 2;
  41.         dx3(1,1) = xtemp(2);
  42.         dx3(2,1) = rho0 * exp(-xtemp(1)/k) * xtemp(2)^2 / 2 * xtemp(3) - g;
  43.         dx3(3,1) = 0;
  44.         dx3 = dx3 * dt;
  45.         xtemp = x + dx3;
  46.         dx4(1,1) = xtemp(2);
  47.         dx4(2,1) = rho0 * exp(-xtemp(1)/k) * xtemp(2)^2 / 2 * xtemp(3) - g;
  48.         dx4(3,1) = 0;
  49.         dx4 = dx4 * dt;
  50.         x = x + (dx1 + 2 * dx2 + 2 * dx3 + dx4) / 6;
  51.         x = x + sqrt(dt * Q) * [randn; randn; randn] * dt;
  52.     end
  53.     % Simulate the noisy measurement.
  54.     z = sqrt(M^2 + (x(1)-a)^2) + sqrt(R) * randn;
  55.     % Simulate the continuous-time part of the particle filter (time update).
  56.     xhatminus = xhatplus;
  57.     for i = 1 : N
  58.         for tau = dt : dt : T
  59.             % Fourth order Runge Kutta ingegration
  60.             xtemp = xhatminus(:,i);
  61.             dx1(1,1) = xtemp(2);
  62.             dx1(2,1) = rho0 * exp(-xtemp(1)/k) * xtemp(2)^2 / 2 * xtemp(3) - g;
  63.             dx1(3,1) = 0;
  64.             dx1 = dx1 * dt;
  65.             xtemp = xhatminus(:,i) + dx1 / 2;
  66.             dx2(1,1) = xtemp(2);
  67.             dx2(2,1) = rho0 * exp(-xtemp(1)/k) * xtemp(2)^2 / 2 * xtemp(3) - g;
  68.             dx2(3,1) = 0;
  69.             dx2 = dx2 * dt;
  70.             xtemp = xhatminus(:,i) + dx2 / 2;
  71.             dx3(1,1) = xtemp(2);
  72.             dx3(2,1) = rho0 * exp(-xtemp(1)/k) * xtemp(2)^2 / 2 * xtemp(3) - g;
  73.             dx3(3,1) = 0;
  74.             dx3 = dx3 * dt;
  75.             xtemp = xhatminus(:,i) + dx3;
  76.             dx4(1,1) = xtemp(2);
  77.             dx4(2,1) = rho0 * exp(-xtemp(1)/k) * xtemp(2)^2 / 2 * xtemp(3) - g;
  78.             dx4(3,1) = 0;
  79.             dx4 = dx4 * dt;
  80.             xhatminus(:,i) = xhatminus(:,i) + (dx1 + 2 * dx2 + 2 * dx3 + dx4) / 6;
  81.             xhatminus(:,i) = xhatminus(:,i) + sqrt(dt * Q) * [randn; randn; randn] * dt;
  82.             xhatminus(3,i) = max(0, xhatminus(3,i)); % the ballistic coefficient cannot be negative
  83.         end
  84.         zhat = sqrt(M^2 + (xhatminus(1,i)-a)^2);
  85.         vhat(i) = z - zhat;
  86.     end
  87.     % Note that we need to scale all of the q(i) probabilities in a way
  88.     % that does not change their relative magnitudes.
  89.     % Otherwise all of the q(i) elements will be zero because of the
  90.     % large value of the exponential.
  91.     vhatscale = max(abs(vhat)) / 4;
  92.     qsum = 0;
  93.     for i = 1 : N
  94.         q(i) = exp(-(vhat(i)/vhatscale)^2);
  95.         qsum = qsum + q(i);
  96.     end
  97.     % Normalize the likelihood of each a priori estimate.
  98.     for i = 1 : N
  99.         q(i) = q(i) / qsum;
  100.     end
  101.     % Resample.
  102.     for i = 1 : N
  103.         u = rand; % uniform random number between 0 and 1
  104.         qtempsum = 0;
  105.         for j = 1 : N
  106.             qtempsum = qtempsum + q(j);
  107.             if qtempsum >= u
  108.                 xhatplus(:,i) = xhatminus(:,j);
  109.                 % Use roughening to prevent sample impoverishment.
  110.                 E = max(xhatminus')' - min(xhatminus')';
  111.                 sigma = 0.2 * E * N^(-1/length(x));
  112.                 xhatplus(:,i) = xhatplus(:,i) + sigma .* [randn; randn; randn];
  113.                 xhatplus(3,i) = max(0,xhatplus(3,i)); % the ballistic coefficient cannot be negative
  114.                 break;
  115.             end
  116.         end
  117.     end
  118.     % The particle filter estimate is the mean of the particles.
  119.     xhat = 0;
  120.     for i = 1 : N
  121.         xhat = xhat + xhatplus(:,i);
  122.     end
  123.     xhat = xhat / N;
  124.     % Save data for plotting.
  125.     xArray = [xArray x];
  126.     xhatArray = [xhatArray xhat];
  127. end
  128. close all;
  129. t = 0 : T : tf;
  130. figure; 
  131. semilogy(t, abs(xArray(1,:) - xhatArray(1,:)), 'b'); hold;
  132. set(gca,'FontSize',12); set(gcf,'Color','White');
  133. xlabel('Seconds');
  134. ylabel('Altitude Estimation Error');
  135. figure; 
  136. semilogy(t, abs(xArray(2,:) - xhatArray(2,:)), 'b'); hold;
  137. set(gca,'FontSize',12); set(gcf,'Color','White');
  138. xlabel('Seconds');
  139. ylabel('Velocity Estimation Error');
  140. figure; 
  141. semilogy(t, abs(xArray(3,:) - xhatArray(3,:)), 'b'); hold;
  142. set(gca,'FontSize',12); set(gcf,'Color','White');
  143. xlabel('Seconds');
  144. ylabel('Ballistic Coefficient Estimation Error');
  145. figure;
  146. plot(t, xArray(1,:));
  147. set(gca,'FontSize',12); set(gcf,'Color','White');
  148. xlabel('Seconds');
  149. ylabel('True Position');
  150. figure;
  151. plot(t, xArray(2,:));
  152. title('Falling Body Simulation', 'FontSize', 12);
  153. set(gca,'FontSize',12); set(gcf,'Color','White');
  154. xlabel('Seconds');
  155. ylabel('True Velocity');