Você está na página 1de 2

# PROGRAM GAUSSSEIDEL IMPLICIT NONE !objetivo: resolver o sistema Ax=b pelo mtodo 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) FORMAT(/,T2,'SISTEMA RESOLVIDO PELO METODO DE GAUSS-SEIDEL ',//) WRITE(*,12) WRITE(IO,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) 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) FORMAT(/,T2,'VETOR INDEPENDENTE (B):',/) READ(*,*) (B(I),I=1,N) WRITE(IO,*) (B(I),I=1,N) WRITE(*,14) WRITE(IO,14) FORMAT(/,T2,'TOLERANCIA (TOLER):',/) READ(*,*) TOLER WRITE(IO,*) TOLER WRITE(*,16) FORMAT(/,T2,'NUMERO MAXIMO DE ITERACOES (ITERMAX):',/) READ(*,*)ITERMAX

12

13

17

14

16

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

!ITERAES 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

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 FORMAT(//,T1,'ITER',I6,T14,'NORMA_REL',F12.6,/) DO K=1,N WRITE(IO,32)K,X(K) 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

31

32