subroutine Newton(SUB,x0,eps,lnit,rad,kod)
! Solutia ecuatiei F(x)=0, prin metoda Newton.
! Parametri:
!	SUB	:numele subrutinei care calculeaza valoarea lui F si a derivatei F1.
!		 Se declara EXTERNAL in programul care apeleaza NEWTON.
!	X0	:aproximatia initiala
!	eps	:toleranta
!	lnit: -Intrare =nr.maxim de iteratii; -Iesire =nr.efectiv de iteratii.
!	rad = solutia ecuatiei
!	kod	: -INTRARE: cod de tiparire a iteratiilor: 0 = Nu; #0 = Da.
!       : -IESIRE : cod de terminare/eroare:
!		 0:	tolenata "eps" atinsa;
!		 1:	depasirea nr.maxim de iteratii admis "lnit";
!       -1: Proces stationar: x1=x0;
!       -2:	derivata functiei in X0 este nula.
!
!* Exemplu de subrutina SUB:
! subroutine SUB(f,f1,x)
! common p	! optional, in cazul cand F include un parametru "p".
!			! "p" se citeste in programul apelant.
! f =...
! f1=...
! end

logical print_it

epsX(x) =1./2**(24 -exponent(x))

print_it = kod /=0

! Save initial aproximation:
x00 =x0
iter=0
1	call sub(f,f1,x0)
    if(abs(f1) < 1.e-10) then
	kod=-2
	return
	endif

iter=iter+1
dif=f/f1
x1=x0-dif
	if(print_it) print 90,iter,x1
90	format(' Iteratia',I6,':      x1=',E13.7)

IF(abs(dif) <= eps) THEN
kod=0
goto 100

ELSE IF(abs(dif) <epsX(x0)) THEN
kod=-1
print*,' ** PROCES STATIONAR !'
print*, 'MaxEps =', epsX(x0)
goto 100
ENDIF

! Test numar de iteratii:
IF(iter.ge.lnit) THEN
kod=1
goto 100

ELSE
	x0=x1
ENDIF
goto 1

100 lnit = iter
rad=x1
! Restore initial aprox.
x0 =x00
print*,' ** Corectia curenta=',dif

END


