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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juillet 2007
    Messages
    386
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 386
    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 : 84
    Localisation : Suisse

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    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

  3. #3
    Membre éclairé
    Inscrit en
    Juillet 2007
    Messages
    386
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 386
    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 émérite
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    489
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 489
    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
    Membre éclairé
    Inscrit en
    Juillet 2007
    Messages
    386
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 386
    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 : 84
    Localisation : Suisse

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    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

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