Laboratorio di Processi Stocastici Alberto Sorrentino
IIGiovedì 3 Dicembre ore 11:15 aula PC2 (116/117) – 1° piano III SMID Venerdì 4 Dicembre ore 9:30 aula MAC (114/120) – 1° piano III MATE Giovedì 11 Dicembre ore 11:15 aula PC2 (116/117) – 1° piano A proposito di processi stocastici...
Obiettivi, metodi e piano di lavoro Obiettivi: applicare la teoria, imparare a smanettare, divertirsi (...) Metodi: No dimostrazioni Prima pensare poi fare; ma se proprio non capite niente, almeno fate qualcosa, che aiuta... Piano di lavoro: Ripasso di MATLAB Creazione di istogrammi Generazione di numeri casuali Analisi dati DNA Simulazione processo di Poisson Implementazione test statistici
Parte Zero Ripasso di MATLAB
MATLAB (Wikipedia) “MATLAB (abbreviazione di Matrix Laboratory) è un ambiente per il calcolo numerico e l'analisi statistica che comprende anche l'omonimo linguaggio di programmazione consente di manipolare matrici, visualizzare funzioni e dati, implementare algoritmi.” Cos’è? Perché? 1.Perché lo conosco 2.Perché ”è usato da milioni di persone nell'industria, nelle università e funziona su diversi sistemi operativi, tra cui Windows, Mac OS, GNU/Linux e Unix”.
Contenuto Cartella Lista comandi passati Finestra di comando principale MATLAB
MATLAB non richiede di dichiarare le variabili 2+2 a a=1 a b=1; b Provare MATLAB funziona come un calcolatrice MATLAB non sa chi sia “a” Per assegnare un valore ad “a” si usa “=“ Ora MATLAB sa chi è “a” Se volete assegnare un valore senza visualizzare, usate “;” Claro? Per Credere Come faccio a sapere cosa ho già dichiarato? Il WORKSPACE!! Cancellare una variabile “a” non più utile: clear a Svuotare il workspace (da fare spesso per evitare casini!!): clear all Variabili
Vettori Definizione “esplicita” Vettore rigavr = [ ] Vettore colonna vc = [1; 2; 3; 9; 8; 7] Definizione “implicita” Vettore rigaVR = 1:3:16 (primo_valore : incremento : estremo_superiore) Vettore colonna VC = (5:-2:-3)’ (primo_valore : incremento : estremo_superiore)’ L’apice indica la trasposizione Il k-esimo elemento del vettore “vr” si trova con vr(k) Per selezionare un sottoinsieme (sotto-vettore) di un vettore vr(indice_iniziale : indice_finale)
Matrici Definizione “esplicita” Come per i vettori si va a capo con “;”M = [1 2 3 ; 4 5 6] La i-esima riga della matrice è M( i, : ) La j-esima colonna della matrice è M( :, j ) Il “:” serve a selezionare un intervallo; se gli estremi non sono indicati, seleziona tutti i valori Comandi per matrici “predefinite” Z = zeros(5) matrice nulla (quadrata) U = ones(5)matrice di uno (quadrata) I = eye(5)matrice identica
Operazioni con vettori e matrici Le operazioni “naturali” di somma e sottrazione vengono eseguite con i simboli normali (+/-) Il prodotto standard tra vettori e matrici (o tra vettori e vettori, o tra matrici e matrici) è il prodotto riga per colonna Per moltiplicare ELEMENTO PER ELEMENTO si usa “.* “ Verificare la differenza tra U*I e U.*I
Cicli e condizioni Ciclo for for indice = primo_valore:incremento:ultimo_valore Istruzioni end If / else if condizione1 Istruzioni elseif condizione2 (opzionale) Istruzioni else (opzionale) Istruzioni end Ciclo while while condizione Istruzioni end
Condizioni RICORDARE SEMPRE: Il segno “=“ serve per ASSEGNARE un valore a una variabile. Per CONFRONTARE una variabile con un valore (o con un’altra variabile), si usa “==“. Esempi di condizioni valide: A>1 A==0.5 A==3 && (B==5 || B==7 ) Provare ad esempio A=1 If A==1 disp (‘A vale 1’) End
Script Uno script è un file di testo che MATLAB interpreta come una sequenza di comandi. File New M-File N = 10; for i = 1:N v(i) = i^2 end Salvare il file con script_prova.m Dalla command window, lanciare script_prova Esiste la variabile i ??? Functions Funzione: file di testo contenente un’intestazione File New M-File function v = funzione_prova(N) for i = 1:N v(i) = i^2 end Salvare il file con funzione_prova.m Dalla command window, lanciare funzione_prova(10) Esiste la variabile i ???
Visualizzazione - plot plot( x ) plot( y ) plot( x, y ) plot( x, y, ’ r ’ ) plot( x, y, ’. ’ ) Mette in ascissa l’indice della componente del vettore, in ordinata il valore della componente Mette in ascissa i valori del vettore “x”, in ordinata i valori del vettore “y”; “x” e “y” devono essere lunghi uguali!! Rosso tratteggiato Punti figureCrea una figura vuota hold on Per mettere più oggetti nella stessa figura Definiamo due vettorix = -10:10 y = x.^2
Visualizzazione – altri comandi D = load(‘dato_per_plot.dat’); size(D) figure bar(D) figure image(D) figure contour(D) figure quiver(D(:,1), D(:,2), D(:,3), D(:,4))
Panico... Non ricordate l’utilizzo di un comando? help comando Non sapete come fare qualcosa? Volete saperne di più? helpwin
Primo esercizio: creare l’istogramma di un vettore Caricare il vettore dei dati nella variabile “data”: data = load(‘dato_per_istogramma.dat’); size(data) Osserviamo i dati plot(data) plot(data, ones(size(data)), ’. ’)
Algoritmo istogramma Scelta degli estremi e della larghezza intervallo INFSUPDELTA Contiamo quanti elementi del vettore cadono in ogni intervallo: creiamo un vettore il cui valore i-esimo rappresenti il numero di conteggi nell’i-esimo intervallo
Algoritmo istogramma (semplice) Per ogni elemento del vettore data(i) Per ogni intervallo Se data(i) è compreso nei valori dell’intervallo Incrementare il contatore relativo a quell’intervallo INFSUPDELTA Il j-esimo intervallo ha come estremi INF+(j-1)*DELTA e INF+j*DELTA Non esistono domande stupide. Esistono solo risposte stupide.
Algoritmo istogramma (semplice) INF = -4; SUP = 4; DELTA = 0.4; NUM_INT = (SUP-INF)/DELTA; % numero di intervalli contatore = zeros(1,NUM_INT) % inizializziamo il contatore; for i = 1:size(data,2) % per ogni dato for j = 1: NUM_INT % per ogni intervallo if data(i)>INF+(j-1)*DELTA && data(i)<INF+j*DELTA contatore(j) = contatore(j)+1; end VALORI = INF+DELTA/2 : DELTA : SUP-DELTA/2 figure bar(VALORI, contatore)
Algoritmo istogramma (efficiente) L’algoritmo appena scritto fa un ciclo di troppo... INFSUP 1 2k Osserviamo che il singolo valore data(i) INF < data(i) < SUP 0 < data(i)-INF < SUP-INF=DELTA*NUM_INT 0 < (data(i)-INF)/DELTA < NUM_INT Non esistono domande stupide. Esistono solo risposte stupide.
Algoritmo istogramma (efficiente) INF = -4; SUP = 4; DELTA = 0.4; NUM_INT = (SUP-INF)/DELTA; % numero di intervalli contatore = zeros(1,NUM_INT) % inizializziamo il contatore; for i = 1:size(data,2) % per ogni dato j = ceil((data(i)-INF)/DELTA); contatore(j) = contatore(j) + 1; end VALORI = INF+DELTA/2 : DELTA : SUP-DELTA/2 figure bar(VALORI, contatore)