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
Je vous recommande de fournir un code reproduisant votre problème. – excaza
@excaza: S'il vous plaît voir ma mise à jour, où j'ai mis le code. Merci pour l'aide. – SKM