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

Matlab

  1. function [StdRMSErr, AuxRMSErr] = ParticleEx4
  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. % Compare the particle filter with the auxiliary particle filter.
  6. global rho0 g k dt
  7. rho0 = 2; % lb-sec^2/ft^4
  8. g = 32.2; % ft/sec^2
  9. k = 2e4; % ft
  10. R = 10^4; % measurement noise variance (ft^2)
  11. Q = diag([0 0 0]); % process noise covariance
  12. M = 10^5; % horizontal range of position sensor
  13. a = 10^5; % altitude of position sensor
  14. P = diag([1e6 4e6 10]); % initial estimation error covariance
  15. x = [3e5; -2e4; 1e-3]; % initial state
  16. xhat = [3e5; -2e4; 1e-3]; % initial state estimate
  17. N = 200; % number of particles  
  18. % Initialize the particle filter.
  19. for i = 1 : N
  20.     xhatplus(:,i) = x + sqrt(P) * [randn; randn; randn]; % standard particle filter
  21.     xhatplusAux(:,i) = xhatplus(:,i); % auxiliary particle filter
  22. end
  23. T = 0.5; % measurement time step
  24. randn('state',sum(100*clock)); % random number generator seed
  25. tf = 30; % simulation length (seconds)
  26. dt = 0.5; % time step for integration (seconds)
  27. xArray = x;
  28. xhatArray = xhat;
  29. xhatAuxArray = xhat;
  30. for t = T : T : tf
  31.     fprintf('.');
  32.     % Simulate the system.
  33.     for tau = dt : dt : T
  34.         % Fourth order Runge Kutta ingegration
  35.         [dx1, dx2, dx3, dx4] = RungeKutta(x);
  36.         x = x + (dx1 + 2 * dx2 + 2 * dx3 + dx4) / 6;
  37.         x = x + sqrt(dt * Q) * [randn; randn; randn] * dt;
  38.     end
  39.     % Simulate the noisy measurement.
  40.     z = sqrt(M^2 + (x(1)-a)^2) + sqrt(R) * randn;
  41.     % Simulate the continuous-time part of the particle filter (time update).
  42.     xhatminus = xhatplus;
  43.     xhatminusAux = xhatplusAux;
  44.     for i = 1 : N
  45.         for tau = dt : dt : T
  46.             % Fourth order Runge Kutta ingegration
  47.             % standard particle filter
  48.             [dx1, dx2, dx3, dx4] = RungeKutta(xhatminus(:,i));
  49.             xhatminus(:,i) = xhatminus(:,i) + (dx1 + 2 * dx2 + 2 * dx3 + dx4) / 6;
  50.             xhatminus(:,i) = xhatminus(:,i) + sqrt(dt * Q) * [randn; randn; randn] * dt;
  51.             xhatminus(3,i) = max(0, xhatminus(3,i)); % the ballistic coefficient cannot be negative
  52.             % auxiliary particle filter
  53.             [dx1, dx2, dx3, dx4] = RungeKutta(xhatminusAux(:,i));
  54.             xhatminusAux(:,i) = xhatminusAux(:,i) + (dx1 + 2 * dx2 + 2 * dx3 + dx4) / 6;
  55.             xhatminusAux(:,i) = xhatminusAux(:,i) + sqrt(dt * Q) * [randn; randn; randn] * dt;
  56.             xhatminusAux(3,i) = max(0, xhatminusAux(3,i)); % the ballistic coefficient cannot be negative
  57.         end
  58.         zhat = sqrt(M^2 + (xhatminus(1,i)-a)^2);
  59.         vhat(i) = z - zhat;
  60.         zhatAux = sqrt(M^2 + (xhatminusAux(1,i)-a)^2);
  61.         vhatAux(i) = z - zhatAux;
  62.     end
  63.     % Note that we need to scale all of the q(i) probabilities in a way
  64.     % that does not change their relative magnitudes.
  65.     % Otherwise all of the q(i) elements will be zero because of the
  66.     % large value of the exponential.
  67.     % standard particle filter
  68.     vhatscale = max(abs(vhat)) / 4;
  69.     qsum = 0;
  70.     for i = 1 : N
  71.         q(i) = exp(-(vhat(i)/vhatscale)^2);
  72.         qsum = qsum + q(i);
  73.     end
  74.     % Normalize the likelihood of each a priori estimate.
  75.     for i = 1 : N
  76.         q(i) = q(i) / qsum;
  77.     end
  78.     % auxiliary particle filter
  79.     vhatscaleAux = max(abs(vhatAux)) / 4;
  80.     qsumAux = 0;
  81.     for i = 1 : N
  82.         qAux(i) = exp(-(vhatAux(i)/vhatscaleAux)^2);
  83.         qsumAux = qsumAux + qAux(i);
  84.     end
  85.     % Regularize the probabilities - this is conceptually identical to the
  86.     % auxiliary particle filter - increase low probabilities and decrease
  87.     % high probabilities.
  88.     % Large k means low regularization (k = infinity is identical to the
  89.     % standard particle filter). Small k means high regularization (k = 1
  90.     % means that all probabilities are equal). 
  91.     kAux = 1.1; 
  92.     qAux = ((kAux - 1) * qAux + mean(qAux)) / kAux;
  93.     % Normalize the likelihood of each a priori estimate.
  94.     for i = 1 : N
  95.         qAux(i) = qAux(i) / qsumAux;
  96.     end
  97.     % Resample the standard particle filter
  98.     for i = 1 : N
  99.         u = rand; % uniform random number between 0 and 1
  100.         qtempsum = 0;
  101.         for j = 1 : N
  102.             qtempsum = qtempsum + q(j);
  103.             if qtempsum >= u
  104.                 xhatplus(:,i) = xhatminus(:,j);
  105.                 xhatplus(3,i) = max(0,xhatplus(3,i)); % the ballistic coefficient cannot be negative
  106.                 break;
  107.             end
  108.         end
  109.     end
  110.     % The standard particle filter estimate is the mean of the particles.
  111.     xhat = mean(xhatplus')';
  112.     % Resample the auxiliary particle filter
  113.     for i = 1 : N
  114.         u = rand; % uniform random number between 0 and 1
  115.         qtempsum = 0;
  116.         for j = 1 : N
  117.             qtempsum = qtempsum + qAux(j);
  118.             if qtempsum >= u
  119.                 xhatplusAux(:,i) = xhatminusAux(:,j);
  120.                 xhatplusAux(3,i) = max(0,xhatplusAux(3,i)); % the ballistic coefficient cannot be negative
  121.                 break;
  122.             end
  123.         end
  124.     end
  125.     % The auxiliary particle filter estimate is the mean of the particles.
  126.     xhatAux = mean(xhatplusAux')';
  127.     % Save data for plotting.
  128.     xArray = [xArray x];
  129.     xhatArray = [xhatArray xhat];
  130.     xhatAuxArray = [xhatAuxArray xhatAux];
  131. end
  132. close all;
  133. t = 0 : T : tf;
  134. figure; 
  135. semilogy(t, abs(xArray(1,:) - xhatArray(1,:)), 'b-'); hold;
  136. semilogy(t, abs(xArray(1,:) - xhatAuxArray(1,:)), 'r:'); 
  137. set(gca,'FontSize',12); set(gcf,'Color','White');
  138. xlabel('Seconds');
  139. ylabel('Altitude Estimation Error');
  140. legend('Standard particle filter', 'Auxiliary particle filter');
  141. figure; 
  142. semilogy(t, abs(xArray(2,:) - xhatArray(2,:)), 'b-'); hold;
  143. semilogy(t, abs(xArray(2,:) - xhatAuxArray(2,:)), 'r:');
  144. set(gca,'FontSize',12); set(gcf,'Color','White');
  145. xlabel('Seconds');
  146. ylabel('Velocity Estimation Error');
  147. legend('Standard particle filter', 'Auxiliary particle filter');
  148. figure; 
  149. semilogy(t, abs(xArray(3,:) - xhatArray(3,:)), 'b-'); hold;
  150. semilogy(t, abs(xArray(3,:) - xhatAuxArray(3,:)), 'r:'); 
  151. set(gca,'FontSize',12); set(gcf,'Color','White');
  152. xlabel('Seconds');
  153. ylabel('Ballistic Coefficient Estimation Error');
  154. legend('Standard particle filter', 'Auxiliary particle filter');
  155. figure;
  156. plot(t, xArray(1,:));
  157. set(gca,'FontSize',12); set(gcf,'Color','White');
  158. xlabel('Seconds');
  159. ylabel('True Position');
  160. figure;
  161. plot(t, xArray(2,:));
  162. title('Falling Body Simulation', 'FontSize', 12);
  163. set(gca,'FontSize',12); set(gcf,'Color','White');
  164. xlabel('Seconds');
  165. ylabel('True Velocity');
  166. for i = 1 : 3
  167.     StdRMSErr(i) = sqrt((norm(xArray(i,:) - xhatArray(i,:)))^2 / tf / dt);
  168.     AuxRMSErr(i) = sqrt((norm(xArray(i,:) - xhatAuxArray(i,:)))^2 / tf / dt);
  169. end
  170. disp(['Standard particle filter RMS error = ', num2str(StdRMSErr)]);
  171. disp(['Auxiliary particle filter RMS error = ', num2str(AuxRMSErr)]);
  172. function [dx1, dx2, dx3, dx4] = RungeKutta(x)
  173. % Fourth order Runge Kutta integration for the falling body system.
  174. global rho0 g k dt
  175. dx1(1,1) = x(2);
  176. dx1(2,1) = rho0 * exp(-x(1)/k) * x(2)^2 / 2 * x(3) - g;
  177. dx1(3,1) = 0;
  178. dx1 = dx1 * dt;
  179. xtemp = x + dx1 / 2;
  180. dx2(1,1) = xtemp(2);
  181. dx2(2,1) = rho0 * exp(-xtemp(1)/k) * xtemp(2)^2 / 2 * xtemp(3) - g;
  182. dx2(3,1) = 0;
  183. dx2 = dx2 * dt;
  184. xtemp = x + dx2 / 2;
  185. dx3(1,1) = xtemp(2);
  186. dx3(2,1) = rho0 * exp(-xtemp(1)/k) * xtemp(2)^2 / 2 * xtemp(3) - g;
  187. dx3(3,1) = 0;
  188. dx3 = dx3 * dt;
  189. xtemp = x + dx3;
  190. dx4(1,1) = xtemp(2);
  191. dx4(2,1) = rho0 * exp(-xtemp(1)/k) * xtemp(2)^2 / 2 * xtemp(3) - g;
  192. dx4(3,1) = 0;
  193. dx4 = dx4 * dt;
  194. return;