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

C++ Discussion :

Aide pour débugguer l'algorithme de Gauss


Sujet :

C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 218
    Par défaut Aide pour débugguer l'algorithme de Gauss
    Bonjour,

    Je sollicite votre aide pour m'aider à debugguer l'algorithme de Gauss que j'ai fait. J'ai créé une classe matrix qui me permet de manipuler des matrices. J'ai réalisé mon algorithme à partir de cette page wikipédia:http://fr.wikipedia.org/wiki/%C3%89limination_de_Gauss-Jordan. Je cherche à résoudre le système donné dans l'exemple 3. En partant de la matrice initiale, je trouve:
    |1 0 0 6.16361 |
    |0 1 0 -2.08669|
    |0 0 1 0.68254 |

    Alors que je suis censé trouver |1 2 3| sur la dernière colonne. Mais quand je pars de la matrice à la deuxième ligne:
    |1 -1 2 5 |
    |0 5 -5 -5|
    |0 -1 -6 -20 |
    Je tombe bien sur le bon résultat!
    J'ai une seule idée de l'endroit d'où ça peut venir: des approximations lors de la manipulation des nombres à virgules. Mais le résultat devrait être à peu près le même et pas complètement différent (6 devrait être 1).

    Voila le code:
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    #include "math.h"
    #include "matrix.h"
    #include <QDebug>
     
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
        Matrix mat;
        mat.setSize(3,4);
        mat(0,0)=1;
        mat(0,1)=-1;
        mat(0,2)=2;
        mat(1,0)=0;
        mat(1,1)=5;
        mat(1,2)=-5;
        mat(2,0)=0;
        mat(2,1)=-1;
        mat(2,2)=-6;
        mat(0,3)=5;
        mat(1,3)=-5;
        mat(2,3)=-20;
        mat.display();
     
        //Début de l'algorithme du pivot de GAUSS
     
        int r = -1;
        int k = 0;
        double maxPivot = 0;
        for(int j=0; j<mat.columnCount()-1;j++)
        {
            maxPivot = 0; //On met "maxPivot" à une valeur minimale
     
            //On cherche le coef max de la colonne j et on le stocke dans "maxPivot". L'indice de la ligne du pivot est k.
            for(int i=r+1;i<mat.rowCount();i++)
            {
                if(abs(mat(i,j))>abs(maxPivot))
                {
                    maxPivot = mat(i,j);
                    k = i;
                }
            }
     
            if(mat(k,j)!=0)//Si le pivot est non nul, on procède aux opérations. Sinon, cela veut dire que toute la colonne est nulle
            {
                r++;
     
                for(int i = 0; i<mat.columnCount();i++) //On divise la ligne par le pivot (1 en début de ligne)
                {
                    mat(k,i) /= maxPivot;
                }
     
                for(int i = 0; i<mat.columnCount()-1;i++) //Echange des lignes r et k
                {
                    double coef = mat(k,i);
                    mat(k,i) = mat(r,i); //On modifie la ligne k
                    mat(r,i) = coef; //On modifie la ligne r
                }
     
                for(int i=0; i<mat.rowCount();i++)
                {
                    if(i!=r)
                    {
     
                        double coefLigne = mat(i,j);
     
                        for(int l=0;l<mat.columnCount();l++)
                        {
                            mat(i,l) -= mat(r,l)*coefLigne; // [Li] = [Li] - [Lr]*coefLigne
                        }
     
                    }
                }
            }
        }
     
        return a.exec();
    }
    Merci de votre aide.

    Cordialement

  2. #2
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 218
    Par défaut
    D'après mes lectures sur internet, j'ai vu que le problème venait bel et bien de la précision des calculs (les résultats sont systématiquement tronqués si on opère sur des nombres très différents). J'ai tenté de mettre des long double à la place des doubles dans ma matrice mais rien n'y fait, j'ai toujours des erreurs sur le résultat.

    heeeeelp

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 218
    Par défaut
    Problème résolu.
    C'était au niveau de l'inversion des lignes k et r, je m'arrêtais à la colonne n-1 alors qu'il faut aller jusqu'à la colonne n. J'ai bien des approximations mais le résultat est satisfaisant (10^-18 pour 0)

    Cordialement

  4. #4
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    edit : la cavalerie arrive toujours trop tard…

    Il y a un truc que je ne comprends pas dans ton code, c’est ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for(int j=0; j<mat.columnCount()-1;j++) // ligne 29
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for(int i = 0; i<mat.columnCount()-1;i++) // ligne 52
    Pourquoi ignores-tu systématiquement la dernière colonne*? (sauf ligne 47)

    À mon avis ton problème vient de là…

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 218
    Par défaut
    Non c'est volontaire, c'est parce que la matrice en elle-même s'arrête au niveau de colonne-1. Ainsi elle est carrée. Je rajoute artificiellement une autre colonne contenant les membres de droite de l'équation. Donc en fait j'inclue un vecteur dans la matrice pour avoir le résultat inclue dans la matrice (c'est plus simple pour moi à manipuler pour le moment, c'est juste un code de test).

    Je ferai un vecteur à part qui subira les même opérations que la matrice. Ainsi le vecteur contiendra toutes les solutions du système.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Besoin d'aide pour un petit Algorithme
    Par arnolem dans le forum Langage SQL
    Réponses: 13
    Dernier message: 28/02/2011, 16h15
  2. Besoin d'aide pour optimiser un algorithme
    Par predat dans le forum Général Python
    Réponses: 5
    Dernier message: 21/08/2010, 01h29
  3. Besoin d'aide pour un petit Algorithme
    Par arnolem dans le forum Requêtes
    Réponses: 1
    Dernier message: 03/08/2010, 23h51
  4. [AIDE] besoin d'aide pour réaliser un algorithme
    Par quaresma dans le forum Algorithmes et structures de données
    Réponses: 40
    Dernier message: 18/01/2008, 09h35
  5. [MASM] Aide pour débugguer mon code
    Par abd_ham_juve dans le forum x86 32-bits / 64-bits
    Réponses: 2
    Dernier message: 19/01/2007, 23h59

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