Indroduzione a MatLab Bernardi Mauro Sapienza, University of Rome MEMOTEF Department April 3rd, 2014 1 / 44 Sommario Cosa `e Matlab? Comandi Elementari Strutture di Dati Importazione Dati Grafici Definizione di funzioni 2 / 44 Che cos’`e Matlab? Matlab `e un linguaggio di programmazione orientato alla costruzione e validazione di modelli matematico-statistici applicabili non soltanto in ambito economico o finanziario, ma anche per la soluzioni di problemi in fisica, biologia o ingegneria. Il software `e distribuito da MathWorks. Ulteriori informazioni sulla licenza del software possono essere ottenute sul sito: http://www.mathworks.com Il programma MatLab (Mathematic Laboratory ) `e nato principalmente come programma destinato alla gestione di matrici. Le versioni successive sono state completate con serie di funzioni che permettono le pi` u complesse analisi numeriche, adatte all’analisi e alla soluzione di problemi di ottimizzazione, di controllo oppure alla creazione di appositi filtri per l’estrazione del segnale da un processo osservato con rumore, solo per citare alcuni esempi. 3 / 44 L’ambiente di Matlab dispone di: I un’ampia collezione di funzioni per l’analisi dei dati I una grande variet`a di operatori per il calcolo matriciale I elevate funzionalit`a grafiche per l’analisi dei dati I un linguaggio di programmazione ben strutturato con un editor interattivo e ottime potenzialit`a di debugging I un elevato numero di pacchetti di applicazioni aggiuntive, toolboxes, come ad esempio il Financial toolbox oppure l’Econometric toolbox I ampio supporto da parte della comunit`a degli utilizzatori. A questo proposito si consulti il sito http://www.mathworks.com/matlabcentral/). 4 / 44 La riga di comando La linea di comando di MATLAB `e indicata da un doppio prompt come nel sistema operativo DOS: >> situato all’interno della finestra dei comandi, command window. La linea di comando accetta dichiarazioni di variabili, espressioni e chiamate a tutte le funzioni disponibili nel programma di base oppure in uno dei toolbox installati. 5 / 44 Molte delle funzioni di MATLAB non sono altro che files di testo, con estensione .m, simili a quelli che l’utente pu` o generare con un text editor. Queste funzioni possono essere eseguite semplicemente digitandone il nome sulla linea di comando oppure possono essere modificate dall’utente utilizzando il comando edit, come nel seguente esempio: >> edit var.m L’esecuzione del comando apre una finestra, ovvero l’editor di matlab, contenente il codice della funzione che calcola la varianza, unitamente al commento della stessa funzione. Matlab permette inoltre di richiamare le ultime righe di comandi inseriti usando le frecce in alto e in basso. 6 / 44 Help di Matlab MATLAB presenta un help in linea con informazioni sulla sintassi di tutte le funzioni disponibili e di tutte le funzioni che sono presenti nei toolbox installati. Per accedere a queste informazioni, basta digitare da riga di comando, il comando help seguito dal nome della funzione di cui si vuole ottenere informazioni, come nel seguente esempio: >> help nomefunzione.m 7 / 44 ´ anche possibile chiedere informazioni su tutte le funzioni di una certa E categoria. Ad esempio per sapere quali sono le funzioni specifiche per l’analisi ed il controllo di sistemi dinamici, sar`a sufficiente digitare: >> help control Infine, per sapere quali sono le varie categorie di funzioni disponibili in tutti i toolbox installati, basta digitare semplicemente il comando help, come di seguito: >> help 8 / 44 I files di Matlab I files interpretati dal programma sono file di testo ASCII con estensione .m. Questi files sono generati con un text editor e sono eseguiti in Matlab semplicemente digitandone il nome, senza l’estensione, sulla linea di comando. Ad esempio, la seguente successione di comandi: >> >> >> >> >> % % n x y Generazione di numeri da una Normale Standard e calcolo della varianza empirica = 100; = randn(n, 1); = var(x); genera una sequenza di 100 numeri casuali da una distribuzione Gaussiana Standard, e ne calcola la varianza empirica. Le prime due righe di codice non vengono interpretate dal software in quanto precedute dal simbolo di percentuale %, che consente quindi l’inserimento di commenti. 9 / 44 La punteggiatura in Matlab Le istruzioni, siano esse contenute in un file .m lanciato da Matlab, oppure digitate direttamente dalla linea di comando, vanno sempre terminate con un punto e virgola, altrimenti il risultato dell’applicazione dell’istruzione viene visualizzato. Ad esempio il seguente comando; >> z = z = linspace(-2, 2, 6) crea una successione deterministica di 6 numeri in cui il primo `e −2 mentre l’ultimo `e 2 e ne visualizza l’output, ovvero il contenuto dell’oggetto z: >> z = linspace(-2, 2, 6) z = -2.0000 -1.2000 -0.4000 >> 0.4000 1.2000 2.0000 10 / 44 Alcuni costrutti in MATLAB permettono la concatenazione di diverse istruzioni che vanno separate con delle virgole. if (flag == 0), istruzioni separate da virgole; end; Le variabili seguono le regole dei linguaggi di programmazione come il Pascal o il C. Matlab `e case-sensitive e accetta nomi di variabili lunghi fino ad un massimo di 19 caratteri alfanumerici, con il primo obbligatoriamente alfabetico. 11 / 44 Per visualizzare il contenuto di una variabile `e sufficiente digitarne il nome senza punto e virgola sulla linea di comando. Tutti i calcoli effettuati in Matlab sono eseguiti in doppia precisione, ma si possono visualizzare in un formato diverso usando i comandi: I format short: Virgola fissa con 4 decimali I format long: Virgola fissa con 15 decimali I format short e: Notazione scientifica 4 decimali I format long e: Notazione scientifica 15 decimali Il risultato dell’ultima operazione `e memorizzato nella variabile ans. 12 / 44 Comandi di uso generale I I who elenco delle variabili definite in memoria whos informazioni su tutte le variabili in memoria I clear cancella tutte le variabili in memoria o una in particolare se specificata I save salva tutte le variabili in memoria sul file specificato, in vari formati I load richiama in memoria le variabili salvate sul file specificato 13 / 44 I diary salva sul file di testo ASCII diary quanto da quel momento in poi appare sullo schermo I what elenco di tutte le funzioni Matlab nell’area di lavoro (estensione .m) e dei file di dati che sono stati salvati (estensione .mat) 14 / 44 Comandi Elementari I comandi elementari consistono in espressioni ed assegnazioni. Le espressioni vengono valutate e il relativo valore viene visualizzato ma non resta in memoria. Le espressioni si dividono in due categorie fondamentali, le espressioni aritmetiche, che coinvolgono operazioni con numeri (naturali, reali, complessi,...) e le espressioni logiche che invece coinvolgono proposizioni logiche. Alcuni esempi delle due categorie di espressioni sono contenute nella seguente tabella. Aritmetiche Addizione Sottrazione Moltiplicazione Divisione Elevamento a potenza Radice quadrata >> >> >> >> >> >> 1+2 1-2 1*2 1/2 3^2 sqrt(9) Logiche Maggiore Minore Non inferiore Non superiore Uguglianza Disuguaglianza >> >> >> >> >> >> 1 1 1 1 1 1 > 2 < 2 >= 2 <= 2 == 2 != 2 15 / 44 Operatori scalari Gli operatori disponibili sono, solo per citarne alcuni: I addizione +, sottrazione −, moltiplicazione ∗, divisione / I elevamento a potenza, 24 I sin, cos, tan I asin, acos, atan I exp, log (naturale), log 10(in base 10) I abs, sqrt, sign 16 / 44 L’unit`a complessa `e i o j ed `e predefinita. Quando si svolgono operazioni che coinvolgono numeri complessi `e meglio non usare i o j come variabili o indici nei cicli. Un numero complesso si scrive nella forma z = a + i ∗ b. Ai numeri complessi possono essere applicati i seguenti operatori: I abs: modulo, es. abs(z) I angle: fase, es. angle(z) I real: parte reale, es. real(z) I imag: parte immaginaria, es. imag(z) 17 / 44 Vettori Esistono diversi tipi di strutture di dati che possono essere utilizzati in Matlab. Tra queste, la pi` u semplice struttura di dati `e il vettore numerico, che consiste in una n-upla ordinata di numeri. Un generico vettore z pu` o essere ottenuto in diversi modi: >> z = 1:5; >> z = linspace(1, 5, 5); Alcune volte un comando pu` o risultare pi` u comodo di altri: >> z = [1, 3, 5, 7, 9]; >> z = linspace(1, 9, 4); L’inserimento di un vettore in generale viene effettuato utilizzando le parentesi quadrate [], separando gli elementi delle righe con spazi o virgole, es. x=[1, 2, 3];. 18 / 44 Operazioni su vettori Consideriamo i vettori z ed y: >> z = 1:5 >> y = linspace(2, 10, 5) Alcune delle possibili operazioni che si possono effettuare utilizzando questi due vettori sono: Addizione Prodotto Scalare Prodotto Vettoriale Potenza Somma >> >> >> >> >> 6 + z y .* z 6 * z z^2 sum(z) Lunghezza Trasposizione Ordinamento Minimo Massimo >> >> >> >> >> length(z) z’ sort(z) min(z) max(z) Ogni comando ha una sua pagina di aiuto, che pu` o essere richiamata tramite il comando help nomecomando. 19 / 44 Una operazione particolare `e l’accesso a sottoinsiemi di elementi. Ad esempio: >> z = 5:20 I Secondo elemento di z: >> z(2) I Elementi dal primo al quinto: >> z(1:5) I Elementi maggiori di 10: >> z(z > 10) 20 / 44 Matrici e loro operatori Un altro tipo di struttura utilizzata da Matlab sono le matrici, che possono essere considerate come delle collezioni di vettori riga (colonna). L’inserimento di un vettore o di una matrice in generale viene effettuato utilizzando le parentesi quadrate [], separando gli elementi delle righe con spazi o virgole, e le diverse righe con punti e virgola (oppure andando a capo ad ogni nuova riga). X1 A 1 B 2 C 3 Dati X2 X3 2 3 3 4 4 5 >> dati = zeros(3, 4) oppure >> dati = [1, 2, 3, 4; 5, 6, 7, 8; 9, 10, 11, 12] 21 / 44 Anche per le matrici `e possibile l’indicizzazione: I il generico elemento am,n della matrice A, viene indirizzato come A(m, n ): >> dati(2,3) I la riga m-esima viene indirizzata come A(m, :), dove i due punti indicano che ci riferiamo a tutte le colonne >> dati(2,:) I la colonna n-esima viene indirizzata come A(:, n ), dove i due punti indicano che ci riferiamo a tutte le colonne: >> dati(:,2) I la prima e seconda colonna viene indirizzata come A(:, 1 : 2) >> dati(:,1:2) I la sottomatrice avente come estremi gli elementi di riga r1 fino a r2 e di colonna c3 fino a c4 viene indirizzata come A(r1 : r2 , c1 : c2 ) Nota: a differenza del linguaggio C, in Matlab tutti gli indici delle matrici e dei vettori partono da 1. 22 / 44 Operazioni su matrici Definite le matrici A e B aventi la stessa dimensione (2, 3), lo scalare c, e la matrice D di dimensione (3, 2), nel seguente modo: >> A = [1,2,3;2,3,4]; >> B = [7,2;9,8;4,1]; >> c = 6; >> D = [13,12;31,12;43,24]; possiamo definire le seguenti operazioni sulle matrici appena definite: Somma Prodotto Prodotto Vettoriale Divisione a sinistra Divisione a destra Trasposizione Indicizzazione >> >> >> >> >> >> >> A + B c * A A * D[,1] A\B = inv(A)*B B/A = B*inv(A) A’ A[1:2, 3] 23 / 44 Altre funzioni operanti essenzialmente su vettori (riga o colonna) sono: max, min, median, sort, sum, prod, length Esistono poi particolari operatori (.*, ./, .^) che permettono di effettuare operazioni su vettori elemento per elemento, senza ricorrere a cicli. Ad esempio, se x `e un vettore, per moltiplicare elemento per elemento i due vettori sin(x) e cos(x) basta eseguire il seguente comando: >> y = sin(x) .* cos(x); 24 / 44 Altre funzioni che operano invece essenzialmente su matrici sono: I inv, che definisce l’inverse I det, che definisce il determinante I size, che definisce la dimensione I rank, che definisce il rango I eig, che definisce la matrice di autovalori (ortonormale), e il vettore di autovalori Tutte le funzioni che operano su matrici hanno dei vincoli sugli operandi introdotti. Ad esempio non si pu` o invertire una matrice non quadrata. Per ulteriori spiegazioni sulla sintassi della funzione utilizzare il comando help. 25 / 44 Esistono infine varie funzioni predefinite per la creazione di matrici: I eye(n): matrice identit`a n righe n colonne I zeros(m,n): matrice di 0 con m righe e n colonne I ones(m,n): matrice di 1 con m righe e n colonne I rand(m,n): matrice casuale di valori tra 0 e 1 I diag(X): se X `e un vettore con n elementi, produce una matrice quadrata diagonale di dimensione n per n con gli elementi di X sulla diagonale. Se invece X `e una matrice quadrata di dimensione n per n, produce un vettore di n elementi pari a quelli sulla diagonale di X. 26 / 44 Esercizi 1. Assegnare al vettore z il valore “radice quadrata di diecimila”. 2. Creare il vettore pari10, sequenza dei primi dieci numeri pari. 3. Creare il vettore dispari100, sequenza dei primi dieci numeri dispari. 4. Estrarre il terzo valore del vettore pari 5. Estrarre tutti i valori di dispari100 maggiori di cinquanta. 6. Creare mat19, una matrice 3x3 di valori nulli. 7. Riempire la matrice mat19 dei seguenti valori: 1 4 7 2 5 8 3 6 9 27 / 44 Importazione Dati I dati vengono spesso raccolti in file separati. I file in formato testo vengono generalmente letti attraverso il comando importdata >> dati = importdata(’C:/.../ais.txt’) >> dati sex female female female female ... sport B_Ball B_Ball B_Ball B_Ball ... rcc 3.96 4.41 4.14 4.11 ... wcc 7.5 8.3 5.0 5.3 Hc 37.5 38.2 36.4 37.3 Hg 12.3 12.7 11.6 12.6 Fe 60 68 21 69 bmi 20.56 20.67 21.86 21.88 ssf 109.1 102.8 104.6 126.4 Bfat 19.75 21.30 19.88 23.66 lbm 63.32 58.55 55.36 57.18 H 195. 189. 177. 185. Il file contiene la rilevazione effettuata su un campione di 202 atleti, delle seguenti variabili: il sesso, l’attivit´a sportiva esercitata, il numero di globuli rossi, il numero di globuli bianchi, il livello di ematocrito, il livello di emoglobina, il livello di concentrazione della ferritina nel plasma, l’indice di massa corporea, l’indice di massa grassa, la percentuale di grasso, l’indice di massa magra, l’altezza e il peso. 28 / 44 Prime Elaborazioni I Estrarre la terza colonna della matrice e assegnarle il nome rcc >> rcc = dati(:,) I Calcolare la media campionaria dei dati contenuti in rcc n z= ∑ zi /n i =1 >> mediarcc = sum(rcc)/length(rcc) I Calcolare la varianza campionaria corretta del vettore rcc 2 ∑ni=1 (zi − z ) n−1 >> varianzarcc = (sum(rcc-mediarcc)^2)/(length(rcc)-1) s2 = 29 / 44 Prime Elaborazioni I Estrarre la terza colonna della matrice e assegnarle il nome rcc >> rcc = dati(:,) I Calcolare la media campionaria dei dati contenuti in rcc n z= ∑ zi /n i =1 >> mediarcc = sum(rcc)/length(rcc) I Calcolare la varianza campionaria corretta del vettore rcc 2 ∑ni=1 (zi − z ) n−1 >> varianzarcc = (sum(rcc-mediarcc)^2)/(length(rcc)-1) s2 = 30 / 44 Prime Elaborazioni I Estrarre la terza colonna della matrice e assegnarle il nome rcc >> rcc = dati(:,) I Calcolare la media campionaria dei dati contenuti in rcc n z= ∑ zi /n i =1 >> mediarcc = sum(rcc)/length(rcc) I Calcolare la varianza campionaria corretta del vettore rcc 2 ∑ni=1 (zi − z ) n−1 >> varianzarcc = (sum(rcc-mediarcc)^2)/(length(rcc)-1) s2 = 31 / 44 Prime Elaborazioni I Estrarre la terza colonna della matrice e assegnarle il nome rcc >> rcc = dati(:,) I Calcolare la media campionaria dei dati contenuti in rcc n z= ∑ zi /n i =1 >> mediarcc = sum(rcc)/length(rcc) I Calcolare la varianza campionaria corretta del vettore rcc 2 ∑ni=1 (zi − z ) n−1 >> varianzarcc = (sum(rcc-mediarcc)^2)/(length(rcc)-1) s2 = 32 / 44 Prime Elaborazioni I Estrarre la terza colonna della matrice e assegnarle il nome rcc >> rcc = dati(:,) I Calcolare la media campionaria dei dati contenuti in rcc n z= ∑ zi /n i =1 >> mediarcc = sum(rcc)/length(rcc) I Calcolare la varianza campionaria corretta del vettore rcc 2 ∑ni=1 (zi − z ) n−1 >> varianzarcc = (sum(rcc-mediarcc)^2)/(length(rcc)-1) s2 = 33 / 44 Prime Elaborazioni I Estrarre la terza colonna della matrice e assegnarle il nome rcc >> rcc = dati(:,) I Calcolare la media campionaria dei dati contenuti in rcc n z= ∑ zi /n i =1 >> mediarcc = sum(rcc)/length(rcc) I Calcolare la varianza campionaria corretta del vettore rcc 2 ∑ni=1 (zi − z ) n−1 >> varianzarcc = (sum(rcc-mediarcc)^2)/(length(rcc)-1) s2 = 34 / 44 Gli stessi risultati possono essere ottenuti tramite le funzioni mean e var, che restituiscono rispettivamente la media campionaria e la varianza campionaria corretta: >> mean(rcc) 4.718614 >> var(rcc) 0.2097423 Altre statistiche possono essere facilmente calcolate. Ad esempio la mediana: >> quantile(rcc, 0.5) 4.755 35 / 44 Grafici La funzione plot crea grafici bidimensionali: riceve in ingresso due vettori della stessa lunghezza e stampa i punti corrispondenti alle coordinate fornite dai due vettori. Ad esempio se si hanno due vettori x e y, il grafico corrispondente si ottiene come: >> plot(x, y); 36 / 44 Per tracciare il grafico di una qualsiasi funzione, `e perci`o necessario crearsi un opportuno vettore da usare come ascisse, passarlo alla funzione per ricavare un vettore contenente le ordinate, ed usare la funzione plot sui due vettori cos ottenuti. Ad esempio per tracciare la funzione sin(x) tra -4 e 4 si pu` o usare la serie di comandi: >> x = -4:0.01:4; >> y = sin(x); >> plot(x, y); Se si usa la funzione plot con un solo parametro complesso, il grafico rappresenter la parte reale e la parte immaginaria degli elementi del vettore. Ad esempio >> plot(y); con y complesso, equivale a: >> plot(real(y),imag(y)); 37 / 44 Per creare grafici di colori diversi o usando caratteri diversi dal punto si pu` o specificare dopo le coordinate una stringa di 2 elementi. Il primo `e il colore del grafico, il secondo il simbolo usato per contrassegnare i punti. Ad esempio >> plot(x, y, ’g+’); crea un grafico in verde usando dei + al posto dei punti. Questa opzione pu` o essere usata nei casi di grafici sovrapposti da stampare (se la stampante a disposizione non `e a colori e se non si cambia il tipo di simbolo, non si capisce pi` u nulla ... ). 38 / 44 Per ottenere un istogramma si usa il comando hist, come nel seguente esempio, nel quale generiamo 10000 osservazioni da una distribuzione Normale standard: >> n = 10000; >> x = randn(n, 1); >> hist(x, 100); 350 300 250 200 150 100 50 0 −4 −3 −2 −1 0 1 2 3 4 39 / 44 Il precedente grafico non risulta normalizzato, vale a dire che sull’asse delle ordinate presenta i valori assoluti anzich`e la stima della probabilit`a . Per ottenere l’istogramma normalizzato possiamo eseguire i seguenti comandi: >> >> >> >> >> [M,h] = hist(x, 100); M = M/(h(2) - h(1))/cT; bar(h, M, 1, ’w’); h = findobj(gcf,’Type’,’patch’); title(’Histogram’,’FontName’,’Tahoma’,’FontSize’,9); 40 / 44 Il seguente grafico rappresenta l’istogramma normalizzato dei valori precedentemente simulati. La linea rossa rappresenta invece la densit`a di probabilit`a teorica di una distribuzione Normale standard ottenuta utilizzando il comando normpdf. Histogram 0.5 0.45 0.4 0.35 0.3 0.25 0.2 0.15 0.1 0.05 0 −4 −3 −2 −1 0 1 2 3 4 41 / 44 Se invece si desidera ottenere una soluzione un po’ pi´ u raffinata possiamo fare il grafico di un istogramma lisciato che assomiglia molto alla densit´a di una variabile casuale continua, utilizzando il comando ksdensity. >> [f, xi] = ksdensity(x); >> plot(xi, f); 0.45 0.4 0.35 0.3 0.25 0.2 0.15 0.1 0.05 0 −5 −4 −3 −2 −1 0 1 2 3 4 5 42 / 44 Definizione di nuove funzioni In MATLAB `e possibile creare nuove funzioni. Basta creare un file con estensione .m e nome del file uguale a quella della funzione desiderata. La prima riga del file deve contenere il nome della funzione e gli argomenti di ingresso e di uscita. Ad esempio, in function z = myfun1(a,b) oppure in function [x, y] = myfun2(a,b) risulta che fun1 e fun2 sono nomi di funzioni; a e b sono argomenti di ingresso; x, y e z sono argomenti d’uscita. 43 / 44 Il blocco di linee di commento consecutive che eventualmente segue la prima linea del file viene visualizzato digitando il comando help seguito dal nome della funzione creata. Le variabili utilizzate in una funzione sono locali e quindi indipendenti da ´ possibile utilizzare anche variabili quelle dell’ambiente chiamante. E globali, a patto che vengano definite come tali sia nell’ambiente chiamante sia nella funzione, utilizzando il comando global seguito dai nomi delle variabili, separati da spazi. Ad esempio: global F G H 44 / 44
© Copyright 2024 Paperzz