
% 状态

% xk=A•xk-1+B•uk+wk

% zk=H•xk+vk,

% p(w) ~ N(0,Q)

% p(v) ~ N(0,R),


% 预测

% x'k=A•xk+B•uk

% P'k=A•P(k-1)*AT + Q

% 修正

% Kk=P'k•HT•(H•P'k•HT+R)-1

% xk=x'k+Kk•(zk-H•x'k)

% Pk=(I-Kk•H)•P'k

%要注意的是:必须把系统状态和kalman滤波器内部预测的状态分开

function Test

A=[1 0.1;0 1];

B=0;

Xp=rand(2,1)*0.1;

X=[0 0]';

H=[1 0];

Q=eye(2)*1e-5;

R=eye(1)*0.1;

P=eye(2);% P'(k)

angle=[];

angle_m=[];

angle_real=[];

for i=1:500

angle_real=[angle_real X(1)]; %实际角度

[Xp,P]=Predict(A,Xp,P,Q);

X=A*X+rand(2,1)*1e-5;

z_m=H*X+rand(1,1)*0.1-0.05;

angle_m=[angle_m z_m(1)]; %测量的角度

[Xp,P]=Correct(P,H,R,X,z_m);

angle=[angle Xp(1)]; %预测的角度

end

t=1:500;

plot(t,angle,'r',t,angle_m,'g',t,angle_real,'b')

legend('预测值','测量值','实际值')


figure

plot(t,angle-angle_real,'r',t,angle_m-angle_real,'g')

legend('滤波后的误差','测量的误差')

title('误差分析')

xlabel('time');

ylabel('error');


function [Xk,Pk]=Predict(A,Xk,Pk_1,Q)

Xk=A*Xk;

Pk=A*Pk_1*A'+Q;


function [Xk,Pk]=Correct(Pk,H,R,Xk,zk)

Kk=Pk * H' * inv(H * Pk * H' + R);

Xk=Xk+ Kk*(zk-H*Xk);

Pk=(eye(size(Pk,1)) - Kk*H)*Pk;
