// Esercitazione 4
//
//   Sia g(x) = cos(x) / 2.
//
//   (1) Definire una function di intestazione
//
//             function y = g(x)
//
//       che, assegnata una matrice x, restituisce una matrice y della stessa dimensione
//       di x e di componenti y(i,j) = g(x(i,j)), e una function di intestazione
//
//             function y = d1g(x)
//
//       che, assegnata una matrice x, restituisce una matrice y della stessa dimensione
//       di x e di componenti y(i,j) = g'(x(i,j)).
//   (2) Utilizzare il comando eye (vedere la corrispondente pagina di help) per definire
//       la matrice A di dimensione 3x3 e valore: %pi I. Calcolare g(A) e d1g(A) e
//       decidere se i valori sono corretti.
//   (3) Utilizzare la funzione plot2d per ottenere i grafici (approssimati) di g(x), x e
//       |g'(x)| per x in [0,%pi/2]. Le curve devono essere, rispettivamente, rossa, blu e
//       verde. Il disegno deve avere la legenda e contenere le opportune etichette.
//   (4) Se v è un vettore di n elementi, le componenti di v si indicano con v(1),...,v(n).
//       L'ultima componente di v si può indicare anche con v($). L'assegnamento
//       v($+1) = 2 * v($) ha l'effetto di (a) creare una nuova componente di v (la n+1 - esima)
//       e (b) assegnarle valore 2 v(n).
//
//       Realizzare il metodo ad un punto definito da una assegnata funzione h come segue:
//
//             function x = MetodoUnPunto(h,x0,N)
//                x = x0;
//                for i=1:N, x($+1) = h(x($)); end;
//             endfunction
//
//   (5) Utilizzare le istruzioni:
//
//             x0 = 0;
//             N = 10;
//             z = MetodoUnPunto(g,x0,N);
//
//       per generare la colonna z. Visualizzare le componenti di z, eseguire il comando
//       plot(z($),g(z($)),'ko') e discutere il risultato. Ripetere per x0 = 1 e x0 = 1.5.
//
clear;
clf();
//
function y = g(x)
    y = cos(x) / 2;
endfunction
//
function y = d1g(x)
    y = -sin(x) / 2;
endfunction
//
A = %pi * eye(3,3);
printf('A = '); disp(A);
printf('\ng(A) = '); disp(g(A));
printf('\nd1g(A) ='); disp(d1g(A));
//
halt('\n...premere Invio per continuare...\n');
t = linspace(0,%pi/2,500)';
plot2d(t,[g(t),t,abs(d1g(t))],style = [5,2,3]);
xgrid(); xlabel('t'),legend('g(t)','t','|g''(t)|');
//
halt('\n...premere Invio per continuare...\n');
//
function x = MetodoUnPunto(h,x0,N)
    x = x0;
    for i=1:N, x($+1) = h(x($)); end;
endfunction
//
x0 = 0;
N = 10;
z = MetodoUnPunto(g,x0,N);
//
printf('\nz ='); disp(z);
//
halt('\n...premere Invio per continuare...\n');
//
plot(z($),g(z($)),'ko');
