2015-09-11 1 views
0

Lorsque vous effectuez la mise à jour de l'innovation pour Kalman filter, je reçois AvertissementsMatlab: filtre de Kalman - Comment atténuer l'avertissement: Matrix est singulier ou mal mis à l'échelle

Attention: Matrix est proche de singulier ou mal mis à l'échelle. Les résultats peuvent être imprécis. RCOND = 2.169130e-017.

Peut-être en raison de cela, le résultat n'est pas précis. Comment puis-je résoudre ce problème? J'ai essayé d'introduire une boucle

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

où count est juste une variable pour bloquer le code jusqu'à ce qu'une bonne matrice soit trouvée. mais cela n'aide pas.

UPDATE:

représentation du système linéaire de la moyenne mobile, MA (2) modèle

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]; 

extraits de code

Ce sont les fonctions pour les 3 modules de Kalman Filter

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

Je vous recommande de fournir un code reproduisant votre problème. – excaza

+0

@excaza: S'il vous plaît voir ma mise à jour, où j'ai mis le code. Merci pour l'aide. – SKM

Répondre

1

Nume Les problèmes techniques sont un problème courant avec les filtres de Kalman. Vous n'avez pas partagé assez de code pour être sûr (en particulier Q), mais il est courant que les erreurs d'arrondi provoquent P pour devenir non-défini-positif (particulièrement avec le formulaire de mise à jour P que vous avez utilisé).

Si vous google "Kalman filtre stabilité numérique" vous pouvez trouver beaucoup de références sur le sujet. Les choses simples à essayer dans ce cas seraient Q (alias "bruit de processus fictif") pour éviter un P mal conditionné, en utilisant la forme Joseph de la mise à jour de covariance, ou en forçant P à être symétrique en définissant P = 0.5 * (P + P'). Les options plus complexes incluent le passage à une forme racine carrée (par exemple UDU ') ou l'utilisation d'une représentation en virgule flottante avec plus de précision (par exemple double au lieu de float, ce qui est principalement difficile parce que vous êtes déjà au double).