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