function [xvect,xdif,fx,nit] = newton(x0,toll,nmax,fun,dfun)
% ALGORITMO DI NEWTON
% INPUT
% x0    : Punto iniziale
% toll  : Tolleranza del metodo
% nmax  : Numero massimo di iterazioni
% fun   : Stringa con il nome della funzione specificata su un mfile
% dfun  : Stringa con il nome della derivata della funzione specificata su un mfile
%
% OUTPUT
% xvect : Vettore delle successioni delle x
% xdif  : Vettore dell'ampiezza degli intervalli
% fx    : Vettore delle successioni delle f(x)
% nit   : Iterazioni totali del metodo


% valore corrente della variabile e del valore della funzione e della sua derivata
x      = x0;
fxval  = feval(fun,x0);
dfxval = feval(dfun,x0);


% errore iniziale pari a tolleranza piu 1
% in modo tale da entrare almeno una volta nel ciclo iterativo
err = toll+1;
% iterazioni totali iniziali pari a zero
nit = 0;
% vettore delle successioni delle x (inizializzazione con x0)
xvect = x0;
% vettore delle successioni delle f(x) (inizializzazione con f(x0))
fx = fxval;
% vettore dell'ampiezza degli intervalli (inizializzazione a vuoto)
xdif = [];



% CICLO PRINCIPALE
while (nit < nmax & err > toll)
   % aggiorno contatore delle iterazioni
   nit = nit+1;
   % trovo nuovo punto
   xn = x-fxval/dfxval;

   % aggiorno errore
   err = abs(xn-x);

   % % aggiorno valori
   % punto corrente
   x = xn;
   % valore della funzione
   fxval  = feval(fun,x);
   % valore della derivata della funzione
   dfxval = feval(dfun,x);

   % salvataggio valori
   xvect = [xvect;x];
   xdif = [xdif; err];
   fx = [fx;fxval];
end
