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

Mathématiques Discussion :

[Pivot de Gauss] probleme si pivot nul


Sujet :

Mathématiques

  1. #21
    Membre averti
    Avatar de jmjmjm
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2005
    Messages : 760
    Points : 439
    Points
    439
    Par défaut
    cool j'ai enfin compris désolé j'ai mis le temps t'aurais pas un morceaux de code pour choisir le bon pivot ??

    moi pour l'instant j'ai fait ca :
    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
    Matrice Inverse(Matrice A)
    {
        //Une matrice peut etre inverser que si elle est carrée
        if (A.rows_ == A.cols_) {
            fraction pivot;
            //Déclaration de la matrice identitée (1,0,0;0,1,0;0,0,1)
            Matrice P(A.rows_,A.cols_);
            for (int i=0;i<A.rows_;i++)
                for (int j=0;j<A.rows_;j++)
                    if (i==j) P(i,j)=1;
            //Déclaration de la matrice inverse de A
    
            Matrice I=P;
            
           for (int j=0;j<A.rows_;j++) {
               //Declaration de P2 (Matrice identité avec le pivot)
               Matrice P2=P;
               for (int i=0;i<A.rows_;i++) {
                   pivot=A(j,j);
                   if (pivot==0) {
                      cerr<<"Inversion : Le pivot est nul,inversion impossible !!";
                      exit(EXIT_FAILURE);
                   }
                   if (i==j) {
                      P2(i,j)=1/A(i,j);   
                   } else {
                      P2(i,j)=-1*(A(i,j)/pivot);
                   }
               }
               //Calcul de l'inverse 
               A=P2*A;
               I=P2*I;
           }
           return I;                 
        } else cerr<<"Inversion : La matrice n'est pas carré !!";
        exit(EXIT_FAILURE);
    }
    J'ai plus qu'a changer la partie en rouge !!



    Edit : Sinon que pense tu du code ??

  2. #22
    Membre averti
    Avatar de jmjmjm
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2005
    Messages : 760
    Points : 439
    Points
    439
    Par défaut
    une autre petite question, trouve ton toujours une solution avec cette methode ?? car comme on ne prend pas les ligne deja utilisé la solution de la fin peut etre dans les lignes du debut, vois tu ce que je veux dire ??

    Derniere question (promis ) pourquoi prendre le pivot le plus elever un pivot different de 0 suffit non ??

  3. #23
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Ah ok, je viens de comprendre ta methode: a chaque étape, tu créé une matrice avec les operations nécessaire pour eliminer une ligne, puis tu multiplie cette matrice avec les 2 matrices A et I.

    A la fin, tu as l'identité dans A et l'inverse dans I.

    Ca fait 2 multiplications de matrices (n*n) par étape. Et apres tu dits que ma méthode fait plus de calcul !!

    Bon, alors les modifs a faire (j'ai pas testé):

    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
    ...
    for (int j=0;j<A.rows_;j++) {
           //Declaration de P2 (Matrice identité avec le pivot)
           Matrice P2=P;
    
           //Cherche la ligne avec le pivot max (absolue)
           int bestline = j;
           pivot=A(j,bestline);
           for (int i=j+1;i<A.rows_;i++) {
               if (fabs(A(j,i))>fabs(pivot)) {
                   bestline=i;
                   pivot=A(j,bestline);
               }
           }
    
           if (pivot==0) {
               cerr<<"Inversion : Le pivot est nul,inversion impossible !!";
    	   exit(EXIT_FAILURE);
           }
    
           //Echange des lignes si necessaire
           if (bestline!=j) {
               fraction tmp;
               for (int i=0;i<A.rows_;i++) {
                   tmp=A(i,j);
                   A(i,j)=A(i,bestline);
                   A(i,bestline)=tmp;
               }
           }
    
           for (int i=0;i<A.rows_;i++) {
                   if (i==j) {
                      P2(i,j)=1/A(i,j);   
                   } else {
                      P2(i,j)=-1*(A(i,j)/pivot);
                   }
           }
           //Calcul de l'inverse 
           A=P2*A;
           I=P2*I;
    }
    ...

  4. #24
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Citation Envoyé par jmjmjm
    une autre petite question, trouve ton toujours une solution avec cette methode ?? car comme on ne prend pas les ligne deja utilisé la solution de la fin peut etre dans les lignes du debut, vois tu ce que je veux dire ??
    Si tu ne peux pas trouver de valeur non-nulle dans les lignes restantes, c'est que ta matrice n'est PAS inversible. Jamais.

    Citation Envoyé par jmjmjm
    Derniere question (promis ) pourquoi prendre le pivot le plus elever un pivot different de 0 suffit non ??
    Oui, ca suffit. On prend le plus grand pour diminuer les erreurs de calculs:
    si tu prends un pivot proche de 0, son inverse sera proche de l'infini... et donc ca risque de "dépasser" la valeur max possible d'un float/double.

  5. #25
    Membre averti
    Avatar de jmjmjm
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2005
    Messages : 760
    Points : 439
    Points
    439
    Par défaut
    salut pseudo code , je viens de tester ta methode mais malheureusement ca ne marche pas, j'ai essayer de comprendre pourquoi et il se trouve sue j'ai un declage dans la reponse de ce style :

    ligne 1
    ligne 2
    ligne 4
    ligne 3


    les valeurs sont bonne mais sont decale les resultats de la ligne 3 sont en 4 et ceux de la ligne 4 sont en 3 !:!

    Sais tu de quoi cela peut venir ?

  6. #26
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Ah oui, j'ai oublié d'echanger les lignes egalement dans la matrice I.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //Echange des lignes si necessaire
    if (bestline!=j) {
        fraction tmp;
        for (int i=0;i<A.rows_;i++) {
            tmp=A(i,j);  A(i,j)=A(i,bestline);  A(i,bestline)=tmp;
            tmp=I(i,j);  I(i,j)=I(i,bestline);  I(i,bestline)=tmp;
        }
    }
    NB: Ca serait quand meme plus simple d'implementer l'aglo tel qu'indiqué dans le PDF.

  7. #27
    Membre averti
    Avatar de jmjmjm
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2005
    Messages : 760
    Points : 439
    Points
    439
    Par défaut
    oups c'est pire maintenant la ligne 3 est inverse avec la ligne 4 et la colonne 4 est inverse avec le colone 3 !!

    Je ne comprend pas ce qui se passe

  8. #28
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Citation Envoyé par jmjmjm
    oups c'est pire maintenant la ligne 3 est inverse avec la ligne 4 et la colonne 4 est inverse avec le colone 3 !!

    Je ne comprend pas ce qui se passe
    Bon, va falloir que je tape l'algo alors

  9. #29
    Membre averti
    Avatar de jmjmjm
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2005
    Messages : 760
    Points : 439
    Points
    439
    Par défaut
    si tu pouvais ce serait sympa car j'aimerais finir mon programme pour ce soir
    tu connais le simplexe de dantzig ?? mon programme permet de faire tout le systeme avec des valeurs exact pas de nombre a virgule et pour l'instant ca marche sauf si je tombe sur un pivot nul dans mon inverse (

  10. #30
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Citation Envoyé par jmjmjm
    si tu pouvais ce serait sympa car j'aimerais finir mon programme pour ce soir
    tu connais le simplexe de dantzig ?? mon programme permet de faire tout le systeme avec des valeurs exact pas de nombre a virgule et pour l'instant ca marche sauf si je tombe sur un pivot nul dans mon inverse (
    heu non... je connais pas.

    Une question A[i][j]... ca represente quoi "i" et "j" en terme de colonne/ligne

  11. #31
    Membre averti
    Avatar de jmjmjm
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2005
    Messages : 760
    Points : 439
    Points
    439
    Par défaut
    i : ligne
    j : colonne

    pour pas te faire chier a reffaire tout les truc (multiplication matrice etc etc )

    voila mon matrice .h
    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
    #include "Fractionnel.h"
    #include <stdexcept>
    #include <iomanip>
     
    class Matrice {
       public:
          Matrice (unsigned rows=1, unsigned cols=1);
          void Resize (unsigned rows, unsigned cols);
          fraction& operator() (unsigned row, unsigned col);
          fraction  operator() (unsigned row, unsigned col) const;
     
          ~Matrice();                              // Destructeur
          Matrice(const Matrice& m);               // Constructeur de copie
          Matrice& operator= (const Matrice& m);   // Opérateur d'assignement
     
     
          void affiche();                          //Fonction pour l'affichage                         
          friend Matrice Inverse(Matrice);         //Inverse par la methode du pivot
     
          //Calcul entre matrice
          friend Matrice operator+(Matrice,Matrice);
          friend Matrice operator-(Matrice,Matrice);
          friend Matrice operator*(Matrice,Matrice);   
     
       private:
          unsigned rows_, cols_;
          fraction* data;
    };
    et mon matrice .cpp
    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    #include "Matrice.h"
    #include <stdexcept>
    #include <iomanip>
     
    inline Matrice::Matrice(unsigned rows, unsigned cols)
        : rows_ (rows)
        , cols_ (cols)
    {
        if (rows == 0 || cols == 0)
           throw out_of_range("Erreur la taille de la matrice est de 0 !!");
        data = new fraction[rows * cols];
        for (int i=0;i<(rows*cols);i++) data[i]="0";
    }
     
    void Matrice::Resize(unsigned rows, unsigned cols)
    {
     
        if (rows == 0 || cols == 0)
           throw out_of_range("Erreur la taille de la matrice est de 0 !!");
        delete[] data;
        rows_=rows;
        cols_=cols; 
        data = new fraction[rows * cols];
        for (int i=0;i<(rows*cols);i++) data[i]="0";       
    }
     
    inline Matrice::Matrice(const Matrice& m) 
           : rows_ (m.rows_)
           , cols_ (m.cols_)
    {
           data = new fraction[rows_*cols_];
     
           for (int i=0;i<rows_;i++) {
               for (int j=0;j<cols_;j++) {
                   operator()(i,j)=m(i,j);
               }
           }
    }
     
    Matrice& Matrice::operator= (const Matrice& m)
    {
       if(this != &m) 
       {
          if(m.cols_ != cols_ || m.rows_ != rows_) {
             delete[] data;
             rows_ = m.rows_;
             cols_ = m.cols_,
             data = new fraction[rows_*cols_];
          }
     
           for (int i=0;i<rows_;i++) {
               for (int j=0;j<cols_;j++) {
                   operator()(i,j)=m(i,j);
               }
           }
       return *this;
       }
    }
     
     
    inline Matrice::~Matrice()
    {
        delete[] data;
    }
     
    inline fraction& Matrice::operator() (unsigned row, unsigned col)
    {
        if (row >= rows_ || col >= cols_)
           throw out_of_range("Indice hors matrice");
        return data[cols_*row + col];
    }
     
    inline fraction Matrice::operator() (unsigned row, unsigned col) const
    {
        if (row >= rows_ || col >= cols_)
           throw out_of_range("Indice hors matrice");
        return data[cols_*row + col];
    }
     
    //Affichage de la Matrice
    void Matrice::affiche() 
    {
         for ( int row=0;row<rows_;row++) {
             cout << "[";
             for (int col=0;col<cols_;col++) {
                 std::ostringstream oss;
                 oss << operator()(row,col);
                 cout <<setw(6) << oss.str();
             }
         cout <<"]"<<endl;
         }
    }
     
    ////////////////////////////////////////////
    //          FONCTIONS AMIES              ///
    ////////////////////////////////////////////
     
    //Surdéfinition de l'operateur +
    Matrice operator+ (const Matrice a,const Matrice b)
    {
       if ((a.rows_==b.rows_) and (a.cols_==b.cols_)) {     
          Matrice c(a.rows_,a.cols_);
          for (int i=0; i<c.rows_; i++) { 
              for (int j=0; j<c.cols_; j++) {
                  c(i,j) = a(i,j) + b(i,j); 
              }
          }  
       return c;
       } else exit(EXIT_FAILURE);
    }
     
    //Surdéfinition de l'operateur -
    Matrice operator- (const Matrice a,const Matrice b)
    {
       if ((a.rows_==b.rows_) and (a.cols_==b.cols_)) {     
          Matrice c(a.rows_,a.cols_);
          for (int i=0; i<c.rows_; i++) { 
              for (int j=0; j<c.cols_; j++) {
                  c(i,j) = a(i,j) - b(i,j); 
              }
          }  
       return c;
       } else exit(EXIT_FAILURE);
    }
     
    //Surdéfinition de l'operateur * 
    Matrice operator* (Matrice a, Matrice b)
    {
        if (a.cols_ == b.rows_) {
            Matrice c(a.rows_,b.cols_);
            for (int i=0;i<c.rows_;i++) {
                for (int j=0;j<c.cols_;j++) {
                    for (int k=0;k<a.cols_;k++) {
                        c(i,j)=a(i,k)*b(k,j)+c(i,j);
                    }
                }
            }
        return c;
        } else cerr <<"La multiplication de ces deux matrices est impossible";
    }
     
    //Inversion d'une matrice par la méthode du Pivot de Gauss-Jordan
    Matrice Inverse(Matrice A)
    {
        //Une matrice peut etre inverser que si elle est carrée
        if (A.rows_ == A.cols_) {
            fraction pivot;
            //Déclaration de la matrice identitée (1,0,0;0,1,0;0,0,1)
            Matrice P(A.rows_,A.cols_);
            for (int i=0;i<A.rows_;i++)
                for (int j=0;j<A.rows_;j++)
                    if (i==j) P(i,j)=1;
            //Déclaration de la matrice inverse de A
            Matrice I=P;
     
           for (int j=0;j<A.rows_;j++) {
              //Declaration de P2 (Matrice identité avec le pivot)
              Matrice P2=P;
              //Cherche la ligne avec le pivot max (absolue)
              int bestline = j;
              pivot=A(j,bestline);
              for (int i=j+1;i<A.rows_;i++) {
                  if (Abs(A(j,i))>Abs(pivot)) {
                     bestline=i;
                     pivot=A(j,bestline);
                  }
              }
     
              if (pivot==0) {
                 cerr<<"Inversion : Le pivot est nul,inversion impossible !!";
    	         exit(EXIT_FAILURE);
              }
     
              //Echange des lignes si necessaire
              if (bestline!=j) {
                 fraction tmp;
                 cout<<"Echange ligne !!!";
                 for (int i=0;i<A.rows_;i++) {
                     tmp=A(i,j); A(i,j)=A(i,bestline); A(i,bestline)=tmp;
                     tmp=I(i,j); I(i,j)=I(i,bestline); I(i,bestline)=tmp;
                 }
              }           
     
              for (int i=0;i<A.rows_;i++) {
                  if (i==j) 
                     P2(i,j)=1/A(i,j);   
                  else 
                    P2(i,j)=-1*(A(i,j)/pivot);
              }
              //Calcul de l'inverse 
              A=P2*A;
              I=P2*I;
           }
           return I;                 
        } else cerr<<"Inversion : La matrice n'est pas carré !!";
        exit(EXIT_FAILURE);
    }

    au passage tu pourras me dire ce que tu en penses

  12. #32
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Citation Envoyé par jmjmjm
    i : ligne / j : colonne
    Ah bah c'est sur que mon code doit pas marcher terrible

    Essaye comme ca, pour voir:
    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
     
    //Cherche la ligne avec le pivot max (absolue)
    int bestline = j;
    pivot=A(bestline,j);
    for (int i=j+1;i<A.rows_;i++) {
        if (Abs(A(i,j))>Abs(pivot)) {
           bestline=i;
           pivot=A(bestline,j);
        }
    }
     
    (...)
     
    //Echange des lignes si necessaire
    if (bestline!=j) {
       fraction tmp;
       cout<<"Echange ligne !!!";
       for (int x=0;x<A.cols_;x++) {
           tmp=A(j,x); A(j,x)=A(bestline,x); A(bestline,x)=tmp;
           tmp=I(j,x); I(j,x)=I(bestline,x); I(bestline,x)=tmp;
       }
    }

  13. #33
    Membre averti
    Avatar de jmjmjm
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2005
    Messages : 760
    Points : 439
    Points
    439
    Par défaut
    T vraiment genial ca fonctionne !!
    Super !! Merci !!



    Tu sais quoi le pire c'est que j'y ai penser tout a l'heure je me suis dit que tu m'avais parler des lignes et je trouvais ca bizar d'inverser les colonnes j'ai donc changer les i en j et le j en i mais ca ne marchais pas ( c grace à la ligne que tu m'a donner tout a l'heure que ca fonctionne maintenant

    Merci bien je vais pouvoir tenter de finir mon programme mais ca devrait aller c'etait ca mon gros probleme !!

  14. #34
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    j'ai tellement l'habitude de faire mes matrices/tableaux en X , Y que j'ai meme pas regardé dans quel sens etaient les tiens.

    Bon, tant que ca marche, c'est le principal

    A+

    Edit: le code en Java (sale) pour la postérité
    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
    78
    79
    80
    81
    82
     
    class Matrice {
     
    	// les données de la matrice ordonnnée en [x=colonne][y=ligne]
    	public double value[][];
     
    	// les dimensions de la matrice
    	public int rows, cols;
     
    	// constructeur
    	public Matrice(int cols, int rows) {
    		this.cols = cols;
    		this.rows = rows;
    		this.value = new double[this.cols][this.rows];
    	}
     
    	// inversion par pivot de Gauss
    	public Matrice inverse(Matrice A) {
     
    		//Une matrice ne peut etre inversée que si elle est carrée.
    		if (A.rows != A.cols) {
    			System.err.println("Inversion : La matrice n'est pas carré !!");
    			return null;
    		}
     
    		// Création de la matrice de travail T = [ A | Identité ]
    		Matrice T = new Matrice(A.cols * 2, A.cols);
    		for (int y = 0; y < A.rows; y++) {
    			for (int x = 0; x < A.cols; x++) {
    				T.value[x][y] = A.value[x][y];
    				if (x == y)	T.value[A.cols + x][y] = 1;
    			}
    		}
     
    		// Pour chaque ligne de la matrice T
    		for (int x = 0; x < T.rows; x++) {
     
    			// Cherche la ligne avec le pivot max (en valeur absolue)
    			int bestline = x;
    			double pivot = T.value[x][bestline];
    			for (int y = x + 1; y < T.rows; y++) {
    				if (Math.abs(T.value[x][y]) > Math.abs(pivot)) {
    					bestline = y;
    					pivot = T.value[x][bestline];
    				}
    			}
     
    			if (pivot == 0) {
    				System.err.println("Inversion : Le pivot est nul,inversion impossible !!");
    				return null;
    			}
     
    			// Echange des lignes (si necessaire)
    			if (bestline != x) {
    				double tmp;
    				for (int t = 0; t < T.cols; t++) {
    					tmp = T.value[t][x]; T.value[t][x] = T.value[t][bestline]; T.value[t][bestline] = tmp;
    				}
    			}
     
    			// Normalisation de la ligne du pivot
    			for (int t = 0; t < T.cols; t++) T.value[t][x] /= pivot;
     
    			// elimination des autres lignes
    			for (int y = 0; y < T.rows; y++) {
    				if (y==x) continue;
    				double coef = T.value[x][y];
    				for (int t = 0; t < T.cols; t++) T.value[t][y] -= coef * T.value[t][x];
    			}
    		}
     
     
    		// recupere la partie droite de T qui contient l'inverse de A
    		// (la partie gauche devrait contenir l'identité)
    		Matrice inverse = new Matrice(A.cols,A.rows);
    		for (int y = 0; y < A.rows; y++)
    			for (int x = 0; x < A.cols; x++)
    				inverse.value[x][y] = T.value[A.cols+x][y];
     
    		return inverse;
    	}
    }

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [Débutant] Code Pivot de Gauss
    Par didier35 dans le forum MATLAB
    Réponses: 1
    Dernier message: 27/03/2014, 22h27
  2. programme pivot de Gauss
    Par azertysq123 dans le forum MATLAB
    Réponses: 7
    Dernier message: 17/11/2010, 18h39
  3. Résolution pivot de Gauss
    Par haraigo dans le forum C
    Réponses: 7
    Dernier message: 16/05/2008, 23h08
  4. Explication de pivot de gauss
    Par bilou_2007 dans le forum Mathématiques
    Réponses: 6
    Dernier message: 01/03/2007, 22h33
  5. [LG]Matrice et pivot de Gauss
    Par Loopingus dans le forum Langage
    Réponses: 3
    Dernier message: 16/03/2005, 17h26

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