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

Matlab

  1. function Particle
  2. % Particle filter 
  3. y = 0; % 初始状态
  4. Q = 1; % 过程噪声协方差
  5. R = 1; % 测量噪声协方差
  6. tf = 50; % 仿真长度
  7. N = 100; % 粒子滤波器粒子数
  8. yhat = y;
  9. P = 2;
  10. yhatPart = y;
  11. % 初始化粒子过滤器
  12. for i = 1 : N
  13.     ypart(i) = y + sqrt(P) * randn;
  14. end
  15. yArr = [y];
  16. rArr = [y + sqrt(R) * randn];
  17. yhatArr = [y];
  18. PArr = [P];
  19. yhatPartArr = [yhatPart];
  20. close all;
  21. for k = 1 : tf
  22.     % 系统仿真
  23. x1=0:10:900;
  24. y1=sqrt(-(x1-450).^2+450^2)+ sqrt(Q) * randn;%状态方程
  25. x2=900:10:1800;
  26. y2=-sqrt(-(x2-1350).^2+450^2)+ sqrt(Q) * randn;%状态方程
  27. x3=1800:2500;
  28. y3=sqrt(Q) * randn;%状态方程
  29.    r = y1 + sqrt(R) * randn;%观测方程
  30.  
  31.    
  32.      %  卡尔曼滤波
  33.    x1=0:10:900;
  34.    F1=(450-x1)/sqrt(-(x1-450).^2+450^2);
  35.    P1 = F1 * P * F1' + Q;
  36.    H1 = yhat / 10;
  37.    K1 = P1 * H1' * inv(H1 * P1 * H1' + R);
  38.    yhat1 = sqrt(-(yhat-450).^2+450^2);%预测
  39.    yhat1 = yhat1 + K1 * (r - yhat);%更新
  40.    P1 = (1 - K1 * H1) * P1;
  41.    
  42.    x2=900:10:1800;
  43.    F2=(x2-1350)/sqrt(-(x2-1350).^2+450^2);
  44.    P2 = F2 * P * F2' + Q;
  45.    H2 = yhat / 10;
  46.    K2 = P2 * H2' * inv(H2 * P2 * H2' + R);
  47.    yhat2 = -sqrt(-(yhat-1350).^2+450^2);%预测
  48.    yhat2 = yhat2 + K2 * (r - yhat);%更新
  49.    P2 = (1 - K2 * H2) * P2;
  50.     
  51.    x3=1800:2500;
  52.    F3=1;
  53.    P3 = F3 * P * F3' + Q;
  54.    H3 = yhat / 10;
  55.    K3 = P3 * H3' * inv(H3 * P3 * H3' + R);
  56.    yhat3 = 0;%预测
  57.    yhat3 = yhat3 + K3 * (r - yhat);%更新
  58.    P3 = (1 - K3 * H3) * P3;
  59.  end
  60. end   
  61.     for i = 1 : N
  62.        x1=0:10:900;
  63.        y1partminus(i)=sqrt(-(ypart(i)-450).^2+450^2)+ sqrt(Q) * randn;
  64.        x2=900:10:1800;
  65.        y2partminus(i)=-sqrt(-(ypart(i)-1350).^2+450^2)+ sqrt(Q) * randn;
  66.        x3=1800:2500;
  67.        y3partminus(i)=sqrt(Q) * randn;
  68.       end
  69.         r1part = y1partminus(i);
  70.         r2part = y2partminus(i);
  71.         r3part = y3partminus(i);
  72.         
  73.         vhat1 = r - r1part;%观测和预测的差
  74.         vhat2 = r - r2part;
  75.         vhat3 = r - r3part;
  76.         vhat = mean((vhat1+vhat2+vhat3)/3)
  77.         q(i) = (1 / sqrt(R) / sqrt(2*pi)) * exp(-vhat^2 / 2 / R);
  78.     end
  79.     %正常化的可能性,每个先验估计
  80.     qsum = sum(q);
  81.     for i = 1 : N
  82.         q(i) = q(i) / qsum;%归一化权重
  83.     end
  84.     % 重采样
  85.     for i = 1 : N
  86.         u = rand; % 均匀随机数介于0和1
  87.         qtempsum = 0;
  88.         for j = 1 : N
  89.             qtempsum = qtempsum + q(j);
  90.             if qtempsum >= u
  91.                 xpart(i) = xpartminus(j);
  92.                 break;
  93.             end
  94.         end
  95.     end
  96.     yhatPart = mean(ypart);
  97.     yArr = [yArr y];
  98.     rArr = [rArr r];
  99.     yhatArr1 = [y1];yhatArr2 = [y2];yhatArr3 = [y3];
  100.     yhatArr1 = [yhatArr1 yhat1];
  101.     yhatArr2 = [yhatArr2 yhat2];
  102.     yhatArr3 = [yhatArr3 yhat3];
  103.     PArr = [PArr P];
  104.     yhatPartArr = [yhatPartArr yhatPart];
  105.    
  106.     
  107.  t = 0 : tf;
  108.     if k == 20   
  109.     end
  110. end
  111. figure;
  112. plot(t, yArr, 'b.', t,yhatArr1,'r',t,yhatArr2,'r',t,yhatArr3,'r',t, yhatPartArr, 'k-');
  113. xlabel('time step'); ylabel('state');
  114. legend('True state','KF', 'Particle filter estimate');