
function [xv, fxv, step, flag] = newtonfun_for (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.


xv(1)=x0;                     % inizializzazioni
flag=0;

for ii=1:maxit
    
    f1xv(ii)=feval(f1,xv(ii));
    if f1xv(ii) == 0         % uscita per derivata nulla
       step(ii)=NaN; flag=1; return;
    end
    fxv(ii)=feval(f,xv(ii));
    
    step(ii)=-fxv(ii)/f1xv(ii); % calcolo step
    xv(ii+1)=xv(ii)+step(ii);    % aggiornamento
    if abs(step(ii)) <= toll  % uscita per test di arresto verificato
        return;
    end
end

flag=2; % troppe iterazioni