% Questo programma costruisce due vettori linearmente dipendenti.
% Successivamente perturba con valori pseudo-casuali uno dei due.
% Stima quindi col metodo dei minimi quadrati i parametri del modello
% lineare ed infine plotta sullo schermo dati e modello stimato (retta).



%       Commenti a cura di Alessandro Flati e Luigi Lunardon.



% Tramite il simbolo del percento, MATLAB ignora il testo scritto alla
% sua destra lungo la stessa riga.

clear
% clear libera (ovvero cancella dalla memoria) tutte le variabili usate finora.

close all
% close all chiude tutte le finestre di grafici al momento presenti sullo schermo.

% I seguenti quattro comandi rendono il programma 'parametrico'.

n = 30
% In questo modo assegno il valore 30 alla variabile n.
% Cosi' scritto, una volta eseguito il comando, MATLAB scrivera' su
% schermo 'n = 30'.

a = 2.5;
% Con l'aggiunta di un punto e virgola (semicolon) alla fine del
% comando, MATLAB evitera' di scrivere la variabile appena memorizzata.

b = 0.3;
% Per indicare numeri con la virgola, si deve utilizzare la
% notazione con il punto.

sigma = 1.;

% il blocco di comandi if 0 ... end serve per interpretare un intero blocco
% di righe come commento.
if 0
% Qui posso inserire qualsiasi cosa, poiche' MATLAB ignora tutti i
% comandi inseriti tra l'if e l'end se la condizione nell'if e' falsa.
% Lo 0 corrisponde al falso.
% L' 1 corrisponde al vero.
% Il seguente blocco for i=a:b ... end indica un ciclo for, dove 'a' e 'b'
% sono il valore iniziale e finale della variabile 'i'.
for i=1:n
% Sto cominciando un ciclo che va da 1 a n, ovvero le istruzioni
% contenute fino all' 'end' verranno ripetute n volte. Alla
% fine di ogni ciclo i viene aumentato di un'unita'.
y(i) = a*i + b;
x(i)=i;
% il programma assegna alla componente 'i' del vettore 'y'
% il valore a*i + b.
end % chiude il ciclo for.
end % chiude il comando if.

% Il comando seguente crea da solo un vettore x uguale a quello creato sopra.
x = linspace(1 , n , n)
% Il comando seguente crea da solo un vettore y uguale a quello creato sopra.
y = linspace(a , a*n + b , n)
% Il comando v=linspace(xx,yy,z) crea un vettore v con z componenti tali che v(1)=xx,
% v(z)=yy e che v(i+1)-v(i)=(yy-xx)/(n-1), i=1,..,z-1. Esso divide un segmento in n-1
% segmenti congruenti ed assegna alle componenti del vettore i valori degli estremi:
% v= [xx, (yy-xx)/(n-1), xx+2*(yy-xx)/(n-1), ... , xx+(n-2)*(yy-xx)/(n-1), yy].

y
% Con questo comando semplicemente visualizzo su schermo la variabile y (vettore).

% z = y + normrnd(0, sigma, 1, n);
% normrnd( mu, sigma, m, n ) genera una matrice mxn, che riempie con numeri
% pseudo-casuali i.i.d. relativi alla distribuzione normale (Gaussiana) di
% media mu e deviazione standard (radice quadrata della varianza) sigma.

z = y + rand(1,n)-0.5;
% rand(m,n) genera una matrice mxn con numeri pseudo-casuali i.i.d. relativi alla distribuzione
% uniforme nell'intervallo (0,1). Sottraiamo 0.5 per avere un v.a. uniforme in (-.5,.5).

who
% Il comando who stampa su video le variabili attualmente in memoria.

size(z)
% Stampa le dimensioni della variabile z (matrice).

plot(x,z,'+')
% Il comando plot(v,w,'+') plotta su un piano cartesiano le coppie del tipo (v(i),w(i)).
% Se inseriamo anche '+', i punti saranno rappresentati da un +. In assenza di cio', matlab
% congiungera' i punti con una spezzata. Per vedere dettagli di questo comando usare il
% comando help plot.

pause
% Con questo comando, MATLAB attende un mio input, ovvero che io prema un
% tasto sulla tastiera, prima di proseguire con il resto del programma.

% Calcoleremo adesso la retta dei minimi quadrati tra z e x. Tale retta, della forma
% z=aa*x+bb minimizza la somma dei quadrati di z(i)-aa*x(i)-bb. Per trovare i valori
% di aa e bb e' sufficiente derivare rispetto ad aa e bb tale sommatoria dei quadrati
% e risolvere il sistema di due equazioni lineari risultante.
% L'espressione di aa risulta:
% aa=[sum_i (z(i)-mean(z))*(x(i)-mean(x))] / [sum_i (x(i)-mean(x))*(x(i)-mean(x))]
% Tale espressione puo' essere calcolata in matlab come
aa = (z-mean(z))*(x-mean(x))'/((x-mean(x))*(x-mean(x))')
% mean(z) e' la media aritmetica dei valori di z. Poiche' abbiamo scritto z-mean(z), matlab
% interpreta mean(z) come se fosse una matrice delle stesse dimensioni di z.
% il simbolo A' indica l'hermitiana della matrice A, ossia la coniugata della trasposta.
% Per bb risulta invece
bb = (mean(z) - aa*mean(x))

hold on
% Tutti i grafici plottati dopo il comando hold on saranno rappresentati nella stessa finestra
% dove e' stato plottato l'ultimo grafico.
% Per far cessare il comando hold on ricorriamo ad hold off.
% Se vogliamo aprire una nuova finestra usiamo il comando figure.

zz = aa*x + bb;
% Nel vettore zz ci sono i valori previsti per la variabile dipendente dal modello lineare stimato dai dati x,z.

plot(x,zz)
save VariabiliLezione1 x, z;
% Salva le variabili x e z nel file VariabiliLezione1.mat in modo tale da
% poterle ricaricare in memoria con altri programmi col comando load(VariabiliLezione1).
% Se non sono specificate variabili dopo il nome del file, semplicemente salva
% tutte le variabili attualmente in uso.

print -dpdf GraficoLezione1.pdf
% Salva un file pdf contenente l'ultimo grafico generato dal programma.