www.gusucode.com > 基于机动目标跟踪课题的整个算法matlab程序 > ex/Ex1111.m

    function Particle

% Particle filter 

y = 0; % 初始状态
Q = 1; % 过程噪声协方差
R = 1; % 测量噪声协方差
tf = 50; % 仿真长度

N = 100; % 粒子滤波器粒子数

yhat = y;
P = 2;
yhatPart = y;

% 初始化粒子过滤器
for i = 1 : N
    ypart(i) = y + sqrt(P) * randn;
end

yArr = [y];
rArr = [y + sqrt(R) * randn];
yhatArr = [y];
PArr = [P];
yhatPartArr = [yhatPart];

close all;

for k = 1 : tf
    % 系统仿真
x1=0:10:900;
y1=sqrt(-(x1-450).^2+450^2)+ sqrt(Q) * randn;%状态方程
x2=900:10:1800;
y2=-sqrt(-(x2-1350).^2+450^2)+ sqrt(Q) * randn;%状态方程
x3=1800:2500;
y3=sqrt(Q) * randn;%状态方程
   r = y1 + sqrt(R) * randn;%观测方程
 
   
     %  卡尔曼滤波
   x1=0:10:900;
   F1=(450-x1)/sqrt(-(x1-450).^2+450^2);
   P1 = F1 * P * F1' + Q;
   H1 = yhat / 10;
   K1 = P1 * H1' * inv(H1 * P1 * H1' + R);
   yhat1 = sqrt(-(yhat-450).^2+450^2);%预测
   yhat1 = yhat1 + K1 * (r - yhat);%更新
   P1 = (1 - K1 * H1) * P1;
   
   x2=900:10:1800;
   F2=(x2-1350)/sqrt(-(x2-1350).^2+450^2);
   P2 = F2 * P * F2' + Q;
   H2 = yhat / 10;
   K2 = P2 * H2' * inv(H2 * P2 * H2' + R);
   yhat2 = -sqrt(-(yhat-1350).^2+450^2);%预测
   yhat2 = yhat2 + K2 * (r - yhat);%更新
   P2 = (1 - K2 * H2) * P2;
    
   x3=1800:2500;
   F3=1;
   P3 = F3 * P * F3' + Q;
   H3 = yhat / 10;
   K3 = P3 * H3' * inv(H3 * P3 * H3' + R);
   yhat3 = 0;%预测
   yhat3 = yhat3 + K3 * (r - yhat);%更新
   P3 = (1 - K3 * H3) * P3;
 end
end   
    for i = 1 : N
       x1=0:10:900;
       y1partminus(i)=sqrt(-(ypart(i)-450).^2+450^2)+ sqrt(Q) * randn;
       x2=900:10:1800;
       y2partminus(i)=-sqrt(-(ypart(i)-1350).^2+450^2)+ sqrt(Q) * randn;
       x3=1800:2500;
       y3partminus(i)=sqrt(Q) * randn;
      end
        r1part = y1partminus(i);
        r2part = y2partminus(i);
        r3part = y3partminus(i);
        
        vhat1 = r - r1part;%观测和预测的差
        vhat2 = r - r2part;
        vhat3 = r - r3part;
        vhat = mean((vhat1+vhat2+vhat3)/3)
        q(i) = (1 / sqrt(R) / sqrt(2*pi)) * exp(-vhat^2 / 2 / R);
    end
    %正常化的可能性,每个先验估计
    qsum = sum(q);
    for i = 1 : N
        q(i) = q(i) / qsum;%归一化权重
    end
    % 重采样
    for i = 1 : N
        u = rand; % 均匀随机数介于0和1
        qtempsum = 0;
        for j = 1 : N
            qtempsum = qtempsum + q(j);
            if qtempsum >= u
                xpart(i) = xpartminus(j);
                break;
            end
        end
    end
    yhatPart = mean(ypart);
    yArr = [yArr y];
    rArr = [rArr r];
    yhatArr1 = [y1];yhatArr2 = [y2];yhatArr3 = [y3];
    yhatArr1 = [yhatArr1 yhat1];
    yhatArr2 = [yhatArr2 yhat2];
    yhatArr3 = [yhatArr3 yhat3];
    PArr = [PArr P];
    yhatPartArr = [yhatPartArr yhatPart];
   
    
 t = 0 : tf;
    if k == 20   
    end
end

figure;
plot(t, yArr, 'b.', t,yhatArr1,'r',t,yhatArr2,'r',t,yhatArr3,'r',t, yhatPartArr, 'k-');
xlabel('time step'); ylabel('state');
legend('True state','KF', 'Particle filter estimate');