program raizes use portlib implicit none integer :: i, n, ver, tipo_metodo real*8 :: exato, erro, xo, x, r call dados x = xo open(6,file="saida18b.txt") write(6,10) 10 format("# i", t17,"x", t47,"erro") erro = dabs(exato - x) write(6,11) 0, x, erro 11 format( i8, 2(1pe30.15e3) ) select case ( tipo_metodo ) case ( 1 ) call linear case ( 2 ) call bissecao case ( 3 ) call newton end select close(6) ver = system ("Notepad saida18b.txt") call grafico !------------------------------------------------- contains !------------------------------------------------- subroutine dados ver = system ("Notepad dados18b.txt") open(5,file="dados18b.txt") read(5,*) tipo_metodo read(5,*) n read(5,*) exato read(5,*) xo read(5,*) r close(5) end subroutine dados !------------------------------------------------- subroutine linear ! calcula raiz de uma equação quadrática com o método da iteração linear do i = 1, n x = ( ( x ** 2 ) + 6 ) / 5 erro = dabs(exato - x) write(6,10) i, x, erro 10 format( i8, 2(1pe30.15e3) ) end do end subroutine linear !------------------------------------------------- subroutine bissecao ! calcula raiz de uma equação quadrática com o método da bisseção real*8 a, b, fa, fx a = xo - r b = xo + r do i = 1, n fx = x**2 - 5*x + 6 fa = a**2 - 5*a + 6 if ( fx*fa < 0 ) then b = x else a = x end if x = (a + b) / 2 erro = dabs(exato - x) write(6,10) i, x, erro 10 format( i8, 2(1pe30.15e3) ) end do end subroutine bissecao !------------------------------------------------- subroutine newton ! calcula raiz de uma equação quadrática com o método de Newton real*8 f, fl do i = 1, n f = x**2 - 5*x + 6 fl = 2*x - 5 x = x - f / fl erro = dabs(exato - x) write(6,10) i, x, erro 10 format( i8, 2(1pe30.15e3) ) end do end subroutine newton !------------------------------------------------- subroutine grafico integer k open(9,file="comandos18b.gnu") do k = 1, 7 read(9,*) end do select case ( tipo_metodo ) case ( 1 ) write(9,*) "set title 'método da iteração linear'" case ( 2 ) write(9,*) "set title 'método da bisseção'" case ( 3 ) write(9,*) "set title 'método de Newton'" end select write(9,*) "replot" close(9) ver = system ("Wgnuplot comandos18b.gnu") end subroutine grafico !------------------------------------------------- end program raizes