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

Fortran Discussion :

Inverse de matrice


Sujet :

Fortran

  1. #1
    Débutant
    Inscrit en
    Juillet 2007
    Messages
    386
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 386
    Points : 119
    Points
    119
    Par défaut Inverse de matrice
    Bonjour,

    j'ai écrit un code pour calculer l'inverse d'une matrice. Ca marche si j'entre la matrice élément par élément mais, si je définis la matrice d'une autre façon, comme par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    do i=1,3
        do j=1,3
            A(i,j)=real(i)*real(j)
        enddo
    enddo
    ça ne marche pas ! Alors où est l'erreur ?
    Merci pour votre aide

    Voilà mon 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
    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
     
          program in
          parameter(m=2)
          integer i,j
          double precision A(m,m),B(m,m),X(m,m),res(m,m),S(m,m)
          A(1,1)=1.d0
          A(1,2)=2.d0
          A(2,1)=3.d0
          A(2,2)=4.d0
          call inverse(m,A,X)
          print*,'X=',X
          end
     
     
     
          subroutine inverse(m,A,X)
          integer i,j
          double precision A(m,m),B(m,m),X(m,m)
          do i=1,m
             do j=1,m
                X(i,j)=0.d0
                B(i,j)=0.d0
             enddo
             B(i,i)=1.d0
          enddo
          do j=1,m
             call LU(m,A,B(1,j),X(1,j))
          enddo
          return
          end
     
          subroutine LU(m,A1,B,X)
          integer m,i,j
          double precision A1(m,m),L1(m,m),U1(m,m),X(m),
         &           Kl(m),B(m),somme
    !     initiation de L,U     !
          do i=1,m
             do j=1,m
                L1(i,j)=0.d0
                U1(i,j)=0.d0
             enddo
          enddo
    ! initialisation de la diagonale de L
          do i=1,m
             L1(i,i)=1.d0
          enddo
    !      calcul de L et de U
          do i=1,m
    !         cas j<i
             do j=1,i-1
                somme=0.d0
                do k=1,j-1
                   somme=somme+L1(i,k)*U1(k,j)
                enddo
                   L1(i,j)=(A1(i,j)-somme)/(U1(j,j))
             enddo
     
    !         cas j>i et j=i
             do j=i,m
                somme=0.d0
                do k=1,i-1
                   somme=somme+L1(i,k)*U1(k,j)
                enddo
                   U1(i,j)=A1(i,j)-somme
             enddo
          enddo
          Call triangleL(m,L1,B,Kl)
          Call triangleU(m,U1,Kl,X)
     
          return
          end
     
    ! subroutine pour la resolution des systemes !triangulaire superieur
             subroutine triangleL(M,C,D,Y)
             double precision C(M,M),D(M),Y(M),S
             integer j,i,M
             Y(1)=D(1)/C(1,1)
             do i=1,M
               S=0.d0
                do j=1,i-1
                   S=S+C(i,j)*Y(j)
                enddo
              Y(i)=(1./C(i,i))*(D(i)-S)
              enddo
              return
              end
     
    ! subroutine pour la résolution des systemes !triangulaires inferieurs
          subroutine triangleU(M,C,D,Y)
          integer j,i
          double precision C(M,M),D(M),Y(M),S
          Y(M)=D(M)/C(M,M)
           do i=M-1,1,-1
              S = 0.d0
                 do j=i+1,M
                    S=S+C(i,j)*Y(j)
                 enddo
               Y(i)=(D(i)-S)/C(i,i)
           enddo
           return
           end
     
          subroutine matmult(a,b,r,d)
          integer i,r,j,k
          double complex a(r,r),b(r,r),d(r,r)
          do  i=1,r
            do  j=1,r
               d(i,j)=0.d0
              do  k=1,r
                 d(i,j)=d(i,j)+a(i,k)*b(k,j)
              enddo
            enddo
          enddo
          return
          end

  2. #2
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut
    Salut!
    j ai ecrit un code pour calculer linverse d une matrice
    • Pourquoi calculer l'inverse d'une matrice?
    • Pourquoi le programmer toi-meme?

    Jean-Marc Blanc
    Calcul numérique de processus industriels
    Formation, conseil, développement

    Point n'est besoin d'espérer pour entreprendre, ni de réussir pour persévérer. (Guillaume le Taiseux)

  3. #3
    Débutant
    Inscrit en
    Juillet 2007
    Messages
    386
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 386
    Points : 119
    Points
    119
    Par défaut
    j en ai besoin dans un alogirthme,
    c est un terme de type AU=F, avec A,U,F sont des matrice et moi je cherche U.
    ce ne son pas des systemes lineaires!
    et comment le programmer autrement?
    a tu un exemple pour le cas A(i,j)=i*j?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 488
    Points : 593
    Points
    593
    Par défaut
    Bonjour,

    Avec une indication du type
    ca ne marche pas!
    on n'a pas vraiment envie d'aller voir plus loin.
    Si d'autre part tu dis que ton programme marche ... c'est que tu as fait une bourde en construisant ton test, du type avoir déclaré ta matrice d'une certaine taille (m=2 ?) mais la manipuler comme si elle était d'une autre (tu construis une matrice de taille 3 dans l'exemple que tu donnes).

  5. #5
    Débutant
    Inscrit en
    Juillet 2007
    Messages
    386
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 386
    Points : 119
    Points
    119
    Par défaut
    meme si tu prends m=3, c est le meme probleme,
    voila le code qui ne marche pas

    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
     
          program in
          parameter(m=3)
          integer i,j
          double precision A(m,m),B(m,m),X(m,m),res(m,m),S(m,m)
          do i=1,m
              do j=1,m
                  A(i,j)=dble(i)*dble(j)
              enddo
          enddo
          call inverse(m,A,X)
          print*,'X=',X
          end
     
     
     
          subroutine inverse(m,A,X)
          integer i,j
          double precision A(m,m),B(m,m),X(m,m)
          do i=1,m
             do j=1,m
                X(i,j)=0.d0
                B(i,j)=0.d0
             enddo
             B(i,i)=1.d0
          enddo
          do j=1,m
             call LU(m,A,B(1,j),X(1,j))
          enddo
          return
          end
     
          subroutine LU(m,A1,B,X)
          integer m,i,j
          double precision A1(m,m),L1(m,m),U1(m,m),X(m),
         &           Kl(m),B(m),somme
    !     initiation de L,U     !
          do i=1,m
             do j=1,m
                L1(i,j)=0.d0
                U1(i,j)=0.d0
             enddo
          enddo
    ! initialisation de la diagonale de L
          do i=1,m
             L1(i,i)=1.d0
          enddo
    !      calcul de L et de U
          do i=1,m
    !         cas j<i
             do j=1,i-1
                somme=0.d0
                do k=1,j-1
                   somme=somme+L1(i,k)*U1(k,j)
                enddo
                   L1(i,j)=(A1(i,j)-somme)/(U1(j,j))
             enddo
     
    !         cas j>i et j=i
             do j=i,m
                somme=0.d0
                do k=1,i-1
                   somme=somme+L1(i,k)*U1(k,j)
                enddo
                   U1(i,j)=A1(i,j)-somme
             enddo
          enddo
          Call triangleL(m,L1,B,Kl)
          Call triangleU(m,U1,Kl,X)
     
          return
          end
     
    ! subroutine pour la resolution des systemes !triangulaire superieur
             subroutine triangleL(M,C,D,Y)
             double precision C(M,M),D(M),Y(M),S
             integer j,i,M
             Y(1)=D(1)/C(1,1)
             do i=1,M
               S=0.d0
                do j=1,i-1
                   S=S+C(i,j)*Y(j)
                enddo
              Y(i)=(1./C(i,i))*(D(i)-S)
              enddo
              return
              end
     
    ! subroutine pour la résolution des systemes !triangulaires inferieurs
          subroutine triangleU(M,C,D,Y)
          integer j,i
          double precision C(M,M),D(M),Y(M),S
          Y(M)=D(M)/C(M,M)
           do i=M-1,1,-1
              S = 0.d0
                 do j=i+1,M
                    S=S+C(i,j)*Y(j)
                 enddo
               Y(i)=(D(i)-S)/C(i,i)
           enddo
           return
           end
     
          subroutine matmult(a,b,r,d)
          integer i,r,j,k
          double complex a(r,r),b(r,r),d(r,r)
          do  i=1,r
            do  j=1,r
               d(i,j)=0.d0
              do  k=1,r
                 d(i,j)=d(i,j)+a(i,k)*b(k,j)
              enddo
            enddo
          enddo
          return
          end

  6. #6
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut
    Salut!
    c est un terme de type AU=F, avec A,U,F sont des matrice et moi je cherche U.
    ce ne son pas des systemes lineaires!
    Si A, U et F sont des matrices, alors AU=F est un système linéaire avec plusieurs seconds membres. D'autre part, je ne vois toujours pas pourquoi tu as besoin d'inverser une matrice.
    j en ai besoin dans un alogirthme
    Ah! ce que j'ai envie de plagier Ehouarn:
    on n'a pas vraiment envie d'aller voir plus loin.
    Jean-Marc Blanc
    Calcul numérique de processus industriels
    Formation, conseil, développement

    Point n'est besoin d'espérer pour entreprendre, ni de réussir pour persévérer. (Guillaume le Taiseux)

  7. #7
    Débutant
    Inscrit en
    Juillet 2007
    Messages
    386
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 386
    Points : 119
    Points
    119
    Par défaut
    Cher Jean Marc,
    ce que je cherche c est un code pour resoudre les systemes lineaires (car ca m aide a inverser la matrice) , si tu as merci de me le dire, et comment ca marche

  8. #8
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut
    Salut!
    LINPACK ou LAPACK dans www.netlib.org

    D'autre part, j'ai écrit un tutoriel sur le sujet: http://jmblanc.developpez.com/algori...mes-lineaires/
    Jean-Marc Blanc
    Calcul numérique de processus industriels
    Formation, conseil, développement

    Point n'est besoin d'espérer pour entreprendre, ni de réussir pour persévérer. (Guillaume le Taiseux)

  9. #9
    Débutant
    Inscrit en
    Juillet 2007
    Messages
    386
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 386
    Points : 119
    Points
    119
    Par défaut
    merci pour ton aide,
    par contre , comment utiliser la librairie Lapack? ie supposons que je veux inverser la matrice suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    do i=1,3
       do j=1,3
          A(i,j)=real(i*j)
       enddo
    enddo
    qu est ce que j ecrit comme code?

  10. #10
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut
    Salut!
    comment utiliser la librairie Lapack?
    Tout ce qui concerne le choix de la routine à utiliser se trouve dans des fichiers accompagnant la librairie. Tout ce qui concerne l'utilisation d'une routine particulière se trouve dans les lignes de commentaires placées en tête de cette routine. Lis la documentation.
    je veux inverser la matrice suivante
    Si tu avais lu et compris mon tutoriel sur la question, tu saurais que, dans la plupart des cas, il est stupide d'inverser une matrice.
    Jean-Marc Blanc
    Calcul numérique de processus industriels
    Formation, conseil, développement

    Point n'est besoin d'espérer pour entreprendre, ni de réussir pour persévérer. (Guillaume le Taiseux)

  11. #11
    Débutant
    Inscrit en
    Juillet 2007
    Messages
    386
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 386
    Points : 119
    Points
    119
    Par défaut
    comme j ai lu, je remarque que : "LAPACK is written in Fortran90 and provides routines for solving systems of simultaneous linear equations,"
    et moi j utilise le fortran 77, et alors?
    deuxiemement, comment j utilises la librairie dans l execusion?
    et merci

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 45
    Points : 57
    Points
    57
    Par défaut
    Citation Envoyé par FR119492 Voir le message
    Salut!

    Si tu avais lu et compris mon tutoriel sur la question, tu saurais que, dans la plupart des cas, il est stupide d'inverser une matrice.
    Jean-Marc Blanc
    Salut Jean-Marc,

    Je trouve que tu es tres peremptoire dans tes affirmations concernant l'inutilite d'inverser une matrice !

    Je sais que tu fais une "subtile" distinction entre inverser une matrice et resoudre un systeme lineaire. Mais sache que pour 98% des gens cela veut dire la meme chose. Il n'y a que toi qui considere que ce n'est pas pareil. Si le but est d'inverser le systeme lineaire, autrement dit obtenir le vecteur x tel que Ax=b ou A est une matrice et b un vecteur. Ca ne t'aura pas echappe que si tu connais l'inverse de A c 'est a dire A(-1) et bien en faisant le produit A(-1)*b tu auras le vecteur x !!
    Donc rechercher l'inverse d'une matrice est tout simplement une methode parmi tant d'autres pour resoudre le systeme lineaire. Donc contrairement a ce que tu dis ca ne sert pas a rien !!
    Pour resoudre des systemes lineaires comme tu le sais tres bien, il existe des methodes dites "directes" et d'autres "iteratives". Chacune de ces 2 familles de methodes a ses avantages et inconvenients.
    Trouver A(-1) fait partie des methodes directes. Et je ne pense pas que l'on puisse dire que l'eminent mathematicien allemand Gauss qui a invente, entre autre, la methode du pivot de Gauss ( l'une des plus utilisees en methodes directes) soit stupide de l'avoir fait...
    La methode que notre ami cherche a appliquer est aussi une methode directe dite "decomposition LU". Cette methode est tres efficace et peut etre est ce un exercice purement didactique qu'on lui a demande de resoudre. Peut importe....Maintenant si tu peux l'aider fais le, mais dire que c'est stupide et inutile n'ammene rien au debat, alors s'il te plait epargne nous ce genre de commentaires d'autant plus que tu as parfaitement tord sur ce coup la...

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 488
    Points : 593
    Points
    593
    Par défaut
    Bonjour,

    Citation Envoyé par feynman
    meme si tu prends m=3, c est le meme probleme,
    voila le code qui ne marche pas
    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
     
          program in
          parameter(m=3)
          integer i,j
          double precision A(m,m),B(m,m),X(m,m),res(m,m),S(m,m)
          do i=1,m
              do j=1,m
                  A(i,j)=dble(i)*dble(j)
              enddo
          enddo
          call inverse(m,A,X)
          print*,'X=',X
          end
     
     
     
          subroutine inverse(m,A,X)
          integer i,j
          double precision A(m,m),B(m,m),X(m,m)
          do i=1,m
             do j=1,m
                X(i,j)=0.d0
                B(i,j)=0.d0
             enddo
             B(i,i)=1.d0
          enddo
          do j=1,m
             call LU(m,A,B(1,j),X(1,j))
          enddo
          return
          end
     
          subroutine LU(m,A1,B,X)
          integer m,i,j
          double precision A1(m,m),L1(m,m),U1(m,m),X(m),
         &           Kl(m),B(m),somme
    !     initiation de L,U     !
          do i=1,m
             do j=1,m
                L1(i,j)=0.d0
                U1(i,j)=0.d0
             enddo
          enddo
    ! initialisation de la diagonale de L
          do i=1,m
             L1(i,i)=1.d0
          enddo
    !      calcul de L et de U
          do i=1,m
    !         cas j<i
             do j=1,i-1
                somme=0.d0
                do k=1,j-1
                   somme=somme+L1(i,k)*U1(k,j)
                enddo
                   L1(i,j)=(A1(i,j)-somme)/(U1(j,j))
             enddo
     
    !         cas j>i et j=i
             do j=i,m
                somme=0.d0
                do k=1,i-1
                   somme=somme+L1(i,k)*U1(k,j)
                enddo
                   U1(i,j)=A1(i,j)-somme
             enddo
          enddo
          Call triangleL(m,L1,B,Kl)
          Call triangleU(m,U1,Kl,X)
     
          return
          end
     
    ! subroutine pour la resolution des systemes !triangulaire superieur
             subroutine triangleL(M,C,D,Y)
             double precision C(M,M),D(M),Y(M),S
             integer j,i,M
             Y(1)=D(1)/C(1,1)
             do i=1,M
               S=0.d0
                do j=1,i-1
                   S=S+C(i,j)*Y(j)
                enddo
              Y(i)=(1./C(i,i))*(D(i)-S)
              enddo
              return
              end
     
    ! subroutine pour la résolution des systemes !triangulaires inferieurs
          subroutine triangleU(M,C,D,Y)
          integer j,i
          double precision C(M,M),D(M),Y(M),S
          Y(M)=D(M)/C(M,M)
           do i=M-1,1,-1
              S = 0.d0
                 do j=i+1,M
                    S=S+C(i,j)*Y(j)
                 enddo
               Y(i)=(D(i)-S)/C(i,i)
           enddo
           return
           end
     
          subroutine matmult(a,b,r,d)
          integer i,r,j,k
          double complex a(r,r),b(r,r),d(r,r)
          do  i=1,r
            do  j=1,r
               d(i,j)=0.d0
              do  k=1,r
                 d(i,j)=d(i,j)+a(i,k)*b(k,j)
              enddo
            enddo
          enddo
          return
          end
    Je te suggère de suivre la procédure standard pour vérifier que ton code fait bien ce que tu penses qu'il doit faire:
    • Teste séparément chaque routine, en affichant chaque étape (le résultat de chaque calcul intermédiaire) sur des cas simples (résolus à la main avec un papier et un crayon).
    • Utilise des "implicit none" et d'une façon générale toutes les options de compilations aidant à isoler/repérer les erreurs (voir la doc de ton compilateur).
    • Reprend un papier et un crayon et construit un cas test complet dont la résolution suit la méthode employée par ton programme, à nouveau en affichant les étapes intermédiaires.

    Avec un peu de méthode tu devrais trouver ce qui ne va pas.

    Sinon, il y a effectivement les routines LAPACK qui contiennent tout ce qu'il faut pour inverser des matrices. Des versions fortran 77 existent. Il suffit de lire la doc fournie avec pour trouver quelle routine utiliser (de plus chacune de ces routines contient en en-tête les informations nécessaires, c.-à-d. les rôles et sens des arguments, pour apprendre à s'en servir).

    Bon courage.

  14. #14
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut
    Salut!
    Mais sache que pour 98% des gens cela veut dire la meme chose. Il n'y a que toi qui considere que ce n'est pas pareil.
    A une certaine époque, 98% de la population européenne croyait que la Terre était plate.

    Pour moi, rien ne vaut une approche expérimentale: dans Matlab, tu construis une matrice A d'une certaine taille (par ex. 10000*10000) et un vecteur se second membre B. Ensuite, tu fais
    et/ou
    et tu chronomètres.
    Si tu n'as pas Matlab, tu peux faire le test en Fortran en utilisant Linpack: tu factorises ta matrice A par DGEFA, puis tu compares le temps pris par la résolution à l'aide de DGESL avec celui nécessaire pour inverser par DGEDI puis multiplier par le vecteur B.

    Ce qu'on devrait enseigner, c'est que X=A^(-1)*B est une convention typographique signifiant que X est la solution de A*X=B, mais que cette formule me doit pas être recommandée pour la résolution de ce système.

    mais dire que c'est stupide et inutile n'ammene rien au debat
    La terminologie utilisée était peut-être excessive, mais je persiste à croire que ceux qui ont de l'expérience doivent en faire profiter ceux qui en ont moins et en particulier que quand une méthode est moins efficace qu'une autre, il faut que ça se sache.

    Jean-Marc Blanc
    Calcul numérique de processus industriels
    Formation, conseil, développement

    Point n'est besoin d'espérer pour entreprendre, ni de réussir pour persévérer. (Guillaume le Taiseux)

  15. #15
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut
    Salut!
    et moi j utilise le fortran 77, et alors?
    Comme mon compilateur accepte le Fortran 90, je suis incapable de te dire si tu peux utiliser Lapack avec un compilateur Fortran 77. En revanche, je sais que ça marche avec Linpack.

    comment j utilises la librairie dans l execusion?
    Avec la plupart des environnements de développement, tu procèdes en deux étapes:
    • la compilation prend tes fichiers sources (.for) et les traduit en des fichiers objets (.obj);
    • l'édition de liens assemble tes fichiers objets et produit un fichier exécutable (.exe).


    Jean-Marc Blanc
    Calcul numérique de processus industriels
    Formation, conseil, développement

    Point n'est besoin d'espérer pour entreprendre, ni de réussir pour persévérer. (Guillaume le Taiseux)

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 45
    Points : 57
    Points
    57
    Par défaut
    Salut Jean-Marc

    Citation Envoyé par FR119492 Voir le message
    Salut!


    Ce qu'on devrait enseigner, c'est que X=A^(-1)*B est une convention typographique signifiant que X est la solution de A*X=B, mais que cette formule me doit pas être recommandée pour la résolution de ce système.


    La je suis d'accord avec toi. ca fait partie des avantages des methodes iteratives sur les methodes directes.
    Mais je persiste a croire que quand Feynman ecrit qu'il veut inverser une matrice, il veut dire en fait qu'il souhaite resoudre un systeme lineaire (il n'y a qu'a voir son code pour s'en persuader).

    Ensuite son systeme est un systeme 3x3 et la les comparaisons en terme de performances entre une methode directe (Gauss ou LU) et une methode iterative seront tres voisines.
    Apres quand on passe a un systeme 1000x1000 c'est une autre histoire...


    La terminologie utilisée était peut-être excessive, mais je persiste à croire que ceux qui ont de l'expérience doivent en faire profiter ceux qui en ont moins et en particulier que quand une méthode est moins efficace qu'une autre, il faut que ça se sache.

    Jean-Marc Blanc
    La aussi je suis d'accord avec toi et faire partager ta grande experience avec les autres est une chance enorme pour eux.
    Mais peut etre aurait il ete plus "diplomatique" de lui expliquer que le choix de sa methode n'est peut etre pas optimale. C'est autre chose que de lui dire que c'est stupide et inutile.

    Et je persiste a dire que pour son cas de matrice 3x3 son choix est sans doute le meilleur. En effet les methodes directes bien que plus couteuses que les autres (iteratives) en terme de stockage et de temps de calcul sont cependant plus precises ! Moins sensibles aux erreurs d'arrondis.
    Et comme sur une matrice 3x3 une methode directe ne sera pas plus couteuses qu'une methode iterative, son choix est donc le meilleur !
    Quand il passera a un systeme 1000x1000 il sera temps de reconsiderer la question. Bien qu'une fois de plus je le redis la methode "decomposition LU" (ce que Feynman veut implementer) est tres performante quelque soit le cas de figure....

  17. #17
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    il me semble qu'il y a une confusion entre "directe" et "itérative" et le fait d'inverser ou non la matrice au cours du processus.

    une méthode directe ne passe pas forcément par une matrice inverse, d'ailleurs la méthode du pivot de gauss, ou la résolution par décomposition LU aboutissent en fait à une matrice triangulaire et la solution est obtenue par "back substitution".

    du coup on ne compare pas une méthode itérative à une méthode directe en terme de temps d'exécution mais par exemple une méthode directe qui se contente de résoudre avec un passage par une matrice triangulaire ou qui passe par une inversion complète de la matrice !

    et je ne pense pas que le fait de passer par l'inverse de la matrice fasse gagner du temps dans ce contexte. je pense que c'est dans ce sens que Jean-Marc dit que l'inversion matrice est "inutile".

  18. #18
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut
    Salut!
    par exemple une méthode directe qui se contente de résoudre avec un passage par une matrice triangulaire ou qui passe par une inversion complète de la matrice !
    Tu as dit la même chose que moi, mais peut-être d'une manière plus claire. Bravo!
    Jean-Marc Blanc
    Calcul numérique de processus industriels
    Formation, conseil, développement

    Point n'est besoin d'espérer pour entreprendre, ni de réussir pour persévérer. (Guillaume le Taiseux)

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 45
    Points : 57
    Points
    57
    Par défaut
    Bon les gars, tout ca c'est de la semantique....
    comme je le disais precedemment pour 98% des gens, inverser une matrice ou resoudre un systeme lineaire ca revient au meme.
    Et d'ailleurs si vous regarder le code de Feynman c'est bien inverser un systeme ce qu'il souhaite faire (meme si il a ecrit qu'il voulait inverser la matrice). Donc on discute dans le vide. Tout le monde a tres bien compris ou il voulait en venir. Il n'y a que Jean-Marc qui tient a faire ce distinguo (inutile) entre inverser une matrice ou resoudre un systeme lineaire.

    Ceci etant je suis d'accord avec toi Kango, Pivot de Gauss et decomposition LU sont des methodes directes mais ne consiste pas a calculer A^-1.
    Et calculer x= A^-1*b est bien une methode directe.

    Bon je pense que l'on se comprend et ce n'est pas la peine d'embrouiller les gens par ce genre de querelles de clocher.

    Ceci etant je persiste a penser que pivot de Gauss ou LU sera dans le cas d'un systeme lineaire 3x3 aussi rapide qu'une methode iterative.

    Et si Feynman veut aller encore plus vite, le mieux (dans le cas d'une matrice 3x3 uniquement ) c'est de revenir a la definition de l'inverse d'une matrice.
    A^-1 = 1/det(A)* transposee(Com (A) )
    ou com(A) est la matrice des cofacteurs.
    Pour une matrice 3x3 il n'y a rien de plus simple et de plus rapide vu qu'il n'y a que des affectations a faire (une fois que l'on a ecrit les formules....)

  20. #20
    Débutant
    Inscrit en
    Juillet 2007
    Messages
    386
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 386
    Points : 119
    Points
    119
    Par défaut
    Bon , en faite ma matrice depasse l ordre 3, la seul chose que je veux savoire, pourquoi ca ne marche pas si je prends A(i,j)=i*j par exemple
    et comment utiliser les librairie lapack, et merci

Discussions similaires

  1. Inversion de matrice
    Par mhooreman dans le forum Mathématiques
    Réponses: 6
    Dernier message: 26/10/2006, 18h35
  2. Probleme d'inversion de matrice subtil
    Par babycrash dans le forum C
    Réponses: 2
    Dernier message: 02/08/2006, 17h41
  3. inversion de matrice?
    Par babycrash dans le forum C
    Réponses: 17
    Dernier message: 21/06/2006, 22h18
  4. Comment inverser une matrice H(2,2) ?
    Par fafa624 dans le forum Langage
    Réponses: 4
    Dernier message: 29/06/2005, 10h23
  5. Calculer un inverse de matrice avec boost?
    Par Clad3 dans le forum Bibliothèques
    Réponses: 6
    Dernier message: 02/06/2005, 18h38

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