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

Algorithmes et structures de données Discussion :

Inversion et déterminant d'une matrice


Sujet :

Algorithmes et structures de données

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Inversion et déterminant d'une matrice
    voilà je dois réaliser un projet sur les calculs matriciel!
    il me faudrait une solution pour faire une procedure pour faire linverse dune matrice! son determinant!
    et son exponentielle!tout ça pour des matrices de toutes dimensions!pas forcement des matrices carrés!
    jai déja réaliser le produi laffichage la somme....
    merci d'avance!

    [titre édité par Nono40]
    Ancien titre : bonjour !
    Merci de respecter les règles

  2. #2
    Rédacteur
    Avatar de Giovanny Temgoua
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    3 830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 3 830
    Points : 4 006
    Points
    4 006
    Par défaut
    Bonjour !

    Merci d'utiliser le forum approprié pour poser votre problème, et d'utiliser des titres plus explicites. "Bonjour" n'est pas très approprié...

    Je déplace votre message dans le forum Algorithme où il aura certainement de solutions plus adéquates.

    Ce forum est réservé aux questions spécifiques à Delphi. (questions que vous aurez probablement à l'implémentation de votre algorithme)

  3. #3
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    Dois tu developper tes propres solutions ?

    Parceque au niveau des calculs matricielles je te suggere de regarder la librarie LAPACK. anciennement en FORTRAN mais qui possede un equivalent C nommé CLAPACK.

    Cette librairie est actuellement la plus performante en matiere de matrice, elle est utilisé par MATLAB.

    Le code est disponible sur le web si tu veux l'analyser et je pense que il y a beaucoup de doc dessus aussi. Mais attention c compliqué

    XXiemeciel
    XXiemeciel

  4. #4
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut
    L'écriture que je préfère pour M^-1 est

    M^-1 = 1/ Det(M) * Transposée ( Commatrice(M))

    car elle est compacte et montre très bien sa construction.
    Numériquement cela est en général peu approprié car il y a un très grand nombre de det à calculer, chacun d'entre eux etant une fonction récursive en fonction d'un développement suivant une ligne ou une colonne.


    Numériquement le plus sur et + rapide devrait être une décomposition L.U de M

    L est une matrice triangulaire Low ( Lij > 0 si j > i) et U est une matrice triangulaire Up ( Uij = 0 si i > j ).
    il y a N^2 + N inconnues pour N^2 équations. On peut fixer Lii=1.

    Le système restant se résoud alors sans diffculté

    M^-1 et det(M) en découlent immédiatement.

  5. #5
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    Oui effectivement la decomposition LU est efficace, c'est un des algorithmes utilisé par LAPACK.

    XXiemeciel
    XXiemeciel

  6. #6
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut
    une bonne description se trouve sur :


    http://www.library.cornell.edu/nr/bookcpdf/c2-3.pdf

  7. #7
    Membre émérite

    Homme Profil pro
    Inscrit en
    Juillet 2003
    Messages
    2 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 2 075
    Points : 2 844
    Points
    2 844
    Par défaut
    Bonjour
    Que veut dire le ^? J'arrive jamais à savoir en logique ça désigne ET mais ici? Un quotient?
    Merci

  8. #8
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    C 'est le symbole de l'élévation à la puissance.
    N^2 => N²
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  9. #9
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut Re: Inversion et déterminant d'une matrice
    Citation Envoyé par coline
    voilà je dois réaliser un projet sur les calculs matriciel!
    il me faudrait une solution pour faire une procedure pour faire linverse dune matrice! son determinant!
    et son exponentielle!tout ça pour des matrices de toutes dimensions!pas forcement des matrices carrés!
    jai déja réaliser le produi laffichage la somme....
    merci d'avance!
    L'inverse d'une matrice non carrée n'existe pas, il faut plutôt voir du côté de la pseudo-inverse.
    Il y a plusieurs algos qui existent pour l'inverse.
    Pour le déterminant, qqs opérations de houseolder te permettront de rendre ta matrice triangulaire supérieure ou inférieure.
    Pour l'exponentielle, tu diagonalises ta matrice puis tu prends l'exponentielle des valeurs propres. Si tu ne peux pas diagonaliser la matrice, c'est qu'elle n'a peut-être pas d'exponentielle.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 417
    Points : 372
    Points
    372
    Par défaut Re: Inversion et déterminant d'une matrice
    Citation Envoyé par Miles
    Si tu ne peux pas diagonaliser la matrice, c'est qu'elle n'a peut-être pas d'exponentielle.
    Désolé de te contredire Miles. Toute matrice carrée réelle a une exponentielle, tout simplement parce que la série:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    exp(M) = I + M + (M^2)/(2!) + ... + (M^n)/(n!) + ...
    est normalement convergente.

    Je pense que dans le cas d'une matrice carrée réelle qui commute avec sa transposée (chose facile à vérifier), le calcul de l'exponentielle doit pouvoir se faire de manière efficace. En effet, une telle matrice représente un endomorphisme normal de l'espace euclidien R^n. Or pour un tel endomorphisme, R^n se décompose en somme directe orthogonale de droites et plans tous stables par cet endomorphisme. Une fois cette décomposition établie, on a juste a calculer des exponentielles de réels ou de matrice 2x2 de similitudes (donc de nombre complexes) ou de matrice 2x2 symétriques. La démonstration de ce théorème est très certainement assez constructive pour être programmée. On la trouvera par exemple ici.

  11. #11
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Oups, pardon

  12. #12
    Membre éprouvé Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Points : 1 213
    Points
    1 213
    Par défaut
    Pour l'inverse, y a + simple:

    Tu accoles à droite de te matrice M la matrice I (diagonale avec que des 1).
    Puis tu fais sur MI un "full"-pivot de Gauss (i.e. une ligne ayant déjà été choisi pour pivot sera modifiée par les autres pivots), de telle sorte que tu arrives à IN.

    L'inverse de M, c'est N !

    Et si tu ne pas arrive à I à gauche (i.e. il y a des lignes à zéro), c'est que M n'est pas inversible, soit detM=0...
    Nemerle, mathématicopilier de bars, membre du triumvirat du CSTM, 3/4 centre

  13. #13
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 16
    Points : 10
    Points
    10
    Par défaut pb avec la methode de gauss jordan
    Bonjour,

    Je cherche aussi a inverser des matrices (carrees pour ma part).
    J'utlise actuellement la methode de Gauss-jordan qui constite comme decrit precedemment a ajouter la matrice identite I puis d'utliser la methode du pivot de Gauss pour retrouver cette matrice I.
    Je compte mettre en place un petit test sur le determinant afin de verifier qu'il ne soit pas nul.
    Le pb est que cette methode doit etre mal implementee car je rencontre de nombreux pb lorsque je la teste avec des matrices simples.

    Auriez vou une proposition de code (pour cette methode ou une autre du type:1/det(A) *trans(com(A)) )

    Merci!

  14. #14
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut
    Voici un petit code que j'ai utilisé bien des fois. Il est en pascal et utilisable sous Delphi.

    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
     
     
    unit mat17_inv;
     
    interface
     
    const   C_17  = 17;
    const   C_32  = 32;
     
    type Matrice  = array[1..C_32,1..C_32] of Extended;
     
    function inverse_M( rg : integer; M: matrice; var M_1 : Matrice) : boolean;
     
    implementation
     
    procedure Somme(rg : integer; MatA,MatB:Matrice;  var MatC:Matrice);
    var i,j       : byte;
       begin
       for i:=1 to rg do  for j:=1 to rg do
          MatC[i,j]               :=  MatA[i,j] + MatB[i,j]
       end;
    procedure Difference(rg : integer; MatA,MatB:Matrice;var MatC:Matrice);
    var i,j       : byte;
       begin
       for i:=1 to rg do for j:=1 to rg do
          MatC[i,j]               :=  MatA[i,j] - MatB[i,j]
       end;
    procedure Produit(rg : integer; MatA,MatB:Matrice;var MatC:Matrice);
    var i,j,k     : byte;
       begin
       fillchar(MatC,sizeof(MatC),0);
       for i:=1 to rg do for j:=1 to rg do for k:=1 to rg do
          MatC[i,j]               :=  MatC[i,j]+MatA[i,k] * MatB[k,j]
       end;
    function Norme_Ligne(rg : integer; B:Matrice):Extended;
    var Tmp,Tmp2  : Extended;
        i,j       : byte;
       begin
       Tmp                        :=  0;
       for i:=1 to rg do
          begin
          Tmp2                    :=  0;
          for j:=1 to rg do
             Tmp2                 :=  Tmp2 + abs(B[i,j]);
          if Tmp2>Tmp then
             Tmp                  :=  Tmp2
          end;
       Norme_Ligne                :=  Tmp
       end;
    function Norme_Colonne(rg : integer; B:Matrice):Extended;
    var Tmp,Tmp2  : Extended;
        i,j       : byte;
       begin
       Tmp                        :=  0;
       for i:=1 to rg do
          begin
          Tmp2                    :=  0;
          for j:=1 to rg do
             Tmp2                 :=  Tmp2 + abs(B[j,i]);
          if Tmp2>Tmp then
             Tmp                  :=  Tmp2
          end;
       Norme_Colonne              :=  Tmp
       end;
    procedure Calcule_E(rg : integer; var A, B, E, Id : matrice);
    var C         : Matrice;
       begin
       Produit(rg, B, A, C);
       Difference(rg, Id, C, E)
       end;
    procedure Init(rg : integer; A:Matrice;var B,Id :Matrice;var OK:boolean);
    var i,j       : byte;
        T         : Extended;
       begin
       fillchar(Id,SizeOf(Id),0);
       T                          :=  Norme_Ligne(rg, A) * Norme_Colonne(rg, A);
       if abs(T)>1E-100 then
          begin
          OK                      :=  True;
          for i:=1 to rg do
             begin
             Id[i,i]              :=  1;
             B[i,i]               :=  A[i,i]/T;
             for j:=i+1 to rg do
                begin
                B[i,j]            :=  A[j,i]/T;
                B[j,i]            :=  A[i,j]/T
                end
             end
          end
       else
          OK                      :=  false
       end;
    procedure Calcule_B( rg : integer; var B,E,Id : Matrice);
    var C,D       : Matrice;
       begin
       Somme(rg,Id,E,D);
       Produit(rg,D,B,C);
       B                          :=  C
       end;
    const Seuil_  = 1e-17;
    const max_CPT = 225;
    function Inverse_M(rg : integer; M : Matrice; var  M_1 : Matrice) : boolean;
    var Id,E,B    : Matrice;
        Old,New   : Extended;
        Cpt       : byte;
        Ok        : boolean;
       begin
       Init(rg, M, B, Id, Ok);
       if  OK then
           begin
           Calcule_E(rg, M, B, E, Id );
           Old                    :=  Norme_Ligne(rg, E);
           New                    :=  Old;
           Cpt                    :=  0;
           while not ( (New < Seuil_) or ((New > Old) and (Cpt>max_CPT))) do
              begin
              Old                 :=  New;
              Calcule_B(rg, B, E, Id);
              Calcule_E(rg, M, B, E, Id );
              New                 :=  Norme_Ligne(rg, E);
              inc(Cpt)
              end;
           Ok                     :=  New < Seuil_;
           M_1                    :=  B
           end;
       Inverse_M                  :=  Ok
       end;
    end.

  15. #15
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 16
    Points : 10
    Points
    10
    Par défaut Merci
    Merci, pour ce code mais etant nouveau dans la programmation je me noie un peu avec ce langage qui m'est inconnu
    Aurais tu le meme sous C. Ou peut etre des docs a me conseiller

    Merci en tout cas

  16. #16
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut
    voir les Numerical Recipes que j'ai déjà bien souvent proposé.

    http://www.library.cornell.edu/nr/cbookcpdf.html

    pour les matrices / déterminants chapitre 2

  17. #17
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    J'ai regardé le chapitre 2.3.
    J'aimerais bien comprendre (car ce n'est pas très bien expliqué, à mon goût) en quoi une décomposition LU aide à calculer A^-1.B ?
    Qui peut me donner l'explication "mathématique" ?
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

Discussions similaires

  1. Déterminant d'une matrice de taile quelconque
    Par TREM1000 dans le forum Débuter
    Réponses: 1
    Dernier message: 01/05/2008, 19h51
  2. Déterminant d'une matrice
    Par mister3957 dans le forum Développement 2D, 3D et Jeux
    Réponses: 3
    Dernier message: 05/11/2007, 15h41
  3. Déterminant d'une matrice
    Par sarrou dans le forum C
    Réponses: 5
    Dernier message: 28/11/2006, 10h57
  4. [Matrices] Comment calculer le Déterminant d'une matrice 4x4
    Par cyber_N dans le forum Algorithmes et structures de données
    Réponses: 70
    Dernier message: 19/08/2005, 15h47
  5. [Débutant] Calculer le déterminant d'une matrice
    Par v4np13 dans le forum Mathématiques
    Réponses: 7
    Dernier message: 30/05/2005, 17h24

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