www.gusucode.com > 惯性导航系统仿真程序 SIMULINK环境-SIMULINK源码程序 > code/KF10.m

    %%FILENAME:  KF5.m
%%LIANZI       2006-03-19  
%%FUNCTION:  The Kalman Filter function
%%

function  [X,P,K]=KF10(A,B,C,Z,X0,P0,Q0,R0,dt)

[phi , gama]=c2d(A, B, dt);

%%%1
%%%考虑计算可观测性判别矩阵的秩rank(M),M = [C' phi'*C' phi'^2*C' ... phi'^(n-1)*C']
%%%由此判断可观的状态数
%%M1 = phi'* C';
%M2 = phi'* M1;
%M3 = phi'* M2;
%M4 = phi'* M3;
%M = [ C' M1  M2  M3  M4];
Rk = 1;
%%%2
%%%离散系统的噪声方差阵有必要按照秦永元的p45 (2.2.31)式计算吗?看一下英文书的例子
%%%拙见: 函数c2d已经完成了这一步工作吧。是否有必要自己来计算离散化呢?
%%%试一下c2d的各种不同近似方法对应的参数,零阶保持不是最好的

X_1 = phi * X0;
P_1 = phi * P0 * phi' + gama * Q0 * gama' ;
K = P_1 * C' * inv( C * P_1 * C' + R0 );  
P = ( eye(10) - K * C ) * P_1 * ( eye(10) - K * C )' + K * R0 * K' ;
X = X_1 + K * ( Z - C * X_1);
% X_1 = phi * X0;
% P_1 = inv(inv(phi' * P0 * phi + gama* Q0 * gama')+C'*inv(R0)*C) ;
% K = P_1 * C' * inv( C * P_1 * C' + R0 );  
% P=P_1;
% % P = ( eye(10) - K * C ) * P_1 * ( eye(10) - K * C )' + K * R0 * K' ;
% X = X_1 + K * ( Z - C * X_1);