
% nome: cognome: matricola: postazione: 

function [xv,zv] = newton_fourier(f,f1,x1,z1,toll,nmax)
% Uso:
%   [xv,zv] = newton_fourier(f,f1,x1,z1,toll,nmax)
% Dati di ingresso:
%   f:      funzione
%   f1:      derivata di f
%   x1:     prima iterata in x
%   z1:     prima iterata in z (con x1 < z1)
%   toll:   tolleranza richiesta per il valore assoluto
%           tra le iterate di xv e zv
%   nmax:   massimo numero di iterate permesse
% Dati di uscita:
%   xv:     vettore contenente le iterate in x
%   zv:     vettore contenente le iterate in z

xv(1)=x1; zv(1)=z1;

% controllo dei dati iniziali
if xv(1) >= zv(1)
    fprintf('\n \t dati iniziali non accettabili');
    return;
end

% iterazioni del metodo
for n=1:nmax
    f1xv(n)=feval(f1,xv(n));
    
    % controllo denominatore
    if f1xv(n) == 0
            fprintf('\n \t la derivata si annulla nel punto in considerazione');
            return;
    end
    
    fzv(n)=feval(f,zv(n));
    
    % ................... nuove iterate ...................
    
    % calcolo xv(n+1)
    fxv(n)=feval(f,xv(n));
    xv(n+1)=xv(n)-fxv(n)/f1xv(n);
    
    % calcolo zv(n+1)
    fzv(n)=feval(f,zv(n));
    zv(n+1)=zv(n)-fzv(n)/f1xv(n);
    
    % uscita perche' l'errore e' sotto una certa tolleranza
    if abs(xv(n+1)-zv(n+1)) <= toll
        return;
    end
end

% uscita perche' sono state svolte troppe iterazioni
fprintf('\n \t sono state effettuate troppe iterazioni');



