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

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