Você está na página 1de 2

PROGRAM GAUSSSEIDEL

IMPLICIT NONE
!objetivo: resolver o sistema Ax=b pelo m‚todo iterativo de Gauss-
!Seidel
INTEGER:: I,J,K,ITERMAX,N,ITER,IO
REAL *8:: TOLER,R,SOMA,T,NORMA_NUM, NORMA_DEN,NORMA_REL
REAL *8, DIMENSION (:), ALLOCATABLE::B,X,V
REAL *8, DIMENSION (:,:), ALLOCATABLE::A
CHARACTER*16 FILEOUT

IO=4

WRITE(*,' (A) ') ' NOME ARQ. SAIDA DE RESULTADOS ? (MAX 16 CHAR) '
READ(*,' (A) ')FILEOUT
OPEN(IO,FILE=FILEOUT,STATUS='UNKNOWN')

WRITE(*,1)
WRITE(IO,1)
1 FORMAT(/,T2,'SISTEMA RESOLVIDO PELO METODO DE GAUSS-SEIDEL ',//)

WRITE(*,12)
WRITE(IO,12)
12 FORMAT(T2,'ORDEM DA MATRIZ (N):',/)
READ(*,*) N
WRITE(IO,*) N
ALLOCATE (B(N),X(N),V(N))
ALLOCATE (A(N,N))
WRITE(*,13)
WRITE(IO,13)
13 FORMAT(/,T2,'MATRIZ (A):')
READ(*,*)((A(I,J),J=1,N),I=1,N)
WRITE(IO,*)((A(I,J),J=1,N),I=1,N)
WRITE(*,17)
WRITE(IO,17)
17 FORMAT(/,T2,'VETOR INDEPENDENTE (B):',/)
READ(*,*) (B(I),I=1,N)
WRITE(IO,*) (B(I),I=1,N)
WRITE(*,14)
WRITE(IO,14)
14 FORMAT(/,T2,'TOLERANCIA (TOLER):',/)
READ(*,*) TOLER
WRITE(IO,*) TOLER
WRITE(*,16)
16 FORMAT(/,T2,'NUMERO MAXIMO DE ITERACOES (ITERMAX):',/)
READ(*,*)ITERMAX

DO I=1,N
R=1/A(I,I)
DO J=1,N
IF (I.NE.J) THEN
A(I,J)=A(I,J)*R
END IF
END DO
B(I)=B(I)*R
X(I)=B(I)
END DO

ITER=0

!ITERAÇÕES DE GAUSS-SEIDEL
DO WHILE(ITER.LE.ITERMAX)

ITER=ITER+1
DO I=1,N
SOMA=0
DO J=1,N
IF (I.NE.J) THEN
SOMA=SOMA+A(I,J)*X(J)
END IF

1
END DO
V(I)=X(I)
X(I)=B(I)-SOMA
END DO

NORMA_NUM=0
NORMA_DEN=0

DO I=1,N
T=ABS(X(I)-V(I))
IF (T.GT.NORMA_NUM) THEN
NORMA_NUM=T
END IF
IF (ABS(X(I)).GT.NORMA_DEN) THEN
NORMA_DEN=ABS(X(I))
END IF
END DO

NORMA_REL=NORMA_NUM/NORMA_DEN
WRITE(IO,31)ITER,NORMA_REL
31 FORMAT(//,T1,'ITER',I6,T14,'NORMA_REL',F12.6,/)
DO K=1,N
WRITE(IO,32)K,X(K)
32 FORMAT(/,T1,'X',I6,'=',T14,F12.7)
END DO

!TESTE DE CONVERGENCIA

IF (NORMA_REL.LE.TOLER .OR.ITER.GE.ITERMAX) THEN


STOP
END IF

END DO

END PROGRAM GAUSSSEIDEL

Você também pode gostar