1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
| clc;close all;clear all;
simTime=100; T=1;
d = 3;
w2=3*2*pi/360; w3=-3*2*pi/360; H=[1,0,0,0;0,0,1,0]; G=[T^2/2,0;T,0;0,T^2/2;0,T]; r=100; R=[r,0;0,r]; Q=G*[10,0;0,10]*G'; %模型过程噪声协方差矩阵
F(:,:,1)=[1,T,0,0;0,1,0,0;0,0,1,T;0,0,0,1]; %模型1状态转移矩阵
F(:,:,2)=[1,sin(w2*T)/w2,0,(cos(w2*T)-1)/w2; 0,cos(w2*T),0,sin(w2*T); 0,(1-cos(w2*T))/w2,1,sin(w2*T)/w2; 0,-sin(w2*T),0,cos(w2*T)]; %模型2状态转移矩阵 左转弯
F(:,:,3)=[1,sin(w3*T)/w3,0,(cos(w3*T)-1)/w3; 0,cos(w3*T),0,sin(w3*T); 0,(1-cos(w3*T))/w3,1,sin(w3*T)/w3; 0,-sin(w3*T),0,cos(w3*T)]; %模型3状态转移矩阵 右转弯
x = zeros(4,simTime); z_k = zeros(2,simTime); %含噪声量测数据 measureNoise = zeros(2,simTime); measureNoise = sqrt(R)*randn(2,simTime); %产生量测噪声 x(:,1)=[1000,200,1000,200]'; z_k(:,1)=H*x(:,1)+measureNoise(:,1); for a=2:simTime if (a>=20)&&(a<=40) x(:,a)=F(:,:,2)*x(:,a-1); elseif (a>=60)&&(a<=80) x(:,a)=F(:,:,3)*x(:,a-1); else x(:,a)=F(:,:,1)*x(:,a-1); end z_k(:,a)=H*x(:,a)+measureNoise(:,a); end
xkki(:,1) = x(:,1); xkki(:,2) = x(:,1); xkki(:,3) = x(:,1);
xkk = zeros(4,simTime); pkk=zeros(4,4,simTime); pkki(:,:,1)=zeros(4,4); pkki(:,:,2)=zeros(4,4); pkki(:,:,3)=zeros(4,4);
xkk(:,1)=x(:,1);
Sigmaji=[0.9,0.05,0.05; 0.1,0.8,0.1; 0.05,0.15,0.8];
ukk=zeros(3,simTime); ukk(:,1)=[0.3 0.3 0.4]'; %IMM算法模型概率
for t=1:simTime-1 %第一步Interacting(只针对IMM算法) ukk_1=Sigmaji'*ukk(:,t); for i = 1:d uji(:,i)=(1/ukk_1(i))*Sigmaji(:,i).*ukk(:,t); end
for i = 1:d x0(:,i) = xkki * uji(:,i); end for i = 1:d temp = zeros(4,4); for k = 1:d temp = temp + pkki(:,:,k)+(xkki(:,i)-x0(:,i))*(xkki(:,i)-x0(:,i))'*uji(k,i); end P0(:,:,i) = temp; end % kalman滤波并且计算似然函数值 for i = 1:d [xkki(:,i),pkki(:,:,i),xkk_1,pkk_1] = Kalman(z_k(:,t),x0(:,i),F(:,:,i),H,P0(:,:,i),Q,R); lambda(i) = (1/sqrt(abs(2*pi*(det(H*pkk_1*H'+R)))))*exp((-1/2)*((z_k(:,t)-H*xkk_1)'*inv(H*pkk_1*H'+R)*(z_k(:,t)-H*xkk_1))); end lambda = lambda/sum(lambda);
for i = 1:d ukk(i,t+1) = lambda(i) * ukk_1(i)./lambda*ukk_1; end ukk(:,t+1) = ukk(:,t+1)/sum(ukk(:,t+1));
xkk(:,t+1) = xkki * ukk(:,t+1); end
figure hold on grid on plot(x(1,:),x(3,:)); plot(xkk(1,:),xkk(3,:)); plot(z_k(1,:),z_k(2,:)); xlabel('x axis(m)'); ylabel('y axis(m)'); legend('真实值','预测值','测量值');
figure hold on grid on plot(ukk(1,:),'k:','linewidth',2); plot(ukk(2,:),'r-.','linewidth',2); plot(ukk(3,:),'b--','linewidth',2); title('IMM模型概率曲线'); xlabel('次数序号(s)'); ylabel('模型概率'); legend('模型1','模型2','模型3');
function [x_est,P_k_k,x_pre,P] = Kalman(z_k,x_est_k_minus1,F,H,P_k,Q,R) x_pre = F*x_est_k_minus1; P = F*P_k*F' + Q; z_pre = H*x_pre; S = H*P*H' + R; K = P*H'/(S); x_est = x_pre + K*(z_k - z_pre); P_k_k = (eye(size(K*H,1))-K*H)*P; end
|