Ex321000.asv
上传用户: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 = [-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^2 + sqrt(Q) * randn;%状态方程
  25.     y = -x^2 + sqrt(R) * randn;%观测方程
  26.      %  卡尔曼滤波
  27.     F = -2*x ;
  28.     P = F * P * F' + Q;
  29.     H = -x^2 ;
  30.     K = P * H' * inv(H * P * H' + R);
  31.     xhat = sqrt(20^2-(xhat-20).^2);%预测
  32.     xhat = xhat + K * (y + xhat^2);%更新
  33.     P = (1 - K * H) * P;
  34.    
  35.     for i = 1 : tf1
  36.         xpartminus(i) = sqrt(20^2-(xpart(i)-20).^2) + sqrt(Q) * randn;
  37.         ypart = -xpartminus(i)^2;
  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=40;
  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 = [3*x0 + sqrt(R) * randn];
  74. xhatArr1 = [x0];
  75. xhatPartArr1 = [xhatPart1];
  76. close all;
  77.     % 系统仿真
  78.     x1 =  3*x0 -20 + sqrt(Q) * randn;%状态方程
  79.     y1 = 3*x1+ sqrt(R) * randn;%观测方程
  80.      %  卡尔曼滤波
  81.     F1 = 3 ;
  82.     P1 = F1 * P * F1' + Q;
  83.     H1 = 3*xhat1;
  84.     K1 = P1* H1' * inv(H1 * P1 * H1' + R);
  85.     xhat1 =  3*xhat1-20 ;%预测
  86.     xhat1 = xhat1 + K1 * (y1 - 3*xhat1);%更新
  87.     P1 = (1 - K1 * H1) * P1;
  88.    
  89.     for i = 1 : N
  90.         xpartminus1(i) =  3*xpart1(i) -20 + 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, 'k-',t2,xhatPartArr1, 'k-');
  124. xlabel('time step'); ylabel('state');
  125. legend('True state','True state', 'KF', 'KF', 'Particle filter estimate');
  126.  
  127. figure;
  128. xhatRMS = sqrt((xArr - xhatArr).^2 / tf1);
  129. xhatRMS1 = sqrt((xArr1 - xhatArr1).^2 / (tf-tf1));
  130. subplot(2,1,1),plot(t1,xhatRMS);
  131. title('正弦运动误差值');xlabel('时间'),ylabel('误差标准值(米)');
  132. subplot(2,1,2),plot(t2,xhatRMS1);
  133. title('直线运动误差值');xlabel('时间'),ylabel('误差标准值(米)');
  134. figure;
  135. xhatPartRMS= sqrt((xArr - xhatPartArr).^2 / tf1);
  136. xhatPartRMS1 = sqrt((xArr1 - xhatPartArr1).^2 / (tf-tf1));
  137. subplot(2,1,1),plot(t1,xhatPartRMS);
  138. title('正弦运动误差值');xlabel('时间'),ylabel('误差标准值(米)');
  139. subplot(2,1,2),plot(t2,xhatPartRMS1);
  140. title('直线运动误差值');xlabel('时间'),ylabel('误差标准值(米)');