% scaletta per la lezione del 13 novembre 2008
% 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 (2)
%
% esempio di utilizzo del costrutto WHILE....END

% un po' di successioni ricorsive

edit successione

help successione

a1 = 9;
as = 1e4;

% nota: il file successione.m fornito e' incompleto. 
% Aggiungere un'ulteriore riga:
% x=a;

seq = successione(a1, as)

help successione2

seq2 = successione2(a1)

seq2 = successione2(100);

% discutere la modifica in successione2b/2c

edit successione2b
edit successione2c

% ulteriore costrutto: 
% switch (espressione)
%	case (valore 1)
%		blocco istruzioni
%	case (valore 2)
%		blocco istruzioni
%	...
%	otherwise
%		blocco istruzioni
%	end

% esempio: usare il costrutto per implementare la
% successione 2

%   Esercizi:
%   1.  realizzare il codice polygons.m
%       come funzione di un numero n da fornire in ingresso
%       che disegna in sottografici (subplot) differenti 
%       i poligoni regolari a 3, 4, 5, ... n lati (n<=11).
%       Il codice deve 
%       a. segnalare con un messaggio di errore se
%       viene inserito un numero inferiore a 3 o superiore a 11.
%       b. dividere la finestra principale in un numero adeguato
%       di subplot ben distribuiti
%       Suggerimento: si consultino le funzioni REM, FLOOR, CEIL, FIX
%
%   2.  scrivere un codice per risolvere le equazioni di secondo grado.
%       a*x^2 + b*x +c = 0
%       Input: a, b, c.
%       Output: messaggio circa il caso 
%       (radici reali distinte/coincidenti, non esistenti in campo
%       reale, ecc.)
%       x1, x2
%       Usare il costrutto SWITCH...CASE...END
%


%%%
% input e output

% visualizzazione di messaggi a schermo

% in presenza di un errore (per bloccare un programma)
% (cfr polygons.m)
%error('WARNING: Non esistono figure regolari con meno di 3 lati')


% caso semplice
disp('Visualizza la stringa che e'' inserita come argomento')

% visualizzazione formattata
fprintf('Visualizza la stringa che e'' inserita come argomento\n')

fprintf('Se vado a capo due volte\n\n')

% visualizzazione di variabili

x = 3.14;

fprintf('\nIl valore di x e'':\t %f.\n', x)

% esempio di uso di fprintf per creare tabelle

edit tabcossin

% uso del comando save per salvare un workspace

save fogliomatlab

% se ora si cancella il workspace....
clear

% e' possibile ricaricare tutte le variabili e i loro valori
% con il comando load
load fogliomatlab

% l'estensione di default e' .mat (foglio dati di matlab)
% e' possibile imporre anche altri formati:
% ad esempio, ASCII:

clear
tabcossin
% creo un vettore con i numeri da 1 a n, da affiancare
nk = 1:n;

% sintassi
% SAVE <nomefile> <elenco variabili da salvare (default:tutte) <formato>
save tabella.dat nk x c s -ascii


% ora e' possibile ricaricare il file
% per fare questo in maniera agevole
% le variabili memorizzate devono essere
% di uguale dimensione
% in modo da creare una matrice regolare

clear
load tabella.dat
% ora nel workspace e' presente una matrice di nome tabella
% che contiene le variabili nk x c s (nell'ordine in cui vi 
% sono state scritte: il default sarebbe quello alfabetico)

% e' anche possibile assegnare ad una variabile la matrice tabella
M=load('tabella.dat')'
% l'apice consente di realizzare la trasposta 
% (scambio di righe con colonne)

% Interpolazione in una variabile (2D)
n=10;
x = linspace(0, 2*pi, n+1);
y = cos(x);

xinterp = linspace(0, 2*pi);
yinterp = interp1( x, y, xinterp);

figure(1)
clf
hold on
plot(x, y, 'or')
plot(x, y, '*k', xinterp, yinterp, 'k-');

%   ATTENZIONE
% fenomeno di Runge (interpolazione su nodi equidistanti)

%   f(x) = 1/(1+25*x^2)
%   xni = -1 + i*10/n

%   usare polyfit
% n = 4,9,14,19

%   Interpolazione avanzata: 3D
clear

% carichiamo i dati
% si noti l'uso di LOAD con il file come argomento di funzione
data = load('datimappa.txt');

% creiamo utili vettori ausiliari
xd = data(:,1);
yd = data(:,2);
zd = data(:,3);

% creiamo una serie di 'etichette' (label) con due cifre
labels = num2str( data(:,3), 2);

% visualizzazione 2D dei dati
figure(2)
clf
hold on
plot(xd,yd,'o')
% con il comando TEXT scriviamo le etichette
% sintassi: text( X, Y, STRINGA)
% aggiungiamo una piccola quantita' alle xd, yd
% per non sovrapporre la scritta al punto del dato
text(xd+0.25,yd+1,labels)
% poiche' xd, yd e labels contengono molte righe,
% text viene eseguito in automatico 'riga per riga',
% come se ci fosse un ciclo di for:
% for i = 1:length(xd)
%     text( xd(i)+0.25, yd(i)+1, labels(i) )
% end

% cerchiamo opportuni limiti
xmin = min(xd);
xmax = max(xd);
ymin = min(yd);
ymax = max(yd);

xL = 10*floor(xmin/10);
xH = 10*ceil(xmax/10);
yL = 10*floor(ymin/10);
yH = 10*ceil(ymax/10);

%prepariamo i dati per la visualizzazione 3D
x = xL:1:xH ;
y = yL:1:yH ;
[XI,YI] = meshgrid(x,y);

% interpolazione
ZI = griddata( xd, yd, zd, XI, YI, 'v4');
% v4 e' l'opzione per l'interpolazione spline biarmonica

% curve di livello
figure(3)
contour(XI, YI, ZI)

% possiamo anche imporre il numero di curve di livello
figure(4)
contour(XI, YI, ZI, 10)

% determiniamo in automatico gli estremi di zd
zmin = min(zd);
zmax = max(zd);

v = zmin-5 : 5 : zmax+5;

figure(5)
[c,h] = contour(XI, YI, ZI, v);
% c contiene le curve di livello
% h contiene gli handle per le curve di livello

% mettiamo etichette alle curve di livello: CLABEL
clabel(c,h);

% barra colori
figure(6)
contourf(XI, YI, ZI, v), colorbar;
hold on
plot(xd,yd,'k*')
text(xd+1,yd,labels)
hold off

% pseudocolori PCOLOR
figure(7)
pcolor(XI,YI,ZI), shading flat
hold on
% aggiungiamo linee di livello nere
contour(XI, YI, ZI, v, 'k')
hold off


% 3D

% con mesh
figure
mesh(XI,YI,ZI), view(-38,30)

% altro pdv
mesh(XI,YI,ZI), view(0,90)

% come cambiare la mappa dei colori
surf(XI,YI,ZI), colormap('hot'), colorbar

% combinato con curve di livello nel piano: SURFC
figure
surfc(XI,YI,ZI)

% con risoluzione maggiore
x = 420:0.25:470 ;
y = 70:0.25:120 ;
[XI,YI] = meshgrid(x,y);
ZI = griddata( xd, yd, zd, XI, YI, 'v4');

% visualizzazione piu' "lucida"
figure
surf(XI,YI,ZI), shading interp, light, axis off
hold on
% linee di livello 3D: CONTOUR3
contour3(XI, YI, ZI, v, 'k')
hold off

