function [xv, step, flag] = newtonfun_for (f, f1, x0, toll, maxit)

% Metodo di Newton, con criterio di arresto dello step.
%
% Dati di ingresso:
%   f:      funzione
%   f1:     derivata prima
%   x0:     valore iniziale
%   toll:   tolleranza richiesta per il modulo
%     della differenza di due iterate successive
%   maxit:   massimo numero di iterazioni permesse
%
% Dati di uscita:
%   xv:     vettore riga contenente le iterate
%   step: vettore riga contenente i moduli degli step
%   flag: 0 la derivata prima non si e' annullata.
%         1 la derivata prima si e' annullata,
%         2 eseguite piu' iter. di maxit.

% inizializzazione output
flag=0; step=toll+1; xv=x0;

n=1; 
while (step(end) >= toll) & (n < maxit) & (flag == 0)
    if f1(xv(n)) == 0
        flag=1;
    else
        % calcolo nuovo step
        s=-f(xv(n))/f1(xv(n));
        % calcolo nuova iterazione
        xv(n+1)=xv(n)+s;
        % calcolo valore assoluto step.
        step=[step abs(s)];
        % aggiornamento indice di iterazione
        n=n+1;
    end
end

if (step(end) >= toll) & (flag == 0)
    % siccome si esce dal while, e' falso l'asserto
    % (step(end) >= toll) & (n < maxit) & (flag == 0)
    % ma (step(end) >= toll) & (flag == 0) e' vero.
    % Necessariamente si esce per troppe iterazioni.
    flag=2;
end