// Esercitazione 3
//
// Argomenti:
//
//  (1) Realizzazione del metodo di bisezione (while, printf).
//  (2) Uso della realizzazione per l'approssimazione di sqrt(2).
//
function [z,v] = Bisezione(f,a,b,delta)
    //
    // Applica il metodo di bisezione alla funzione f a partire dall'intervallo [a,b].
    // L'iterazione si arresta quando mis I(k) < delta (criterio di arresto di tipo assoluto).
    //
    if f(a)*f(b) > 0 then
       error('la funzione non assume valori di segno opposto agli estremi');
    else
        x = (a+b)/2;
        k = 0;
        printf('k = %4.1f , 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;
            printf('k = %4.1f , 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 printf('z = %16.15e  ,  fun(z) = %16.15e',z,v).
//
// (B) Modificare opportunamente la procedura Bisezione per realizzare una
//     procedura di intestazione
//
//          function [z,v,ampiezza] = Bisezione(f,a,b,delta)
//
//     che restituisce, oltre all'approssimazione z e v = f(z), l'ampiezza
//     dell'ultimo intervallo costruito.
//
function y = fun(x)
    // x, y matrici di numeri reali della stessa dimensione
    y = x .^2 - 2;
endfunction
