首先是测试了从网上down的一段代码
终于成功仿了一次Kalman滤波器_html% KALMANF - updates a system state vector estimate based upon an
终于成功仿了一次Kalman滤波器_html
% observation, using a discrete Kalman filter.
终于成功仿了一次Kalman滤波器_html
%
终于成功仿了一次Kalman滤波器_html
% Version 1.0, June 302004
终于成功仿了一次Kalman滤波器_html
%
终于成功仿了一次Kalman滤波器_html
% This tutorial function was written by Michael C. Kleder
终于成功仿了一次Kalman滤波器_html
% (Comments are appreciated at: public@kleder.com)
终于成功仿了一次Kalman滤波器_html
%
终于成功仿了一次Kalman滤波器_html
% INTRODUCTION
终于成功仿了一次Kalman滤波器_html
%
终于成功仿了一次Kalman滤波器_html
% Many people have heard of Kalman filtering, but regard the topic
终于成功仿了一次Kalman滤波器_html
% as mysterious. While it's true that deriving the Kalman filter and
终于成功仿了一次Kalman滤波器_html
% proving mathematically that it is "optimal" under a variety of
终于成功仿了一次Kalman滤波器_html
% circumstances can be rather intense, applying the filter to
终于成功仿了一次Kalman滤波器_html
% a basic linear system is actually very easy. This Matlab file is
终于成功仿了一次Kalman滤波器_html
% intended to demonstrate that.
终于成功仿了一次Kalman滤波器_html
%
终于成功仿了一次Kalman滤波器_html
% An excellent paper on Kalman filtering at the introductory level,
终于成功仿了一次Kalman滤波器_html
% without detailing the mathematical underpinnings, is:
终于成功仿了一次Kalman滤波器_html
% "An Introduction to the Kalman Filter"
终于成功仿了一次Kalman滤波器_html
% Greg Welch and Gary Bishop, University of North Carolina
终于成功仿了一次Kalman滤波器_html
% http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html
终于成功仿了一次Kalman滤波器_html
%
终于成功仿了一次Kalman滤波器_html
% PURPOSE:
终于成功仿了一次Kalman滤波器_html
%
终于成功仿了一次Kalman滤波器_html
% The purpose of each iteration of a Kalman filter is to update
终于成功仿了一次Kalman滤波器_html
% the estimate of the state vector of a system (and the covariance
终于成功仿了一次Kalman滤波器_html
% of that vector) based upon the information in a new observation.
终于成功仿了一次Kalman滤波器_html
% The version of the Kalman filter in this function assumes that
终于成功仿了一次Kalman滤波器_html
% observations occur at fixed discrete time intervals. Also, this
终于成功仿了一次Kalman滤波器_html
% function assumes a linear system, meaning that the time evolution
终于成功仿了一次Kalman滤波器_html
% of the state vector can be calculated by means of a state transition
终于成功仿了一次Kalman滤波器_html
% matrix.
终于成功仿了一次Kalman滤波器_html
%
终于成功仿了一次Kalman滤波器_html
% USAGE:
终于成功仿了一次Kalman滤波器_html
%
终于成功仿了一次Kalman滤波器_html
% s = kalmanf(s)
终于成功仿了一次Kalman滤波器_html
%
终于成功仿了一次Kalman滤波器_html
% "s" is a "system" struct containing various fields used as input
终于成功仿了一次Kalman滤波器_html
% and output. The state estimate "x" and its covariance "P" are
终于成功仿了一次Kalman滤波器_html
% updated by the function. The other fields describe the mechanics
终于成功仿了一次Kalman滤波器_html
% of the system and are left unchanged. A calling routine may change
终于成功仿了一次Kalman滤波器_html
% these other fields as needed if state dynamics are time-dependent;
终于成功仿了一次Kalman滤波器_html
% otherwise, they should be left alone after initial values are set.
终于成功仿了一次Kalman滤波器_html
% The exceptions are the observation vectro "z" and the input control
终于成功仿了一次Kalman滤波器_html
% (or forcing function) "u." If there is an input function, then
终于成功仿了一次Kalman滤波器_html
% "u" should be set to some nonzero value by the calling routine.
终于成功仿了一次Kalman滤波器_html
%
终于成功仿了一次Kalman滤波器_html
% SYSTEM DYNAMICS:
终于成功仿了一次Kalman滤波器_html
%
终于成功仿了一次Kalman滤波器_html
% The system evolves according to the following difference equations,
终于成功仿了一次Kalman滤波器_html
% where quantities are further defined below:
终于成功仿了一次Kalman滤波器_html
%
终于成功仿了一次Kalman滤波器_html
% x = Ax + Bu + w meaning the state vector x evolves during one time
终于成功仿了一次Kalman滤波器_html
% step by premultiplying by the "state transition
终于成功仿了一次Kalman滤波器_html
% matrix" A. There is optionally (if nonzero) an input
终于成功仿了一次Kalman滤波器_html
% vector u which affects the state linearly, and this
终于成功仿了一次Kalman滤波器_html
% linear effect on the state is represented by
终于成功仿了一次Kalman滤波器_html
% premultiplying by the "input matrix" B. There is also
终于成功仿了一次Kalman滤波器_html
% gaussian process noise w.
终于成功仿了一次Kalman滤波器_html
% z = Hx + v meaning the observation vector z is a linear function
终于成功仿了一次Kalman滤波器_html
% of the state vector, and this linear relationship is
终于成功仿了一次Kalman滤波器_html
% represented by premultiplication by "observation
终于成功仿了一次Kalman滤波器_html
% matrix" H. There is also gaussian measurement
终于成功仿了一次Kalman滤波器_html
% noise v.
终于成功仿了一次Kalman滤波器_html
% where w ~ N(0,Q) meaning w is gaussian noise with covariance Q
终于成功仿了一次Kalman滤波器_html
% v ~ N(0,R) meaning v is gaussian noise with covariance R
终于成功仿了一次Kalman滤波器_html
%
终于成功仿了一次Kalman滤波器_html
% VECTOR VARIABLES:
终于成功仿了一次Kalman滤波器_html
%
终于成功仿了一次Kalman滤波器_html
% s.x = state vector estimate. In the input structthis is the
终于成功仿了一次Kalman滤波器_html
% "a priori" state estimate (prior to the addition of the
终于成功仿了一次Kalman滤波器_html
% information from the new observation). In the output struct,
终于成功仿了一次Kalman滤波器_html
% this is the "a posteriori" state estimate (after the new
终于成功仿了一次Kalman滤波器_html
% measurement information is included).
终于成功仿了一次Kalman滤波器_html
% s.z = observation vector
终于成功仿了一次Kalman滤波器_html
% s.u = input control vector, optional (defaults to zero).
终于成功仿了一次Kalman滤波器_html
%
终于成功仿了一次Kalman滤波器_html
% MATRIX VARIABLES:
终于成功仿了一次Kalman滤波器_html
%
终于成功仿了一次Kalman滤波器_html
% s.A = state transition matrix (defaults to identity).
终于成功仿了一次Kalman滤波器_html
% s.P = covariance of the state vector estimate. In the input struct,
终于成功仿了一次Kalman滤波器_html
% this is "a priori," and in the output it is "a posteriori."
终于成功仿了一次Kalman滤波器_html
% (required unless autoinitializing as described below).
终于成功仿了一次Kalman滤波器_html
% s.B = input matrix, optional (defaults to zero).
终于成功仿了一次Kalman滤波器_html
% s.Q = process noise covariance (defaults to zero).
终于成功仿了一次Kalman滤波器_html
% s.R = measurement noise covariance (required).
终于成功仿了一次Kalman滤波器_html
% s.H = observation matrix (defaults to identity).
终于成功仿了一次Kalman滤波器_html
%
终于成功仿了一次Kalman滤波器_html
% NORMAL OPERATION:
终于成功仿了一次Kalman滤波器_html
%
终于成功仿了一次Kalman滤波器_html
% (1) define all state definition fields: A,B,H,Q,R
终于成功仿了一次Kalman滤波器_html
% (2) define intial state estimate: x,P
终于成功仿了一次Kalman滤波器_html
% (3) obtain observation and control vectors: z,u
终于成功仿了一次Kalman滤波器_html
% (4) call the filter to obtain updated state estimate: x,P
终于成功仿了一次Kalman滤波器_html
% (5return to step (3) and repeat
终于成功仿了一次Kalman滤波器_html
%
终于成功仿了一次Kalman滤波器_html
% INITIALIZATION:
终于成功仿了一次Kalman滤波器_html
%
终于成功仿了一次Kalman滤波器_html
% If an initial state estimate is unavailable, it can be obtained
终于成功仿了一次Kalman滤波器_html
% from the first observation as follows, provided that there are the
终于成功仿了一次Kalman滤波器_html
% same number of observable variables as state variables. This "auto-
终于成功仿了一次Kalman滤波器_html
% intitialization" is done automatically if s.x is absent or NaN.
终于成功仿了一次Kalman滤波器_html
%
终于成功仿了一次Kalman滤波器_html
%= inv(H)*z
终于成功仿了一次Kalman滤波器_html
%= inv(H)*R*inv(H')
终于成功仿了一次Kalman滤波器_html
%
终于成功仿了一次Kalman滤波器_html
% This is mathematically equivalent to setting the initial state estimate
终于成功仿了一次Kalman滤波器_html
% covariance to infinity.
终于成功仿了一次Kalman滤波器_html
%
终于成功仿了一次Kalman滤波器_html
% SCALAR EXAMPLE (Automobile Voltimeter):
终于成功仿了一次Kalman滤波器_html
%
终于成功仿了一次Kalman滤波器_html
% % Define the system as a constant of 12 volts:
终于成功仿了一次Kalman滤波器_htmlfunction T
终于成功仿了一次Kalman滤波器_htmlclear s
终于成功仿了一次Kalman滤波器_htmls.x 
= 12;
终于成功仿了一次Kalman滤波器_htmls.A 
= 1;
终于成功仿了一次Kalman滤波器_html
% % Define a process noise (stdev) of 2 volts as the car operates:
终于成功仿了一次Kalman滤波器_htmls.Q 
= 2^2% variance, hence stdev^2
终于成功仿了一次Kalman滤波器_html
% Define the voltimeter to measure the voltage itself:
终于成功仿了一次Kalman滤波器_htmls.H 
= 1;
终于成功仿了一次Kalman滤波器_html
% % Define a measurement error (stdev) of 2 volts:
终于成功仿了一次Kalman滤波器_htmls.R 
= 2^2% variance, hence stdev^2
终于成功仿了一次Kalman滤波器_html
%Do not define any system input (control) functions:
终于成功仿了一次Kalman滤波器_htmls.B 
= 0;
终于成功仿了一次Kalman滤波器_htmls.u 
= 0;
终于成功仿了一次Kalman滤波器_html
% % Do not specify an initial state:
终于成功仿了一次Kalman滤波器_htmls.x 
= nan;
终于成功仿了一次Kalman滤波器_htmls.P 
= nan;
终于成功仿了一次Kalman滤波器_html
% % Generate random voltages and watch the filter operate.
终于成功仿了一次Kalman滤波器_htmltru
=[]; % truth voltage
终于成功仿了一次Kalman滤波器_html
for t=1:20
终于成功仿了一次Kalman滤波器_html    tru(end
+1= randn*2+12;
终于成功仿了一次Kalman滤波器_html    s(end).z 
= tru(end) + randn*2% create a measurement
终于成功仿了一次Kalman滤波器_html    s(end
+1)=kalmanf(s(end)); % perform a Kalman filter iteration
终于成功仿了一次Kalman滤波器_html    
% end
终于成功仿了一次Kalman滤波器_html    
% figure
终于成功仿了一次Kalman滤波器_html    
% hold on
终于成功仿了一次Kalman滤波器_html    
% grid on
终于成功仿了一次Kalman滤波器_html    
% % plot measurement data:
终于成功仿了一次Kalman滤波器_html    hz
=plot([s(1:end-1).z],'r');hold on
终于成功仿了一次Kalman滤波器_html    
% % plot a-posteriori state estimates:
终于成功仿了一次Kalman滤波器_html    hk
=plot([s(2:end).x],'b-');hold on
终于成功仿了一次Kalman滤波器_html    ht
=plot(tru,'g-');hold on
终于成功仿了一次Kalman滤波器_html    legend(
'observations','Kalman output','true voltage',0)
终于成功仿了一次Kalman滤波器_html    title(
'Automobile Voltimeter Example')
终于成功仿了一次Kalman滤波器_html    
% hold off
终于成功仿了一次Kalman滤波器_htmlend    
终于成功仿了一次Kalman滤波器_html    
终于成功仿了一次Kalman滤波器_htmlfunction s 
= kalmanf(s)
终于成功仿了一次Kalman滤波器_html
终于成功仿了一次Kalman滤波器_html
% set defaults for absent fields:
终于成功仿了一次Kalman滤波器_html
if ~isfield(s,'x'); s.x=nan*z; end
终于成功仿了一次Kalman滤波器_html
if ~isfield(s,'P'); s.P=nan; end
终于成功仿了一次Kalman滤波器_html
if ~isfield(s,'z'); error('Observation vector missing'); end
终于成功仿了一次Kalman滤波器_html
if ~isfield(s,'u'); s.u=0; end
终于成功仿了一次Kalman滤波器_html
if ~isfield(s,'A'); s.A=eye(length(x)); end
终于成功仿了一次Kalman滤波器_html
if ~isfield(s,'B'); s.B=0; end
终于成功仿了一次Kalman滤波器_html
if ~isfield(s,'Q'); s.Q=zeros(length(x)); end
终于成功仿了一次Kalman滤波器_html
if ~isfield(s,'R'); error('Observation covariance missing'); end
终于成功仿了一次Kalman滤波器_html
if ~isfield(s,'H'); s.H=eye(length(x)); end
终于成功仿了一次Kalman滤波器_html
终于成功仿了一次Kalman滤波器_html
if isnan(s.x)
终于成功仿了一次Kalman滤波器_html    
% initialize state estimate from first observation
终于成功仿了一次Kalman滤波器_html    
if diff(size(s.H))
终于成功仿了一次Kalman滤波器_html        error(
'Observation matrix must be square and invertible for state autointialization.');
终于成功仿了一次Kalman滤波器_html    end
终于成功仿了一次Kalman滤波器_html    s.x 
= inv(s.H)*s.z;
终于成功仿了一次Kalman滤波器_html    s.P 
= inv(s.H)*s.R*inv(s.H'); 
终于成功仿了一次Kalman滤波器_html
else
终于成功仿了一次Kalman滤波器_html    
终于成功仿了一次Kalman滤波器_html    
% This is the code which implements the discrete Kalman filter:
终于成功仿了一次Kalman滤波器_html    
终于成功仿了一次Kalman滤波器_html    
% Prediction for state vector and covariance:
终于成功仿了一次Kalman滤波器_html    s.x 
= s.A*s.x + s.B*s.u;
终于成功仿了一次Kalman滤波器_html    s.P 
= s.A * s.P * s.A' + s.Q;
终于成功仿了一次Kalman滤波器_html
    
终于成功仿了一次Kalman滤波器_html    
% Compute Kalman gain factor:
终于成功仿了一次Kalman滤波器_html    K 
= s.P*s.H'*inv(s.H*s.P*s.H'+s.R);
终于成功仿了一次Kalman滤波器_html    
终于成功仿了一次Kalman滤波器_html    
% Correction based on observation:
终于成功仿了一次Kalman滤波器_html    s.x 
= s.x + K*(s.z-s.H*s.x);
终于成功仿了一次Kalman滤波器_html    s.P 
= s.P - K*s.H*s.P;
终于成功仿了一次Kalman滤波器_html    
终于成功仿了一次Kalman滤波器_html    
% Note that the desired result, which is an improved estimate
终于成功仿了一次Kalman滤波器_html    
% of the sytem state vector x and its covariance P, was obtained
终于成功仿了一次Kalman滤波器_html    
% in only five lines of code, once the system was defined. (That's
终于成功仿了一次Kalman滤波器_html
    % how simple the discrete Kalman filter is to use.) Later,
终于成功仿了一次Kalman滤波器_html    
% we'll discuss how to deal with nonlinear systems.
终于成功仿了一次Kalman滤波器_html
    
终于成功仿了一次Kalman滤波器_htmlend
终于成功仿了一次Kalman滤波器_html
终于成功仿了一次Kalman滤波器_html

后来不过瘾,自己写了一个,没想到稍微改了一改竟然成功了,效果还不错
终于成功仿了一次Kalman滤波器_html% 状态
终于成功仿了一次Kalman滤波器_html% xk=A•xk-1+B•uk+wk
终于成功仿了一次Kalman滤波器_html% zk=H•xk+vk,
终于成功仿了一次Kalman滤波器_html% p(w) ~ N(0,Q)
终于成功仿了一次Kalman滤波器_html% p(v) ~ N(0,R),
终于成功仿了一次Kalman滤波器_html
终于成功仿了一次Kalman滤波器_html% 预测
终于成功仿了一次Kalman滤波器_html% x'k=A•xk+B•uk
终于成功仿了一次Kalman滤波器_html% P'k=A•P(k-1)*AT + Q
终于成功仿了一次Kalman滤波器_html% 修正
终于成功仿了一次Kalman滤波器_html% Kk=P'k•HT•(H•P'k•HT+R)-1
终于成功仿了一次Kalman滤波器_html% xk=x'k+Kk•(zk-H•x'k)
终于成功仿了一次Kalman滤波器_html% Pk=(I-Kk•H)•P'k
终于成功仿了一次Kalman滤波器_html
终于成功仿了一次Kalman滤波器_html%要注意的是:必须把系统状态和kalman滤波器内部预测的状态分开
终于成功仿了一次Kalman滤波器_htmlfunction Test
终于成功仿了一次Kalman滤波器_htmlA=[1 0.1;0 1];
终于成功仿了一次Kalman滤波器_htmlB=0;
终于成功仿了一次Kalman滤波器_htmlXp=rand(2,1)*0.1; 
终于成功仿了一次Kalman滤波器_htmlX=[0 0]';
终于成功仿了一次Kalman滤波器_htmlH=[1 0];
终于成功仿了一次Kalman滤波器_htmlQ=eye(2)*1e-5;
终于成功仿了一次Kalman滤波器_htmlR=eye(1)*0.1; 
终于成功仿了一次Kalman滤波器_htmlP=eye(2);% P'(k)
终于成功仿了一次Kalman滤波器_htmlangle=[];
终于成功仿了一次Kalman滤波器_htmlangle_m=[];
终于成功仿了一次Kalman滤波器_htmlangle_real=[];
终于成功仿了一次Kalman滤波器_htmlfor i=1:500
终于成功仿了一次Kalman滤波器_html    angle_real=[angle_real X(1)]; %实际角度
终于成功仿了一次Kalman滤波器_html    
终于成功仿了一次Kalman滤波器_html    [Xp,P]=Predict(A,Xp,P,Q); 
终于成功仿了一次Kalman滤波器_html    
终于成功仿了一次Kalman滤波器_html    X=A*X+rand(2,1)*1e-5;
终于成功仿了一次Kalman滤波器_html    z_m=H*X+rand(1,1)*0.1-0.05;  
终于成功仿了一次Kalman滤波器_html    angle_m=[angle_m z_m(1)];   %测量的角度
终于成功仿了一次Kalman滤波器_html        
终于成功仿了一次Kalman滤波器_html    [Xp,P]=Correct(P,H,R,X,z_m);
终于成功仿了一次Kalman滤波器_html    angle=[angle Xp(1)];     %预测的角度    
终于成功仿了一次Kalman滤波器_htmlend
终于成功仿了一次Kalman滤波器_htmlt=1:500;
终于成功仿了一次Kalman滤波器_htmlplot(t,angle,'r',t,angle_m,'g',t,angle_real,'b')
终于成功仿了一次Kalman滤波器_htmllegend('预测值','测量值','实际值')
终于成功仿了一次Kalman滤波器_html
终于成功仿了一次Kalman滤波器_htmlfigure
终于成功仿了一次Kalman滤波器_htmlplot(t,angle-angle_real,'r',t,angle_m-angle_real,'g')
终于成功仿了一次Kalman滤波器_htmllegend('滤波后的误差','测量的误差')
终于成功仿了一次Kalman滤波器_htmltitle('误差分析')
终于成功仿了一次Kalman滤波器_htmlxlabel('time');
终于成功仿了一次Kalman滤波器_htmlylabel('error');
终于成功仿了一次Kalman滤波器_html
终于成功仿了一次Kalman滤波器_htmlfunction [Xk,Pk]=Predict(A,Xk,Pk_1,Q)
终于成功仿了一次Kalman滤波器_htmlXk=A*Xk;
终于成功仿了一次Kalman滤波器_htmlPk=A*Pk_1*A'+Q;
终于成功仿了一次Kalman滤波器_html
终于成功仿了一次Kalman滤波器_htmlfunction [Xk,Pk]=Correct(Pk,H,R,Xk,zk)
终于成功仿了一次Kalman滤波器_htmlKk=Pk * H' * inv(H * Pk * H' + R);
终于成功仿了一次Kalman滤波器_htmlXk=Xk+ Kk*(zk-H*Xk);
终于成功仿了一次Kalman滤波器_htmlPk=(eye(size(Pk,1)) - Kk*H)*Pk;
终于成功仿了一次Kalman滤波器_html