IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MATLAB Discussion :

Prédiction à l'aide du filtre de Kalman basique


Sujet :

MATLAB

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Prédiction à l'aide du filtre de Kalman basique
    Bonjour,
    Alors voila j'essaye de réaliser une prédiction à l'aide du filtre de Kalman basique. Pour ça j'ai à disposition un tableau avec les valeurs du flux, et mon but est de prédire ce flux.
    J'ai réalisé le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    %% Adaptive Kalman filter
    clear all;
    %% Voltage values 
    A=[0.39, 0.5, 0.48, 0.29, 0.25, 0.32, 0.34, 0.48, 0.41, 0.45,0.39, 0.5, 0.48, 0.29, 0.25, 0.32, 0.34, 0.48, 0.41, 0.45];
     
    %% First Order Adaptive Kalman Filter
    x_inter=zeros(1,20);
     
    P_inter=1;
     
    Q=0.382;
     
    zk=0.39+0.11122.* randn(1,20)
     
    R=0.1;
     
    for t=1:20
    % **************Update**************
        K=P_inter/((P_inter+R));
        x_current(t)=x_inter(t)+K*(zk(t)-x_inter(t));
        P_current=(1-K)*P_inter;
     
    % **************Predict**************
        x_inter(t)=x_current(t);
        P_inter=P_current+Q;
     
    end
     
    real_value=A
    estimated=x_current
    mse = (sum(x_current.^2))/20
     
    hold on;
    plot(A,'b');
    plot(x_inter,'r');
    plot(x_current,'g');
    Je souhaite à l'instant t prévoir le flux qu'il y aura à l'instant t+1. Je pensais que le filtre de Kalman pouvait réaliser cela mais je suis un peu bloquée.
    Pour moi x_inter est la valeur prédite, mais étant donné qu'elle est égale à x_current je ne prédis absolument rien.

    Merci à ceux qui pourront m'aider

  2. #2
    Membre actif
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2013
    Messages : 189
    Points : 242
    Points
    242
    Par défaut
    Salut,
    tu n'as pas de matrice d'évolution (ou de transition, je me souviens plus de la terminologie),ni de matrice d'observation... je comprend pas comment tu veux faire un filtre de Kalman?

    Si tu n'as pas une matrice de transition F qui vient décrire la dynamique de ton système, le filtrage de Kalman n'a pas de sens.

    je te rappelle que les equations necessaires à la mise en place du filtre de Kalman sont les représentations d'état suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dX/dt = F(t)*X+C(t)+W(t)
    Y = H(t)*X+V(t)
    X(t) : vecteur d'etat
    Y(t) : vecteur d'observation

    F(t) : matrice d'evolution modélisant ton système dynamique
    C(t) : vecteur de commande de ton système
    W(t) : vecteur de bruit d'etat

    H(t) : Matrice d'observation
    V(t) : vecteur de bruit de mesure

    les équations que tu as écrites ensuite ne sont pas fausses mais incomplètes.

    Commence donc par identifier proprement la dynamique de ton système (Matrice F). Sans ça, on ne peut pas vraiment t'aider.

    Puis bon ta question c'est plus de l'automatique qu'un problème avec Matlab, ici c'est un forum d'entraide pour Matlab

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci de m'avoir répondu

    Effectivement je n'ai pas de matrice de passage mais je me suis basé sur l'exemple donné sur ce pdf (page 12) http://www.cs.unc.edu/~welch/media/pdf/kalman_intro.pdf
    dans cet exemple les matrices sont égales à 1. Je souhaite faire un exemple le plus simple possible avant de me lancer dans quelque chose de plus compliqué. Je sais que mon code est bon parce que j'ai les mêmes résultats que dans l'exemple donné page 13.
    Ce que je ne comprend pas c'est la prédiction. Pour moi ce code ne fait que sauvegarder la valeur courante dans la valeur à prédire...

  4. #4
    Membre actif
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2013
    Messages : 189
    Points : 242
    Points
    242
    Par défaut
    Alors normalement ta prediction, dans le cas général, est avec les notations du (bon) poly que tu as mis en :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    X_pred = A*X_precedent+ B*u_commmande
    comme ici A (ou F dans mon post precedent) vaut 1 et que tu ne commande pas ton système (u = 0), tu as effectivement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    X_prediction = X_precedent
    Pour plus de clarté et bien comprendre, j'écrirais à ta place l'equation complète dans le code en mettant A = 1 et u = 0;

  5. #5
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    En fait ce que je souhaite faire à l'aide du filtre c'est de prédire un flux de trafic routier, pour ça j'ai a disposition un fichier excel avec des données (nombre de voitures/min) et je souhaite prédire à l'instant t le flux qu'il y aura à l'instant t=t+1.

    J'ai un peu modifié mon code mais l'idée reste exactement la même, c'est juste que je commence par prédire et par la suite je corrige:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     %% Adaptive Kalman filter
    clear all;clc;format short;
    z=[0.39, 0.5, 0.48, 0.29, 0.25, 0.32, 0.34, 0.48, 0.41, 0.45,0.39, 0.5, 0.48, 0.29, 0.25, 0.32, 0.34, 0.48, 0.41, 0.45];
    %% First Order Adaptive Kalman Filter
    x_inter=zeros(1,20);
    x_current=zeros(1,20);
     
    P_current=1;
     
    Q=0.382;
    q_t=0.1;
     
    R=0.1;
    A=1;
    B=1;
    u=0;
     
    for t=2:20
     
    % **************Predict**************
        x_inter(t)=A*x_current(t-1)+B*u;
        P_inter=P_current+Q;
     
    % **************Update**************
        K=P_inter/((P_inter+R));
        x_current(t)=x_inter(t)+K*(z(t)-x_inter(t));
        %x_current(t)=(1-K)*x_inter(t)+K*A(t)+(1-K)*q_t;
        P_current=(1-K)*P_inter;
     
     
    end
     
    real_value=z
    estimated=x_current
    mse = (sum(x_current.^2))/20
     
    figure();
    hold on;
    plot(z,'b');
    plot(x_inter,'r');
    plot(x_current,'g');
    hold off;
    Dans ma formule d'update j'ai écrit x_current(t)=x_inter(t)+K*(z(t)-x_inter(t));
    ce que je fais c'est que je vais directement chercher la valeur (normalement donné par le capteur) dans le fichier excel.
    Est-ce correcte ou dois je calculer cette valeur à l'aide de la formule z=x_current(t)+ v?

    De plus comme on peut le voir sur le graphique obtenu, j'ai en bleu les valeurs réelles, en vert la correction par filtre de Kalman, et en rouge la prédiction Nom : BKF_Voltage.PNG
