Vous êtes sur la page 1sur 3

PROGRAM Aula04

IMPLICIT NONE
INTEGER, PARAMETER :: Np = 101, Nc = 5
INTEGER :: ii
REAL(8), DIMENSION(Np) :: vecX, vecF
! Ler dados de entrada
OPEN(UNIT=11,FILE='dados.dat')
DO ii = 1, Np
READ(11,*) vecX(ii), vecF(ii)
END DO
CLOSE(11)
! Regresso Linear
CALL RegLinear(vecX,vecF,Np,Nc)
! Salvar soluo
OPEN(UNIT=12,FILE='sol.dat')
DO ii = 1, Nc
WRITE(12,*) vecX(ii)
END DO
CLOSE(12)
END PROGRAM Aula04
! Funes e Subrotinas
! --------------------
! -------------------- Funo Base
FUNCTION Psi(i,x)
IMPLICIT NONE
INTEGER :: i
REAL(8) :: x, Psi, pi
pi = DACOS(-1.0d0)
Psi = DSIN(DFLOAT(i)*pi*x)
END FUNCTION Psi
! -------------------- Regresso Linear
SUBROUTINE RegLinear(vecX,vecF,Np,Nc)
IMPLICIT NONE
INTEGER, INTENT(IN) :: Np, Nc
REAL(8), DIMENSION(Np), INTENT(IN) :: vecF
REAL(8), DIMENSION(Np), INTENT(INOUT) :: vecX
INTEGER :: ii, jj, kk
REAL(8) :: Psi
REAL(8), DIMENSION(Nc) :: vecB
REAL(8), DIMENSION(Nc,Nc) :: matA
DO jj = 1, Nc
vecB(jj) = 0.0d0
DO ii = 1, Nc
vecB(jj) = vecB(jj) + Psi(jj,vecX(ii))*vecF(ii)
END DO
DO kk = 1, Nc
matA(jj,kk) = 0.0d0
DO ii = 1, Nc
matA(jj,kk) = matA(jj,kk) + Psi(jj,vecX(ii))*Psi(kk,vecX(ii))
END DO
END DO
END DO
CALL TriSup(matA,vecB,Nc)
CALL SubRev(matA,vecB,Nc)
DO ii = 1, Nc
vecX(ii) = vecB(ii)
END DO
END SUBROUTINE RegLinear
! -------------------- Triangularizao Superior
SUBROUTINE TriSup(matA,vecB,Nt)
! Limpar formatao do fortran
IMPLICIT NONE
! Formatando as variveis usadas
INTEGER, INTENT(IN) :: Nt
REAL(8), DIMENSION(Nt), INTENT(INOUT) :: vecB
REAL(8), DIMENSION(Nt,Nt), INTENT(INOUT) :: matA
! Formatar variveis adicionais
INTEGER :: ii, jj, kk
REAL(8) :: cte
! Triangularizao Superior
DO kk = 1, Nt-1
DO ii = kk+1, Nt
cte = matA(ii,kk)/matA(kk,kk)
DO jj = kk+1, Nt
matA(ii,jj) = matA(ii,jj) - cte*matA(kk,jj)
END DO
vecB(ii) = vecB(ii) - cte*vecB(kk)
END DO
END DO
END SUBROUTINE TriSup
! -------------------- Substituio Reversa
SUBROUTINE SubRev(matA,vecB,Nt)
! Limpar formatao do fortran
IMPLICIT NONE
! Formatando as variveis usadas
INTEGER, INTENT(IN) :: Nt
REAL(8), DIMENSION(Nt), INTENT(INOUT) :: vecB
REAL(8), DIMENSION(Nt,Nt), INTENT(IN) :: matA
! Formatar variveis adicionais
INTEGER :: ii, jj
! Substituio Reversa
vecB(Nt) = vecB(Nt)/matA(Nt,Nt)
DO ii = Nt-1, 1, -1
DO jj = ii+1, Nt
vecB(ii) = vecB(ii) - matA(ii,jj)*vecB(jj)
END DO
vecB(ii) = vecB(ii)/matA(ii,ii)
END DO
END SUBROUTINE SubRev

Vous aimerez peut-être aussi