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
| cCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
c C
c CALCUL DE L'INVERSE D'UNE MATRICE C
c C
cCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
SUBROUTINE INVERSE(A,N)
double precision A(*),c(100),ZZ,T
integer i,j ,m ,n
c
c APPLICATION DE LA PROCEDURE DE GAUSS-JORDAN
DO I=1,N
DO J=1,N
C(i+(1-j)*n)=0.d0
IF(I.EQ.J) C(i+(1-j)*n)=1.d0
ENDDO
ENDDO
c
C
DO I=1,N
IF(A(i+(1-i)*n).EQ.0.d0) THEN ! PIVOT NUL
DO m=I+1,N ! RECHERCHE D'UN PIVOT NON NUL
IF(A(m+(1-i)*n).NE.0.d0) THEN ! PIVOT NON NUL TROUVE
ip = m ! LOCALISATION DE LA LIGNE DU PIVOT
GO TO 333
333 DO L=I,N
ZZ=A(i+(1-L)*n)
A(i+(1-L)*n)=A(ip+(1-L)*n)
A(IP+(1-L)*n)=ZZ
ENDDO
C
DO KK=1,N
ZZ=C(i+(1-KK)*n)
C(i+(1-KK)*n)=C(IP+(1-KK)*n)
C(IP+(1-KK)*n)=ZZ
ENDDO
ENDIF
ENDDO
gO TO 999
ELSE
C UN PIVOT NON NUL TROUVE. PERMUTATION DES LIGNES
DO L=I,N
ZZ=A(i+(1-L)*n)
A(i+(1-L)*n)=A(i+(1-L)*n)
A(I+(1-L)*n)=ZZ
ENDDO
C
DO KK=1,N
ZZ=C(i+(1-KK)*n)
C(i+(1-KK)*n)=C(i+(1-KK)*n)
C(I+(1-KK)*n)=ZZ
ENDDO
ENDIF
DO J=1,N
IF(J.NE.I) THEN ! LA LIGNE I RESTE INCHANGEE
T = A(J+(1-I)*n)/A(i+(1-I)*n)
DO K=1,N
A(J+(1-K)*n)=A(J+(1-K)*n)-T*A(i+(1-K)*n)
C(J+(1-K)*n)=C(J+(1-K)*n)-T*C(i+(1-K)*n)
ENDDO
ENDIF
ENDDO
ENDDO
DO I=1,N
DO J=1,N
C(i+(1-j)*n)=C(i+(1-j)*n)/A(i+(1-I)*n) ! LA MATRICE INVERSE
ENDDO
ENDDO
999 CONTINUE
do 800 i=1, n
print*, ( C(i+(j-1)*n) , j=1, n)
800 continue
RETURN
END |
Partager