clf();
//
function x = MetodoUnPunto(h,x0,N)
    // Metodo ad un punto definito dalla funzione h, continua.
    // La costruzione della successione si arresta dopo
    // N iterazioni.
    //
    // x: colonna di numeri reali. Le componenti di questo vettore sono i primi
    //    N + 1 elementi della successione generata dal metodo definito
    //    da h a partire da x0.
    x = x0;
    k = 0;
    while k < N,
        x($+1) = h( x($) );
        k = k + 1;
    end
endfunction
//
function y = h2(x)
    y = exp(-x);
endfunction
//
function y = h3(x)
    y = (exp(-x) + x) / 2;
endfunction
//
x = linspace(0,1,301)';
plot2d(x, [x,h2(x)], style = [5,2]);
xgrid(); xlabel('x'); legend('y = x', 'y = h2(x)', 'in_lower_right');
halt
//
x_0 = 1/2;
N = 20;
//
z2 = MetodoUnPunto(h2,x_0,N);
//
plot2d(z2($), h2( z2($) ), style = -5);
legend('y = x', 'y = h2(x)', '(z2 , h2(z2))', 'in_lower_right');
halt
//
clf();
//
x = linspace(0,1,301)';
plot2d(x, [x, h3(x)], style = [5,2]);
xgrid(); xlabel('x'); legend('y = x', 'y = h3(x)', 'in_lower_right');
//
x0 = 1/2;  // punto iniziale
N = 20;    // numero iterazioni
//
z3 = MetodoUnPunto(h3,x0,N);
//
plot2d(z3($), h3( z3($) ), style = -5);
legend('y = x', 'y = h3(x)', '(z3 , h3(z3))', 'in_lower_right');
halt
//
clf();
//
function y = f(x)
    if find(x <= 0) == [] then
       y = x + log(x);
    else error('f: argomento non positivo');
    end;
endfunction
//
function y = df(x)
    y = 1 + 1 ./ x;
endfunction
//
function y = hN(x)
    y = x - f(x) ./ df(x);
endfunction
//
x = linspace(1/2,1,301)';
plot2d(x, f(x), style = [5,2]);
xgrid(); xlabel('x'); legend('y = f(x)', 'in_lower_right');
halt
//
x0 = 1/2;  // punto iniziale
N = 5;    // numero iterazioni
//
zN = MetodoUnPunto(hN,x0,N);
//
plot2d(zN($), f( zN($) ), style = -5);
legend('y = f(x)', '(zN , f(zN))', 'in_lower_right');
halt
//
clf();
a = zN($);
plot('nl',[1:21]',abs(z2 - a),[1:21]',abs(z3 - a),[1:4]',abs(zN(1:4) - a));
xgrid();
legend('|z2 - a|','|z3 - a|','|zN - a|');
halt
//
function [z,s,d,iter] = Bisezione(f,a,b,N)
    //
    // Applica il metodo di bisezione alla funzione f
    // a partire dall'intervallo [a,b]. L'iterazione si
    // arresta dopo N iterazioni.
    //
    // z: approssimazione suggerita.
    // s,d: estremo sinistro e destro, rispettivamente,
    //      dell'ultimo intervallo calcolato.
    // iter: numero di iterazioni effettuate.
    //
    iter = 0;
    if ( f(a) == 0 | f(b) == 0 | sign(f(a)) == sign(f(b)) ) then
       error('la funzione non assume valori di segno opposto agli estremi');
    else
        s = a; d = b;
        z = (s+d)/2;
        while iter < N,
              if sign(f(s)) <> sign(f(z($))) then d = z($);
              else s = z($); end;
              z($+1) = (s+d)/2;
              iter = iter + 1;
        end;
    end;
endfunction
//
N = 20;
//
[zB,s,d,iter] = Bisezione(f,1/2,1,N);
//
clf();
plot('nl',[1:21]',abs(z2 - a),[1:21]',abs(z3 - a),[1:4]',abs(zN(1:4) - a),[1:21]',abs(zB - a));
xgrid();
legend('|z2 - a|','|z3 - a|','|zN - a|','|zB - a|');
