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

% Metodo di Newton
%
% 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 contenente le iterate
%   fxv:    vettore contenente la valutazione di f
%           in xv
%   step: vettore contenente gli step
%   flag: 0 la derivata prima non si e' annullata.
%         1 la derivata prima si e' annullata,
%         2 eseguite piu' iter. di maxit.
% 
% Data: 20 aprile 2022.

n=1; flag=0; step=toll+1; xv=x0; % settings iniziali 

while (step>=toll) & (n<maxit) & (flag == 0) 
    if f1(xv(n)) == 0  % problemi: derivata prima nulla!
        flag =1;
    else % calcola nuova iterazione e suo step 
        fxv(n)=f(xv(n));
        s=-fxv(n)/f1(xv(n));
        xv(n+1)=xv(n)+s;
        step(n)=abs(s);
        n=n+1;
    end
end

if (n==maxit) & (step(end) >=toll)
    flag = 1; % uscita per troppe iterazioni
end