!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!  PROGRAM deriv
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!  (c) 2005, Christian B. Lang, Mathematische Methoden in der Physik
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!  Eine gegebene Funktion wird numerisch mit Hilfe einer auf einer
!  Parabel-Interpolation basierenden 2-Punkt Formel differenziert. Nach
!  dem Wert des Arguments und der Schrittweite dx wird gefragt. Der Wert
!  von dx soll klein, aber nicht kleiner als die Rechengenauigkeit sein.
!  Experimentieren Sie! Beobachten Sie, wie der Wert von f'(x) mit kleineren
!  dx zuerst besser, dann schnell schlechter wird! Warum wohl?   
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

PROGRAM deriv

   implicit none
   real :: x,dx,fsx,fun
        
   write(*,*) 'Ich bilde die Ableitung von f(x).'
   do
     write(*,*) 'Gewuenschter Wert x = '
     read(*,*) x
     write(*,*) 'Schrittweite     dx = '
     read(*,*) dx

!    2-Punkt Formel:

     fsx = (fun(x + dx) - fun(x - dx)) / (2 * dx);
     write(*,*) '             f`(x) = ',fsx
     write(*,*) 'Weiter mit RETURN oder Abbruch mit CTRL-C'
     read(*,*)
   end do

END PROGRAM deriv

REAL FUNCTION fun (x)

   implicit none
   real :: x

   fun = sin(x)

!  Versuchen Sie auch
!  fun= 0.75 - 0.25*x - 3*x*x + x*x*x 

END FUNCTION fun

