% scaletta per la lezione del 6 novembre 2007
% uno script si esegue tutto in un colpo con F5
% o nel menu Debug -> Run
% mettere dei 'blocchi' cliccando la lineetta accanto al numero
% compare bollino rosso (ricliccando sopra, si cancella)
% Oppure, si esegue 'passp-passo' con F6 o F10 a seconda delle
% versioni di Matlab (vedi menu debug)
%

% prima di avviare lo script e' buona norma ripulire 
% il workspace 
clear

%   COME ESEGUIRE OPERAZIONI RIPETITIVE IN MODO COMPATTO:
%   I CICLI
%
%   uso del ciclo di for (ciclo chiuso)
%   applicazione all'esercizio della scorsa lezione


% SINTASSI:
%
% FOR indice = ESPRESSIONE
%
%           ISTRUZIONI
%
% END
%
% esempio:
% creare in una finestra 6 sottografici corrispondenti ciascuno al
% grafico di y = exp(-x.^2) .* cos(k*pi*x) con k=1:6
% sull'intervallo [-pi pi]

clear

% creiamo una finestra per il grafico: assegnamo il numero 100
figure(100)
clf

% creiamo un vettore di 251 punti per la x
x = linspace(-pi,pi, 251);


for k=1:6
    % selezioniamo la finestrella 
    subplot(2,3,k)
    % calcoliamo la y; attenzione all'uso di .^ e .* per operare 
    % 'elementwise'
    y = exp(-x.^2) .* cos(k*pi*x);
    % si noti l'uso degli "handle" per modificare
    % le caratteristiche di un grafico... (*)
    plhndl = plot(x, y);
    set( plhndl, 'Color', [ k/6 0 (6-k)/6 ]); 
    % convertiamo k in una stringa (di un carattere) per il titolo
    kappa = num2str(k);
    % con la virgola, concateniamo le stringhe
    title(['k = ', kappa]);
    % etichette sugli assi
    % (*) ... o in una sua parte
    xhndl = xlabel('x');
    % i tre punti ... istruiscono matlab a continuare il comando sulla
    % riga successiva
    set( xhndl, 'Fontname', 'Times', 'FontAngle', 'italic', ...
        'Fontsize', 12, 'Position', [3.5 -0.7 0]);
    ylabel('\it y', 'Rotation', 0, 'Position', [-3.75 0.7 0])
    % opzioni aggiuntive: assi ridotti al minimo (estesi quanto i dati)
    axis tight
    % griglia di riferimento
    grid on
    
    % tracciamo gli assi di riferimento
    hold on
    plot([-pi pi], [0 0], 'k', 'Linewidth', 1.5);
    
    assex = plot( [0 0], [-1 1] );
    set(assex, 'Color', [0 0 0], 'Linewidth', 1.5);
    
end

% seconda parte

clear


% grafici tridimensionali

%   vogliamo rappresentare il grafico di
%
%   z = x(1-x)y(1-y) 
%
%   sul rettangolo [0,1] X [0,1]

n = 9;
m = 9;
x = linspace(0,1,n);
y = linspace(0,1,m);

%   creiamo una 'mesh'
%   vediamo cosa contiene [X,Y] omettendo il ;
[X,Y] = meshgrid(x,y)

%   calcoliamo la funzione
Z = X .* (1-X) .* Y .* (1-Y);

% uso di max e min
% su un vettore
xmax = max( x );
xmin = min( x );

% e su una matrice: basta calcolare il 'massimo del massimo'
% poiche' il primo massimo restituisce un vettore...
Zmax = max(max(Z));
Zmin = min(min(Z));

% frafici 3D
figure(1)
%   ripuliamo la figura da altri grafici
clf
%   grafico a superfice (approsimata con tasselli)
surf(X,Y,Z);

figure(2)
clf
%   grafico a curve di livello
contour(X,Y, Z);

% per tracciare un numero N di curve di livello
N = 21;
contour(X,Y, Z, N);

% e' possibile anche tracciare le curve corrispondenti a certi valori
contour(X,Y, Z, [0 0.01 0.025 Zmax]);

% per tracciare una sola curva, corrispondente a un valore vk
vk = 0.045;
hold on
contour(X,Y, Z, [vk vk]);

% e' possibile anche modificare selettivamente una curva tracciata
% direttamente...
contour(X,Y, Z, [0.055 0.055], 'Linecolor', 'k');

% o tramite handle
[ lv, lhndhl] = contour(X,Y, Z, [0.06 0.06]);
% lv contiene la sequenza di punti della curva
% con x e y su due righe
set( lhndhl, 'Linewidth', 3.0, 'Linecolor', [ 0.1 0.6 0.3])

figure(4)
clf
% grafico a 'griglia'
mesh(X,Y,Z);

%   per vedere le opzioni possibili
help graph3d

% ripetere le operazioni dalla riga 90 su grafici 3d
% con risoulzione maggiore
% ( m=101; n=101 )

