// Esercitazione 3
//
// Argomenti:
//
//  (1) Realizzazione del metodo di bisezione (while, mprintf).
//  (2) Uso della realizzazione per l'approssimazione di sqrt(2).
//
function [z,v] = Bisezione(f,a,b,delta)
    //
    // f:[a,b] -> R t.c. f(a) f(b) < 0.
    // Applica il metodo di bisezione alla funzione f a partire 
    // dall'intervallo [a,b].
    // L'iterazione si arresta quando f(x) = 0 oppure mis I(k) < delta 
    // (criterio di arresto di tipo assoluto).
    //
    // z approssima uno zero di f, v = f(z).
    //
    if (sign(f(a)) == sign(f(b)) | f(a) == 0 | f(b) == 0) then
       error('la funzione non assume valori di segno opposto agli estremi');
    else
        k = 0; // k: contatore delle iterazioni
        x = (a+b)/2;
        mprintf('k = %4.0f , a = %.2e , b = %.2e ,  ampiezza = %.3e\n', k,a,b,b-a);
        while ~((b-a) < delta | f(x) == 0),
            if sign(f(a)) ~= sign(f(x)) then b = x;
               else a = x; end;
            x = (a+b)/2;
            k = k + 1;
            mprintf('k = %4.0f , a = %.2e , b = %.2e ,  ampiezza = %.3e\n', k,a,b,b-a);
        end;
        z = x;
        v = f(z);
    end;
endfunction
//
// Esercizio
//
// (A) Utilizzare opportunamente la procedura Bisezione per determinare
//     approssimazioni dello zero positivo della funzione fun(x) = x^2 - 2
//     con errore assoluto non superiore a:
//     (1) 10^(-4) 
//     (2) 10^(-8)
//     (3) 10^(-16)
//     In ciascun caso visualizzare l'approssimazione trovata z ed il valore di
//     fun(z) con l'istruzione mprintf('z = %.15e  ,  fun(z) = %.15e',z,v).
//
//     Verificare l'accuratezza dei risultati sapendo che radice di due vale:
//
//              1.4142135623730950488....
//
// (B) Modificare la procedura in modo che la costruzione della successione
//     venga arrestata anche se:
//
//              b == nearfloat('succ',a)
//
//     e ripetere il punto (3).
//
// (C) Modificare opportunamente la procedura Bisezione per realizzare una
//     procedura di intestazione
//
//          function z = Bisezione(f,a,b,epsilon)
//
//     che realizza il metodo di bisezione con criterio d'arresto relativo.
//
function y = fun(x)
    // x, y matrici di numeri reali della stessa dimensione
    y = x .^2 - 2;
endfunction
