function [z, v, info, k, mis] = bisezione(f, a, b, E, kmax)
//
// Uso:
//     [ z,v,info,[k,[mis]] ] = bisezione(f,a,b,E,kmax)
//
//
// Approssima uno zero della funzione f:[a,b] ­> R, che deve
// essere continua, con il metodo di bisezione. La funzione f
// deve assumere valori non nulli e di segno opposto in a e b.
//
// L'iterazione si arresta quando:
// (*) la funzione f ha valore zero nel punto medio x_m
//     dell'intervallo considerato [a(k),b(k)];
// (*) l'intervallo considerato [a(k),b(k)] ha misura minore di
//     E: in tal caso si ha, in teoria, che z approssima uno zero di
//     f con errore assoluto non superiore ad E/2;
// (*) dopo kmax iterazioni.
//
// kmax: valore opzionale (valore predefinito: 50).
//
// z: approssimazione finale (zero di f oppure punto medio
//    dell'ultimo intervallo generato);
// v: valore di f in z;
// info = 0: individuato valore in cui f si annulla (f(z) = 0);
//      = 1: f(z) ~= 0 e l'ultimo intervallo considerato ha misura
//           minore di E (mis < E);
//      = 2: f(z) ~= 0, mis >= E e il numero di iterazioni ha
//           raggiunto il massimo consentito (k = kmax);
// k: numero di iterazioni effettuate;
// mis: ampiezza dell'ultimo intervallo determinato.
//
//
// Inizializzazioni
//
if ~exists('kmax','l') then kmax = 50; end;
k_bis = 0; // contatore delle iterazioni eseguite
//
// Costruzione successioni
//
x_m = (a + b)/2;
f_m = f(x_m);
while (abs(b-a) >= E & f_m ~= 0 & k_bis < kmax),
  k_bis = k_bis+1;
  if sign(f_m) == sign(f(b)) then b = x_m; else a = x_m; end;
  x_m = (a + b)/2;
  f_m = f(x_m);
end;
//
// Fine costruzione: assegno variabili di uscita
//
z = x_m; v = f_m; k = k_bis; mis = abs(b-a);
if f_m == 0 then info = 0;
   else if abs(b-a) >= E then info = 2; else info = 1; end;
end;
//
endfunction
