You are on page 1of 3

PROGRAM DOOLITTLE

IMPLICIT REAL*8(A-H,O-Z)
REAL, ALLOCATABLE, DIMENSION(:,:) :: A,L,U
REAL, ALLOCATABLE, DIMENSION(:) :: B,X,Z
INTEGER :: n, i, j
!Presentacin del programa
WRITE(*,10)
10 FORMAT(3X,'ESTE PROGRMA INSTRUMENTA EL ALGORITMO DE DOOLITTLE')
! ENTRADA DE DATOS
WRITE(*,5, advance ='no')
5 FORMAT(3X,"Ingresa el orden de la matriz n = ")
READ (*,*) n
!Inicializa matrices y vectores
ALLOCATE(A(n,n))
ALLOCATE(L(n,n))
ALLOCATE(U(n,n))
ALLOCATE(B(n),X(n),Z(n))
! ENTRADAS DE LA MATRIZ A
WRITE(*,6)
6 FORMAT(/,3X,"Ingresa los elementos de la matriz de coeficientes A renglon por
renglon",/ )
DO i = 1,n
READ (*,*) (A(i,j),j=1,n)
END DO
! ENTRADAS DEL VECTOR B
WRITE(*,7)
7 FORMAT(/,3X,"Ingresa los elementos del vector de constantes B en formato colum
na",/ )
DO i = 1,n
READ (*,*) B(i)
END DO
! EFECTUA LA FACTORIZACION A=LU
CALL LU(N,A,L,U)
! Despliega en pantalla a la matriz L
WRITE(*,*) ' '
WRITE(*,*)' La matriz L es: '
DO i = 1,n
write (*,8) (L(i,j), j = 1,n)
8 format (8(3X, F8.4))
END DO
! Despliega en pantalla a la matriz U
WRITE(*,*)' '
WRITE(*,*)' La matriz U es: '
DO i = 1,n
write (*,8) (U(i,j), j = 1,n)
END DO
WRITE(*,*)' '
! RESUELVE LZ=B EMPLEANDO SUSTITUCION HACIA ADELANTE

CALL FORW(N,L,Z,B)
! Despliega en pantalla los valores del vector Z
WRITE(*,*) ' El vector Z contiene los siguientes elementos:'
DO i=1,n
WRITE(*,300) i,Z(i)
300 FORMAT (3X,'Z(',I1,') = ',F10.4)
END DO
! RESUELVE UX=Z EMPLEANDO SUSTITUCIN HACIA ATRS
CALL SBACK(N,U,Z,X)
! Despliega en pantalla los valores del vector solucin X
WRITE(*,*)' '
WRITE(*,*) ' El vector solucion X contiene los siguientes elementos:'
DO i=1,n
WRITE(*,301) i,X(i)
301 FORMAT (3X,'X(',I1,') = ',F10.6)
END DO
PAUSE
END PROGRAM DOOLITTLE
!
! == ******************************************************************** ==
! SUBROUTINE TO PERFORM DOLITTLE FACTORIZATION: A=LU
SUBROUTINE LU(N,A,L,U)

IMPLICIT REAL*8(A-H,O-Z)
REAL A(N,N),L(N,N),U(N,N)
DO I = 1,N
L(I,I)=1.
ENDDO
U(1,1)=A(1,1)
IF(U(1,1).EQ.0.)THEN
WRITE(1,*)'LU FACTORIZATION IS IMPOSSIBLE'
RETURN
ENDIF
DO J =2,N
! DETERMINE THE FIRST ROW OF U
U(1,J)=A(1,J)
! DETERMINE THE FIRST COLUMN OF XL
L(J,1)=A(J,1)/U(1,1)
ENDDO
DO I = 2, N-1
S=0.
DO K = 1, I-1
S=S+L(I,K)*U(K,I)
ENDDO
U(I,I)= A(I,I)-S
IF(U(I,I).EQ.0.)THEN
WRITE(1,*)'LU FACTORIZATION IS IMPOSSIBLE'
RETURN
ENDIF
DO J = I+1, N

S1=0.
S2=0.
DO K = 1, I-1
S1=S1+L(I,K)*U(K,J)
S2=S2+L(J,K)*U(K,I)
! DETERMINE THE (ith)ROWS OF U
U(I,J)=A(I,J)-S1
! DETERMINE THE (ith)COLUMN OF XL
L(J,I)=(A(J,I)-S2)/U(I,I)
ENDDO
ENDDO
ENDDO
SS=0
DO K = 1,N-1
SS=SS+L(N,K)*U(K,N)
U(N,N)=A(N,N)-SS
ENDDO
IF(U(N,N).EQ.0) THEN
WRITE(1,*)' THE MATRIX A IS SINQULAR'
ENDIF
RETURN
END
! == ******************************************************************** ==
! SUBROUTINE TO SOLVE LZ=B USING FORWARD SUBSTITUTION
SUBROUTINE FORW(N,L,Z,B)
IMPLICIT REAL*8(A-H,O-Z)
REAL L(N,N),Z(N),B(N)
Z(1)=B(1)
DO I =2,N
S3=0.
DO J =1,I-1
S3=S3+L(I,J)*Z(J)
ENDDO
Z(I)=B(I)-S3
ENDDO
RETURN
END
! == ******************************************************************** ==
! SUBROUTINE TO SOLVE UX=Z USING BACK SUBSTITUTION
SUBROUTINE SBACK(N,U,Z,X)
IMPLICIT REAL*8(A-H,O-Z)
REAL U(N,N),Z(N),X(N)
X(N)=Z(N)/U(N,N)
DO K = N-1,1,-1
S4=0.
DO J=K+1,N
S4=S4+U(K,J)*X(J)
ENDDO
X(K)=(Z(K)-S4)/U(K,K)
ENDDO
RETURN
END

You might also like