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

Matlab

  1. x1=0:10:900;
  2. y1=sqrt(-(x1-450).^2+450^2);
  3. x2=900:10:1800;
  4. y2=-sqrt(-(x2-1350).^2+450^2);
  5. x3=1800:3000;
  6. y3=0;
  7. figure;
  8. plot(x1,y1,'k',x2,y2,'k',x3,y3,'k');
  9. x = 0; % 初始状态
  10. Q = 1; % 过程噪声协方差
  11. R = 1; % 测量噪声协方差
  12. tf = 3000; % 仿真长度
  13. N = 500; % 粒子滤波器粒子数
  14. xhat = x;
  15. P = 2;
  16. xhatPart = x;
  17. % 初始化粒子过滤器
  18. for i = 1 : N
  19.     xpart(i) = x + sqrt(P) * randn;
  20. end
  21. xArr = [x];
  22. yArr = [x + sqrt(R) * randn];
  23. xhatArr = [x];
  24. PArr = [P];
  25. xhatPartArr = [xhatPart];
  26. close all;
  27. for k = 1 : tf
  28.     % 系统仿真
  29.     t1=0:900;
  30.     x1=sqrt(-(x1-450).^2+450^2);
  31.     y = x + sqrt(R) * randn;%观测方程
  32.     %  卡尔曼滤波
  33.     F = (450-x1)/sqrt(-(x1-450).^2+450^2);
  34.     P = F * P * F' + Q;
  35.     H = xhat / 10;
  36.     K = P * H' * inv(H * P * H' + R);
  37.     xhat = sqrt(-(x1-450).^2+450^2);%预测
  38.     xhat = xhat + K * (y - xhat);%更新
  39.     P = (1 - K * H) * P;
  40.     for i = 1 : N
  41.         xpartminus(i) =sqrt(-(xpart(i)-450).^2+450^2) + sqrt(Q) * randn;
  42.         ypart = xpartminus(i);
  43.         vhat = y - ypart;%观测和预测的差
  44.         q(i) = (1 / sqrt(R) / sqrt(2*pi)) * exp(-vhat^2 / 2 / R);
  45.     end
  46.     %正常化的可能性,每个先验估计
  47.     qsum = sum(q);
  48.     for i = 1 : N
  49.         q(i) = q(i) / qsum;%归一化权重
  50.     end
  51.     % 重采样
  52.     for i = 1 : N
  53.         u = rand; % 均匀随机数介于0和1
  54.         qtempsum = 0;
  55.         for j = 1 : N
  56.             qtempsum = qtempsum + q(j);
  57.             if qtempsum >= u
  58.                 xpart(i) = xpartminus(j);
  59.                 break;
  60.             end
  61.         end
  62.     end
  63.     xhatPart1 = mean(xpart);
  64.     xArr1 = [xArr x];
  65.     yArr1 = [yArr y];
  66.     xhatArr1 = [xhatArr xhat];
  67.     PArr1 = [PArr P];
  68.     xhatPartArr1 = [xhatPartArr xhatPart];
  69.    
  70.     
  71.     t2=900:1800;
  72.     x2=-sqrt(-(x2-1350).^2+450^2);
  73.     y = x + sqrt(R) * randn;%观测方程
  74.     %  卡尔曼滤波
  75.     F = (x2-1350)/sqrt(-(x2-1350).^2+450^2);
  76.     P = F * P * F' + Q;
  77.     H = xhat / 10;
  78.     K = P * H' * inv(H * P * H' + R);
  79.     xhat = sqrt(-(x2-450).^2+450^2);%预测
  80.     xhat = xhat + K * (y - xhat);%更新
  81.     P = (1 - K * H) * P;
  82.     for i = 1 : N
  83.         xpartminus(i) =-sqrt(-(xpart(i)-1350).^2+450^2) + sqrt(Q) * randn;
  84.         ypart = xpartminus(i);
  85.         vhat = y - ypart;%观测和预测的差
  86.         q(i) = (1 / sqrt(R) / sqrt(2*pi)) * exp(-vhat^2 / 2 / R);
  87.     end
  88.     %正常化的可能性,每个先验估计
  89.     qsum = sum(q);
  90.     for i = 1 : N
  91.         q(i) = q(i) / qsum;%归一化权重
  92.     end
  93.     % 重采样
  94.     for i = 1 : N
  95.         u = rand; % 均匀随机数介于0和1
  96.         qtempsum = 0;
  97.         for j = 1 : N
  98.             qtempsum = qtempsum + q(j);
  99.             if qtempsum >= u
  100.                 xpart(i) = xpartminus(j);
  101.                 break;
  102.             end
  103.         end
  104.     end
  105.     xhatPart2 = mean(xpart);
  106.     xArr2 = [xArr x];
  107.     yArr2 = [yArr y];
  108.     xhatArr2 = [xhatArr xhat];
  109.     PArr2 = [PArr P];
  110.     xhatPartArr2 = [xhatPartArr xhatPart];
  111.     
  112.     t3=1800:3000;
  113.     x3=0;
  114.     y = x + sqrt(R) * randn;%观测方程
  115.      %  卡尔曼滤波
  116.     F = 1;
  117.     P = F * P * F' + Q;
  118.     H = xhat / 10;
  119.     K = P * H' * inv(H * P * H' + R);
  120.     xhat = x3;%预测
  121.     xhat = xhat + K * (y - xhat);%更新
  122.     P = (1 - K * H) * P;
  123.     for i = 1 : N
  124.         xpartminus(i) =xpart(i) + sqrt(Q) * randn;
  125.         ypart = xpartminus(i);
  126.         vhat = y - ypart;%观测和预测的差
  127.         q(i) = (1 / sqrt(R) / sqrt(2*pi)) * exp(-vhat^2 / 2 / R);
  128.     end
  129.     %正常化的可能性,每个先验估计
  130.     qsum = sum(q);
  131.     for i = 1 : N
  132.         q(i) = q(i) / qsum;%归一化权重
  133.     end
  134.     % 重采样
  135.     for i = 1 : N
  136.         u = rand; % 均匀随机数介于0和1
  137.         qtempsum = 0;
  138.         for j = 1 : N
  139.             qtempsum = qtempsum + q(j);
  140.             if qtempsum >= u
  141.                 xpart(i) = xpartminus(j);
  142.                 break;
  143.             end
  144.         end
  145.     end
  146.     xhatPart3 = mean(xpart);
  147.     xArr3 = [xArr x];
  148.     yArr3 = [yArr y];
  149.     xhatArr3 = [xhatArr xhat];
  150.     PArr3 = [PArr P];
  151.     xhatPartArr3 = [xhatPartArr xhatPart];
  152.     
  153.     t1 = 0 : 900;t2=900:1800;t3=1800:3000
  154.     if k == 20   
  155.     end
  156. end
  157. figure;
  158. plot(t1, xArr, 'b.',t2, xArr, 'b.',t3, xArr, 'b.');