Affichages : 3057
Taille : 11,6 Ko

    Or cette prédiction vient beaucoup plus tard qu'elle ne devrait... Je ne sais pas comment changer mon code pour avoir une prédiction comme il se doit
    Saurais tu me dire si ce que je souhaite faire avec ce filtre est possible? Parce que j'ai de gros doutes au vu des résultats obtenus

    Merci de ton aide!

  6. #6
    Membre actif
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2013
    Messages : 189
    Points : 242
    Points
    242
    Par défaut
    Il faut bien utiliser ce qui a été donné par le cpateur (c'est la partie "observation"). Sinon, ben la je sais pas trop pour le reste...

Discussions similaires

  1. Filtre de Kalman
    Par bahiatoon dans le forum Traitement d'images
    Réponses: 16
    Dernier message: 22/08/2008, 12h49
  2. Réponses: 1
    Dernier message: 28/02/2008, 21h40
  3. cvMat et memcpy (filtre de Kalman)
    Par BNS dans le forum OpenCV
    Réponses: 0
    Dernier message: 20/11/2007, 17h23
  4. Filtre de Kalman en C++
    Par totoscill dans le forum C++
    Réponses: 4
    Dernier message: 11/04/2007, 14h14
  5. [Signal Processing Blockset] Filtre de kalman
    Par totoscill dans le forum Signal
    Réponses: 5
    Dernier message: 11/04/2007, 11h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo