function [z,v,info,StimaErr,succ] = newton1d(f,x0,d1f,E,kmax)
//
// Metodo di Newton monodimensionale.
//
// Approssima uno zero della funzione f: R -> R con derivata prima
// (continua) d1f costruendo una successione x(k) a partire da x0.
//
// La costruzione della successione si arresta quando:
//   (*) la funzione f si annulla nel punto attuale x(k);
//   (*) il rapporto |f(x(k))| / |d1f(x(k))| risulta minore di E (in tal
//       caso, se la successione fosse convergente ad uno zero semplice
//       di f, l'errore assoluto tra z = x(k) e tale zero sarebbe
//       circa pari ad E);
//   (*) dopo kmax iterazioni (valore predefinito: kmax = 20).
//
//
// z: approssimazione finale (zero di f oppure una sua approssimazione);
// v: valore di f in z;
// info = 0: individuato valore in cui f si annulla;
//      = 1: criterio di arresto soddisfatto;
//      = 2: d1f(x(k)) vale zero;
//      = 3: superato il numero massimo consentito di iterazioni.
// StimaErr: vettore riga contenente le stime dell'errore calcolate
//           a ciascuna iterazione.
// succ: matrice contenente la successione generata x(k).
//
// Se info = 2, si pone z = [] e v = [].
//
if ~exists('kmax','l') then kmax = 20; end;
succ = x0;
StimaErr = [];
v_f = f(succ($));
v_d = d1f(succ($));
if (v_f ~= 0 & v_d ~= 0) then passo = v_f/v_d; StimaErr = abs(passo); end;
//
// ****************** Iterazione
//
while (v_d ~= 0 & v_f ~= 0 & StimaErr($) >= E & (length(succ) - 1) < kmax),
   succ($+1) = succ($) - passo;
   v_f = f(succ($));
   v_d = d1f(succ($));
   if v_d ~= 0 then passo = v_f/v_d; StimaErr($+1) = abs(passo); end;
end;
//
// ****************** Fine iterazione
//
z = succ($); v = v_f; info = 1;
if v_f == 0 then info = 0;
   else if v_d == 0 then info = 2;
           else if (length(succ) - 1) == kmax then info = 3; end;
        end;
end;
endfunction
//
