Projet

Général

Profil

« Précédent | Suivant » 

Révision 455

Ajouté par Henri JOUANNY il y a environ 3 ans

-Filtre non finit, arrêt au calcul de Xk+1 en connaissant Xk

Voir les différences:

branch/jouanny2/sp4a3/sp4a3_kalman.c
double FPFt[4][4] = {{0, 0, 0, 0},
{0, 0, 0, 0},
{0, 0, 0, 0},
{0, 0, 0, 0}}; //création d'une sous-matrice pour la multiplication de FP avec F'
{0, 0, 0, 0}}; //création d'une sous-matrice pour la multiplication de FP avec F'
double Ht[4][2] = {{0, 0,},
{0, 0},
{0, 0},
{0, 0}}; //Transposée de H
double PHt[4][2] = {{0, 0},
{0, 0},
{0, 0},
{0, 0}};
double HPHt[2][2] = {{0, 0,},
{0, 0}};
double HPHtR[2][2] = {{0, 0,},
{0, 0}};
double Kobs[4][1] = {{0},
{0},
{0},
{0}};
double HX [2][1] = {{0},{0}};
double KobsmHX[2][1] = {{0},{0}};
tests_unitaires();
FILE* fichier = fopen("pos_t_x_y.dat","r");
......
// kalman param
double sigma_etat = 10.0;
double sigma_observation = 2.0;
double sigma_observation = 2.0;
double Obs[2][1] = {{xobs},{yobs}};
double X[4][1] = {{0},{0},{0},{0}};
double P[4][4] = {{sigma_etat*sigma_etat, 0, 0, 0},
......
// Kalman
// X = F*X
Mul_Mat_Mat(4,4,F,4,1,F,X);
Mul_Mat_Mat(4,4,F,4,1,F,X);
Plot_Mat(X," X(k+1|k) = ");
//P = F*P*F'+Q;
Mul_Mat_Mat(4,4,F,4,4,P,FP);
Mul_Mat_Mat(4,4,FP,4,4,Transpose_Mat(4,4,F,Ft),FPFt);
Add_Mat_Mat(4,4,FPFt,4,4,Q,P);
Transpose_Mat(4,4,F,Ft);
Mul_Mat_Mat(4,4,FP,4,4,Ft,FPFt);
Add_Mat_Mat(4,4,FPFt,4,4,Q,P);
Plot_Mat(P,"P(k+1|k) = F.P(k|k).FT + Q = ");
// K = P*H' / ( H*P*H' + R);
// K = P*H' / ( H*P*H' + R);
Transpose_Mat(2,4,H,Ht);
Mul_Mat_Mat(4,4,P,4,2,Ht,PHt);
Mul_Mat_Mat(2,4,H,4,2,PHt,HPHt);
Add_Mat_Mat(2,2,HPHt,2,2,R,HPHtR);
for (i=0; i<3; i++)
{
for (j=0; j<1; j++)
{
K[i][j]=(PHt[i][j]/HPHtR[i][j]); //assigne les valeurs à K
}
}
Plot_Mat(K,"K = ");
//X = X + K*([xobs(i);yobs(i)]-H*X);
//X = X + K*([xobs(i);yobs(i)]-H*X);
Mul_Mat_Mat(4,2,K,2,1,Obs,Kobs);
Mul_Mat_Mat(2,4,H,4,1,X,HX);
Sub_Mat_Mat(2,1,Kobs,2,1,HX,KobsmHX);
Add_Mat_Mat(2,1,X,2,1,KobsmHX,X);
//Sub_Mat_Mat(2,1,Obs,2,1), pas eu le temps de finir cette ligne
//Plot_Mat(Delta,"DELTA = Obs - H.X(k+1|k)");
Plot_Mat(X," X(k+1|k+1) = X(k+1|k) + K.Delta = ");

Formats disponibles : Unified diff