! Metodos Numericos y Simulaciones en Astrofisica
! FCEFN - UNSJ, 2010
!
! ejemplo 5
!
! Aproximacion a la derivada mediante diferencias
!
! Calculo de errores para diferencias laterales y 
! centradas para la funcion:
!
! f(x) = e^x para x = 1
!
! utilizando diferentes valores de h
!
!
program eje5
implicit none
  integer, parameter ::p=selected_real_kind(16,200)
  integer :: i
  real(p) :: fx,dfdx,difl,difc,errl,errc,h
  real(p) :: oldc
  
! asigna el valor real a f(x) y a df/dx
!
  fx=exp(1._p)
  dfdx=fx
  
! inicia bucle de calculo
!
  open(7,file='eje5.out')
  open(8,file='eje5.tru')
  write(7,'(a/)')'     1/h    D1(h)           E1(h)         D2(h)           E2(h)'
  write(8,'(a/)')'     1/h    D2(h)           E2(h)     E2(h/2)/E2(h)'
  h=2._p
  oldc=1._p
  do i=1,30
    difl=(exp(1._p+1._p/h) - fx)*h
	difc=(exp(1._p+1._p/h) - exp(1._p-1._p/h))*h/2._p
	errl=fx-difl
	errc=fx-difc
	write(*,'(i8,2(f13.9,g17.6),f8.3)')int(h),difl,errl,difc,errc,oldc/errc
	write(7,'(i8,2(f13.9,g17.6))')int(h),difl,errl,difc,errc
	write(8,'(i8,f13.9,g17.6,f9.3)')int(h),difc,errc,oldc/errc
	h=h*2._p
	oldc=errc
  enddo
  
end program eje5
