Laboratorio di Processi Stocastici Alberto Sorrentino www.fisica.unige.it/~sorrentino/Teaching A proposito di processi stocastici... II Giovedì 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 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 Cos’è? (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.” 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”. MATLAB Contenuto Cartella Finestra di comando principale Lista comandi passati Variabili MATLAB non richiede di dichiarare le variabili Provare 2+2 a a=1 a b=1; b Per Credere 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? 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 Vettori Definizione “esplicita” Vettore riga Vettore colonna vr = [1 2 3 9 8 7] vc = [1; 2; 3; 9; 8; 7] Definizione “implicita” Vettore riga VR = 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) U = ones(5) I = eye(5) matrice nulla (quadrata) matrice di uno (quadrata) 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 Ciclo while while condizione Istruzioni end If / else if condizione1 Istruzioni elseif condizione2 (opzionale) Istruzioni else (opzionale) 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. Functions Funzione: file di testo contenente un’intestazione File New M-File File New M-File function v = funzione_prova(N) N = 10; for i = 1:N v(i) = i^2 end for i = 1:N v(i) = i^2 end Salvare il file con script_prova.m Salvare il file con funzione_prova.m Dalla command window, lanciare script_prova Dalla command window, lanciare funzione_prova(10) Esiste la variabile i ??? Esiste la variabile i ??? Visualizzazione - plot x = -10:10 y = x.^2 Definiamo due vettori figure Crea una figura vuota plot( x ) plot( y ) Mette in ascissa l’indice della componente del vettore, in ordinata il valore della componente plot( x, y ) Mette in ascissa i valori del vettore “x”, in ordinata i valori del vettore “y”; “x” e “y” devono essere lunghi uguali!! plot( x, y, ’ r ’ ) Rosso tratteggiato plot( x, y, ’ . ’ ) Punti hold on Per mettere più oggetti nella stessa figura Visualizzazione – altri comandi www.fisica.unige.it/~sorrentino/Teaching 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 www.fisica.unige.it/~sorrentino/Teaching 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 INF DELTA 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 SUP Algoritmo istogramma (semplice) Per ogni elemento del vettore data(i) Non esistono domande stupide. Esistono solo risposte stupide. Per ogni intervallo Se data(i) è compreso nei valori dell’intervallo Incrementare il contatore relativo a quell’intervallo INF DELTA SUP Il j-esimo intervallo ha come estremi INF+(j-1)*DELTA e INF+j*DELTA 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 end 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... INF 1 SUP 2 k 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)