      program  puntofisso
C  programma per il calcolo del punto fisso di una funzione fun.
C  Esempi di funzioni fun da implementare:
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                       fun(x) = 1 + atan(x)        in [1:4]
      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  x0 : punto iniziale della successione
C  xk:  approssimazione al passo k
C  xkp1: approssimazione al passo k+1
C  scartok : scarto all'iterata precedente
C  scartokp1: valore assoluto tra l'iterata corrente e quella al 
C             passo precedente
C  asint1: scartokp1/scartok  - approssimazione del fattore di convergenza M
C  asint2: abs(dfun(xkp1))    - approssimazione del fattore di convergenza M
C  fun:  funzione di cui si vuole calcolare un'approssimazione del punto fisso
C  dfun: derivata della funzione fun

      integer iter, itmax
      real*8  x0, xk, xkp1,scartok,scartokp1, toll
      real*8  asint1, asint2, fun,  dfun

      open(5,file='dati.dat')
      open(6,file='risul.ris')

      read(5,*)  x0,itmax,toll
      write(6,3) 'x0 =' ,x0,' itmax =',itmax,' toll =',toll

      scartokp1=2.d0*toll
      scartok=scartokp1
      iter = 0
      xk=x0
      write(6,1) 'it','xkp1','scarto','asint1','asint2'
      do while ( (scartokp1.ge.toll) .and. (iter.le.itmax) ) 
         iter = iter +1
         xkp1=fun(xk)
         scartokp1=abs(xkp1- xk)
         asint1= scartokp1/scartok
         asint2=abs(dfun(xkp1))
         write(6,2) iter,xkp1,scartokp1,asint1,asint2
         xk=xkp1
         scartok=scartokp1
      end do

      stop
1     format(1x,a,13x,a,3(11x,a))
2     format(i3,2x,f15.8,3(2x,e15.7))
3     format(a,e13.6,a,i5,a,e13.6)
      end

      real*8   function fun(x)
      implicit none
      real*8 x

c     fun= cos(x)
c     fun=sqrt(exp(-x**2))
c     fun=exp(x/4.0)
c     fun=cosh(x*0.50)
c     fun=x**2-5.0*x +9.0
      fun=1.+atan(x)
      return
      end

      real*8  function dfun(x)
      implicit none
      real*8 x

c     dfun= -sin(x)
c     dfun=-x*sqrt(exp(-x**2))
c     dfun=exp(x/4.0)/4.0
c     dfun=sinh(x*0.50)*0.50
c     dfun=2.00*x-5.0
      dfun=1.0/(1.0+x**2)
      return
      end
