Matlab:卡尔曼滤波器 - 如何减轻警告:矩阵是单一的或严重缩放的

时间:2015-09-11 17:32:22

标签: matlab kalman-filter

执行Kalman filter的创新更新时,我收到了警告

  

警告:Matrix接近单一或严重缩放。结果可能是   不准确的。 RCOND = 2.169130e-017。

可能由于这个原因,结果并不准确。我怎么解决这个问题?我尝试引入一个循环

[R,p] = chol(Ppred);
if p> 0;
                count = 300;
              return;
          end

其中count只是一个变量来停止代码,直到找到一个好的矩阵。但这没有用。

更新:

移动平均线,MA(2)模型的线性系统表示

 x_n+1 = Bw_n
 y_n = Cx_n + v_n
% w = N(0,Q); v = N(0,R)
%true coefficients, h = [1 0.5 -0.9];

CODE SNIPPETS

这些是卡尔曼滤波器的3个模块的功能

C = [ 1 0 0 ];

B = [1 0.5  -0.9 ;
     0  1     0.5;
     0  0     1]; 

noise_var = rand(1,1); % measurement noise

 order = 2;
 xpred = rand(order,1); 
 P = 10* eye(d,d);

 A = P;
 P = P + B*sqrt(noise_var)*B';
P = dlyap(A,B*B');
for i = 1:N
 [xpred, Ppred] = predict(xpred,B,Ppred, Q); 

  [nu, S] = innovation(xpred, Ppred, y(i), C, noise_var);

  [xnew, Ppred, yhat, KalmanGain] = innovation_update(xpred,Ppred,nu,S,C);
    if(isnan(Ppred))
         count = 300;
         return;
    end

end

function [xpred, Ppred] = predict(input_t,B,P, Q)
xpred =  B*input_t;
Ppred = P + Q;
end

function [nu, S] = innovation(xpred, Ppred, y, C, R)
nu = y - C*xpred; %% innovation

S = R + C*Ppred*C'; %% innovation covariance

end

function [xnew, Pnew, yhat, K] = innovation_update(xpred, Ppred, nu, S, C)
K1 = Ppred*C';
K = K1'*inv(S);
xnew = xpred + K'*nu; %% new state
Pnew = Ppred - Ppred*K'*C; %% new covariance
 yhat = C*xnew;

end

1 个答案:

答案 0 :(得分:2)

数值问题是卡尔曼滤波器的常见问题。您没有足够的代码来分享(尤其是Q),但是导致错误导致P变为非正定的(尤其是{{} 1}}更新您使用的表格。

如果你google"卡尔曼过滤数值稳定性"你可以找到很多关于这个主题的参考资料。在这种情况下尝试的简单事情是增加P(又名"虚拟过程噪音")以避免使用约瑟夫形式的协方差更新的病态Q,或者通过设置P来强制P对称。

更复杂的选项包括切换到平方根形式(例如UDU'),或者使用更精确的浮点表示(例如,double而不是float,这主要是因为你可能已经在双)。