      program  puntofisso
C  programma per il calcolo del punto fisso di una funzione fun.
C  Esempi di funzioni fun gia' implementate:
C                       fun(x) = sqrt(5x-6) in [2:infinito]
C                       fun(x) = cos(x) in [0:pi/2]
C                       fun(x) = sqrt(exp(-x**2)) in [0.5:1]
C                       fun(x) = exp(x/4) in [0:10]
C                       fun(x) =  cosh(x/2) in [0:5] 
C                       fun(x) = x**2-5*x +9 in [-1:5]
C
C  In particolare fun(x) = sqrt(5x-6) viene utilizzata per risolvere il
C  problema: x**2 - 5*x + 6 = 0
C
      implicit none
C
C  significato delle variabili
C  iter : iterazione del metodo del punto fisso
C  itmax: numero massimo di iterazioni
C  toll : tolleranza prefissata per l'approssimazione del punto fisso
C  scarto: valore assoluto tra l'iterata corrente e quella al passo precedente
C  x0 : punto iniziale della successione
C  xk:  approssimazione al passo k
C  xkp1: approssimazione al passo k+1

      integer iter, itmax
      real  x0, xk, xkp1,scarto, toll, fun


      write(*,*) 'approssimazione iniziale'
      read(*,*)  x0
      write(*,*) 'x0 =' ,x0

      
      itmax=100
      toll=1.e-06
      scarto=2.0*toll
      iter = 0
      xk=x0
      write(*,*) 'it      xk          xkp1        scarto'
      do while ( (scarto.ge.toll) .and. (iter.le.itmax) ) 
C ciclo punto fisso
         iter = iter +1
         xkp1=fun(xk)
C funzione valore assoluto: abs
         scarto=abs(xkp1- xk)
         write(*,*) iter,xk,xkp1,scarto
         xk=xkp1
      end do
      end


      real   function fun(x)
      implicit none
      real x

      fun = sqrt(5.0*x-6.0)
C     fun= cos(x)
C     fun=sqrt(exp(-x**2))
C     fun=exp(x/4.0)
C     fun=cosh(x*0.5)
C     fun=x**2-5.*x +9.0
      return
      end
