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 |
Partager