function [zero,res,niter]=newton(fun,dfun,x0,tol,...
                                 nmax,varargin)
%NEWTON Trova uno zero di una funzione.
%   ZERO=NEWTON(FUN,DFUN,X0,TOL,NMAX) approssima lo
%   zero ZERO della funzione definita nella function
%   FUN, continua e derivabile, usando il metodo di
%   Newton e partendo da X0. FUN e la sua derivata
%   DFUN accettano in ingresso uno scalare x e
%   restituiscono un valore scalare. Se la ricerca
%   dello zero fallisce, il programma restituisce un
%   messaggio d'errore. FUN e DFUN possono essere
%   inline function, anonymous function o function
%   definite in M-file.
%   ZERO=NEWTON(FUN,DFUN,X0,TOL,NMAX,P1,P2,...) passa
%   i parametri P1,P2,... alle funzioni
%   FUN(X,P1,P2,...) e DFUN(X,P1,P2,...).
%   [ZERO,RES,NITER]= NEWTON(FUN,...) restituisce il
%   valore del residuo RES in ZERO ed il numero di
%   iterazioni NITER necessario per calcolare ZERO.

x = x0;
fx = feval(fun,x,varargin{:});
dfx = feval(dfun,x,varargin{:});
niter = 0; diff = tol+1;
while diff >= tol & niter < nmax
   niter = niter + 1;      diff = - fx/dfx;
   x = x + diff;           diff = abs(diff);
   fx = feval(fun,x,varargin{:});
   dfx = feval(dfun,x,varargin{:});
end
if (niter==nmax & diff > tol)
  fprintf(['Newton si e'' arrestato senza aver ',...
    'soddisfatto l''accuratezza richiesta, avendo\n',...
    'raggiunto il massimo numero di iterazioni\n']);
end
zero = x; res = fx;
return
