DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Strumenti per il calcolo numerico Matlab/Octave Marco D. Santambrogio – [email protected] Ver. aggiornata al 24 Agosto 2015 Obiettivi DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Benvenuti nel fantastico mondo di Matlab/Octave! 2 Matlab DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Cos’è Matlab: • strumento (e corrispondente linguaggio) per elaborazioni di calcolo numerico • NB: sta per MATrix LABoratory » centrato sulle matrici (ma include generiche funzionalità matematiche) • usato nei successivi corsi di calcolo numerico • MATLAB è uno strumento commerciale distribuito, su licenza NON gratuita, da “The MathWorks Inc” • Student edition disponibile quando si è al Politecnico Esiste un altro strumento di nome Octave • identico nella concezione, molto simile per gli aspetti operativi • disponibile gratuitamente, vedi www.gnu.org/software/octave/ 3 Caratteristiche del linguaggio di Matlab/Octave (1) DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Linguaggio di alto livello simile a linguaggi di programmazione C, Java, Pascal possiede comandi sintetici per effettuare complesse elaborazioni numeriche • Linguaggio interpretato, comandi e istruzioni • NON tradotti in codice eseguibile dall’hardware • MA manipolati da un programma (l’interprete) che li analizza ed esegue azioni da essi descritte • Linguaggio dinamico NON occorre dichiarare le variabili • risultano definite dal punto in cui vengono introdotte – e vengono incluse in una struttura detta tabella dei simboli il tipo delle variabili è dinamico • a una variabile si possono assegnare, successivamente, valori di tipo diverso (scalari, stringhe, vettori, matrici...) 4 Caratteristiche del linguaggio di Matlab/Octave (2) DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • In Matlab/Octave tutto è un array ci sono casi particolari significativi di array • • • • array 1x1 sono gli scalari array con una sola riga o colonna sono i vettori array con due dimensioni sono le matrici array con >2 dimensioni: matrici multidimensionali 5 Per macchine PoliMI DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE https://virtualdesktop.polimi.it 6 Screenshot interfaccia MATLAB DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Mostra le variabili nel workspace Contenuto della directory corrente Storia dei comandi Finestra dei comandi Lancia i tool di MATLAB ed altro… - 7 -- 7 7 Screenshot dell’interfaccia OCTAVE DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Linea di comando dell’interprete 8 GUI di Octave DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Contenuto della directory corrente Finestra dei comandi Storia dei comandi 9 Comandi in Matlab DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Matlab accetta comandi che l’utente scrive di seguito al “prompt”: >> es. >> a = 10; Assegna alla variabile a il valore 10 • Esempio di alcuni comandi: help richiama la guida in linea diary può essere utilizzato per salvare la sessione di lavoro who, whos e workspace mostrano l’elenco delle variabili definite save permette di salvare in un file le variabili definite. Load le ricarica clear cancella tutte le variabili 10 Esempi DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Input Output Commento 1234/6 ans = 205.67 calcolo di un valore scalare a=1234/6 a = 205.67 assegnamento alla risultato di 1234/6 eps eps = variabile predefinita: la più piccola differenza rappresentabile tra due numeri 2/5 ans = 0.40000 divisione “destra” 5/0 ans = Inf divisione per zero 5^2 ans = 25 potenza real(4+5j) ans = 4 real è una funzione predefinita che restituisce la parte reale di un numero complesso 1+1==2 1+1~=2 ans = 1 ans = 0 1 = vero, 0 = falso, “==” uguale, “~=” diverso (codice ASCII di ‘~’: 126) 2.2204e-16 variabile a del 11 Esempi con gli array DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE a=[1 2; 3, 4] a = 1 3 a 2 4 a = restituisce il valore della variabile a 1 3 2 4 x=[-1.3 sqrt(3) (1+2)/5] x = -1.30000 1.73205 x(5)=abs(x(1)) x = -1.30000 1.73205 1.30000 b=a’ c=a+b x=[-1 0 2]; y=x' a ora è una matrice 2x2, “;” separa le righe; virgola opzionalmente separa elementi (ma basta lo spazio) b = 1 2 3 4 c = 2 5 5 8 elementi possono essere espressioni 0.60000 0.60000 0.00000 Notazione con () per accedere a elementi di una matrice; abs valore assoluto; NB: vettore x esteso per includere nuovo elemento; elementi non assegnati sono nulli matrice trasposta (scambiate righe e colonne) somma di matrici, elemento per elemento (sottrazione con “-” simile) y = -1 0 2 il “;” blocca l’output, ma non impedisce la valutazione - 12 - 12 Altre operazioni con gli array DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE a = [] x=1:5 a = x = 1 [] array vuoto, convenzionalmente rappresenta valore nullo 2 operatore “:” per produrre vettori di numeri 3 y=0:pi/4:pi y = 0.00000 1.57080 3.14159 v=10:-4:-3 v = 10 6 4 5 operatore “:” con passo di 0.78540 incremento e valori non interi (pi 2.35619 è pigreco) 2 -2 sin(y) ans = 0.00000 1.00000 0.00000 x=[0:pi/100:pi/2]'; [x sin(x)] ans = 0.00000 0.00000 0.03142 0.03141 ...... 1.53938 0.99951 1.57080 1.00000 valori negativi del passo e degli estremi funzioni predefinite si applicano ai 0.70711 vettori 0.70711 produce la tabella di sin(x), 0xp/2 13 Diagrammi a due dimensioni DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Diagramma = insieme di coppie che rappresentano coordinate di punti Si usano vettori per contenere sequenze ordinate dei valori di ognuna delle coordinate plot(x,y) disegna digramma cartesiano dei punti che hanno • valori delle ascisse in x, delle ordinate in y e li congiunge con una linea, per dare continuità al grafico funzioni xlabel per visualizzare nome asse ascisse, ylabel per ordinate, title per il titolo cubica 1000 800 >> x = -10:0.1:10; >> y=x.^3; >> plot(x,y); >> xlabel('ascisse'); >> ylabel('ordinate'); >> title('cubica'); 600 400 200 ordinate • • 0 -200 -400 -600 -800 -1000 -10 -8 -6 -4 -2 0 ascisse 2 4 6 8 10 14 Diagramma in GUI-Octave DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 15 Un esempio di cinematica DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Due treni partono da due stazioni adiacenti, che distano 15km, viaggiando a velocità di 50m/s e 30m/s in direzione opposta • Costruire un grafico che mostra il loro movimento, fino a quando il più veloce raggiunge la destinazione Il più veloce impiega 15000/50=300s • DistanzaTreno1=50·t; • DistranzaTreno2=15000-30·t; (per mostrare la provenienza dalla direzione opposta) 16 Soluzione DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE t=0:1:300; p1=50 * t; p2=15000 – 30 * t; plot(t,p1); hold on %adesso è possibile inserire nuove curve sul grafico plot(t,p2) hold off 17 Risultati ottenuti con l’esempio DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 18 Istruzioni e ‘;’ – Non come in C DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Le istruzioni possono essere seguite da ‘;’ ma non è obbligatorio • Il ‘;’ blocca la visualizzazione del valore delle variabili coinvolte nell’istruzione Maggiore velocità di esecuzione • Regola di buona programmazione Inserire sempre il ‘;’, a meno che non si voglia ispezionare il valore di una variabile a scopo di debugging 19 Commenti DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Il simbolo di commento può essere messo in qualsiasi punto della linea. • MATLAB ignorerà tutto quello che viene scritto alla destra del simbolo %. • Per esempio: >>% This is a comment. >>x = 2+3 % So is this. x= 5 20 Array e variabili DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • L’unità fondamentale di dati in MATLAB è l’array • Una variabile in MATLAB è una regione di memoria che contiene un array • Ha un nome definito dall’utente Per i nomi valgono regole simili a quelle del C • C è un linguaggio a tipizzazione forte Le variabili vanno dichiarate prima dell’uso • MATLAB è un linguaggio a tipizzazione debole Le variabili vengono create assegnando ad esse dei valori Il loro tipo è determinato dal tipo dei valori assegnati >> x = [1 2 3]; >> whos x; Name Size x 1x3 Bytes 24 Class Attributes double 21 Tipo char DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Una variabile di tipo char contiene uno scalare o un array di valori a 16 bit (8 bit in Octave), ciascuno dei quali rappresenta un carattere Es: commento = ‘questa e` una stringa’; variabile Array di 1x21 caratteri Nome (NB: della stringhe racchiuse tra apici singoli) whos commento; Name Size Bytes Class Attributes commento 1x21 42 char 22 Alcuni esempi… DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 23 Una piccola nota “italiana” DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 24 Tipo double DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Una variabile di tipo double contiene uno scalare o un array di numeri espressi in 64 bit con doppia precisione • Questi numeri possono essere Reali, es var1 = -10.7; Immaginari, es var2 = 4i; var3 = 4j; Complessi, es var3 = 10.3 + 10i; • Es: x = [-1.3 3.1+5.3j 0] • Le parti reali e immaginarie possono essere positive e negative nell’intervallo di valori [10308, 10308] 25 Creazione e inizializzazione di una variabile DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Le variabili sono create al momento dell’inizializzazione • Modi di inizializzazione Assegnamento Lettura dati da tastiera Lettura da file 26 Assegnamento DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • variabile = espressione contenuto di a • Esempi a = [0 7+1]; b = [a(2) 5 a]; secondo elemento di a • Risultato a = [0 8] b = [8 5 0 8] 27 Assegnamento: NOTA DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Non tutti gli elementi devono essere specificati alla creazione… Ricordiamo: pippo(2) è il secondo elemento di pippo Cosa sarà elemento_matrice_2D(6,3)? Ricordiamo: le variabili sono create al momento dell’inizializzazione 28 Quindi, “unendo” i ricordiamo… DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 29 Assegnamento (2) DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • L’array può essere esteso successivamente … d = [2 5]; d(4)=2; d = [2 5 0 2] • Operatore di trasposizione g = d’; 2 5 0 2 • Creare un vettore enumerando i valori di un insieme: uso dell’operatore ‘:’ x = 1:2:10; n = 1:3; m = [n’ n’] x = [1 3 5 7 9] n = [1 2 3] 1 2 3 1 2 3 30 Tabella delle funzioni predefinite DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Funzione Significato zeros (n) Genera una matrice nxn di zeri zeros (m,n) Genera una matrice mxn di zeri zeros (size(arr)) Genera una matrice di zeri della stessa dimensione di arr ones(n) Genera una matrice nxn di uno ones(m,n) Genera una matrice mxn di uno ones(size(arr)) Genera una matrice di uno della stessa dimensione di arr eye(n) Genera la matrice identità nxn eye(m,n) Genera la matrice identità mxn length(arr) Ritorna la dimensione più lunga del vettore size(arr) Ritorna un vettore [r c] con il numero r di righe e c di colonne della matrice; se arr ha più dimensioni ritorna array con numero elementi per ogni dimensione v(end) m(end, end) ultimo elemento di vettore v; ultimo elemento dell’ultima riga di matrice m; la costante end, come indice in un array, denota il più alto valore possibile dell’indice 31 Funzioni predefinite DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Esempi a = zeros(2); 0 0 0 0 b = zeros(2,3); 0 0 0 0 c = [1 2; 3 4]; d = zeros(size(c)); 0 0 0 0 0 0 32 sottoarray: applicazione a vettori DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Si denota un sottoinsieme di un array usando vettori per valori degli indici >> v=[6 8 4 2 4 5 1 3] v = 6 8 4 >> v([1 4 7]) ans = 6 2 1 >> v(2:2:6) ans = 8 >> v(3:end-2) ans = 4 >> v(v) ans = >> 2 2 2 4 1 3 primo, quarto settimo elemento 2:2:6 è il vettore [2, 4, 6]: indica secondo, quarto, sesto elemento 5 4 5 dal terzo al terz’ultimo elemento 5 i valori di v usati come indice 5 3 2 8 2 4 6 4 33 sottoarray: applicazione a matrici DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE m = 9 8 7 6 5 4 3 2 1 0 11 12 tutti gli elementi sulle righe 1 e 4 e sulle 0 0 0 colonne 2 e 3 >> m([1 4], [2 3]) ans = 8 7 11 12 tutti gli elementi delle righe 1, 3 e 5 >> m(1:2:5, 1:end) ans = 9 8 7 3 2 1 0 0 0 >>>> m(1:2:5, :) notazione ‘:’ abbreviata per 1:end, cioè tutti i ans = 9 8 7 valori di quell’indice 3 2 1 0 0 0 >> m(2:2:4, :) = [-1 -2 -3; -4 -5 -6]; >> m m = 9 8 7 uso della notazione dei sottoarray per -1 -2 -3 individuare elementi oggetto di 3 2 1 -4 -5 -6 assegnamento 0 0 0 >> 34 Nota sui sottoarray DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Perchè: temp(2:2:4, :)… e non temp(2:4, :)? Perchè temp(2:4, :) sono le righe 2, 3 e 4!!! 35 Uso di uno scalare per assegnare valori a un array DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Esempio m(1:4, 1:3) = 3 3 3 3 3 3 3 3 3 3 3 3 3 • Il modo con cui uno scalare viene assegnato a un array dipende dalla forma dell’array che viene specificata a sinistra dell’assegnamento • Esempio 2 m(1:2, 1:2) = 4 4 4 3 3 4 4 3 3 3 3 3 3 36 Uso dell’array vuoto [] per cancellare elementi di un array DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Un array vuoto [] assegnato a un elemento di un vettore non crea un ‘buco’ ma cancella un elemento e ricompatta il vettore • Un array vuoto [] non assegnabile a singoli elementi di matrici (non si possono “creare buchi”) • Assegnabile a intere righe o colonne di matrici, che vengono cancellate (ricompattando la matrice) >> a=[1 2 3 4 5]; >> length(a) ans = 5 >> a(3) ans = 3 >> a(3)=[] a = 1 2 4 >> a(3) ans = 4 >> length(a) ans = 4 5 >> m=magic(4) m = 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1 >> m(3,4)=[] ??? Subscripted assignment dimension mismatch. >> m(3,:)=[] m = 16 2 3 13 5 11 10 8 4 14 15 1 >> [r,c]=size(m) r = 3 c = 4 >> m(:,2)=[] m = 16 3 13 5 10 8 4 15 1 >> [r,c]=size(m) r = 3 c = 3 37 Array: memorizzazione DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Matrici memorizzate per colonna: colonna 1, poi colonna 2, 3, etc. ogni colonna memorizzata per indici di riga crescenti • Array memorizzati in forma lineare nella RAM variando più velocemente i primi indici più lentamente quelli successivi • NB: opposto a quanto avviene in C ... 1 3 1 2 3 4 5 6 5 2 4 6 ... 38 Array: forma linearizzata DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Si può accedere a un array a più dimensioni come se ne avesse una sola • Usando un unico indice si segue l’ordine della memorizzazione • Da NON usare nella programmazione ma aiuta a capire certi costrutti.... 39 Variabili predefinite DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Matlab definisce un insieme di variabili predefinite (es, pi) • Queste variabili spesso rappresentano importanti costanti della matematica (pi è pigreco, i e j sono sqrt(-1) ) Attenzione! Il valore di queste variabili può essere modificato, per esempio • circ1=2*pi*10; • pi = 3; • circ2=2*pi*10; Il valore di circ2 non sarà più la circonferenza di un cerchio • E` fortemente sconsigliato modificare il valore di una variabile predefinita ( evitare di usare variabili i e j come contatori) 40 Variabili predefinite più comuni DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Variabile Scopo pi contiene 15 cifre significative di p i, j contiene il valore i ( 1 ) inf (o Inf) rappresentazione dell’infinito (ottenuto di solito come risultato di una divisione per 0) nan Not-A-Number è il risultato di una operazione matematica non definita, es 0/0 clock contiene la data e l’orario corrente. E` un vettore di sei elementi (anno, mese, giorno, ora, minuti, secondi) date contiene la data corrente sotto forma di stringa eps epsilon: la più piccola differenza rappresentabile tra due numeri ans Variabile speciale usata per immagazzinare risultati non assegnati ad altre variabili 41 Operazioni con scalari e array DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Operazioni per gli scalari: + - * / ^ • Operazioni per gli array Elevamento a potenza Array operation: eseguita sugli elementi corrispondenti degli array coinvolti (devono avere lo stesso numero di righe e colonne); si indica aggiungendo un punto prima dell’operatore aritmetico a= 1 b=2 3 4 2 5 3 a .* b= 7 2 6 15 28 Matrix operation: segue le regole dell’algebra lineare (esempio: prodotto righe per colonne) a= 1 b=2 3 4 2 =3 a*b 5 7 12 17 26 37 a * bij k aik * bkj 42 Cosa succede con il . DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 43 Altre funzioni DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Funzione Scopo ceil(x) approssima x all’intero immediatamente maggiore floor(x) approssima x all’intero immediatamente minore fix(x) approssima x all’intero più vicino verso lo zero max(x) se x è un vettore, ritorna il valore massimo in x e, opzionalmente, la collocazione di questo valore in x; se x è matrice, ritorna il vettore dei massimi delle sue colonne min(x) se x è un vettore, ritorna il valore minimo nel vettore x e, opzionalmente, la collocazione di questo valore nel vettore; se x è matrice, ritorna il vettore dei minimi delle sue colonne mean(x) se x è un vettore ritorna uno scalare uguale alla media dei valori di x; se x è una matrice, ritorna il vettore contentente le medie dei vettori colonna di x; mod(m,n) mod(m,n) è m - q.*n dove q = floor(m ./ n) se n ~= 0 round(x) approssima x all’intero più vicino rand(N) genera una matrice di NxN numeri casuali 44 funzioni min (e anche max) applicate a vettori e matrici DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE >> b = [4 7 2 6 5] b = 4 7 2 >> min(b) ans = 2 >> [x y]=min(b) x = 2 y = 3 >> 6 5 (con un solo risultato) dà il valore del minimo con due risultati dà anche la posizione del minimo >> a = [24 28 21; 32 25 27; 30 33 31; 22 29 26] a = 24 28 21 32 25 27 30 33 31 22 29 26 per una matrice dà vettore dei minimi nelle colonne >> min(a) ans = 22 25 21 >> [x y]=min(a) x = 22 25 y = 4 2 >> 21 1 per una matrice, con due risultati dà due vettori dei valori minimi nelle colonne e della loro posizione (riga) 45 Operazioni tipiche per gli array DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Operazione Sintassi Commenti Matlab Array addition a+b Array e matrix addition sono identiche Array subtraction a–b Array e matrix subtraction sono identiche Array multiplication a .* b Ciascun elemento del risultato è pari al prodotto degli elementi corrispondenti nei due operandi Matrix multiplication a*b Prodotto di matrici Array right division a ./ b risultato(i,j)=a(i,j)/b(i,j) Array left division a .\ b risultato(i,j)=b(i,j)/a(i,j) Matrix right division a/b a*inversa(b) Matrix left division a\b inversa(a)*b Array exponentiation a .^ b risultato(i,j)=a(i,j)^b(i,j) 46 Matrix left division DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Serve per risolvere sistemi di equazioni lineari a11x1+a12x2+a13x3=b1 a21x1+a22x2+a23x3=b2 a31x1+a32x2+a33x3=b3 • può essere espresso come Ax=B con A= a11 a12 a13 a21 a22 a23 a31 a32 a33 B= b1 b2 b3 x= x1 x2 x3 • di conseguenza, x = A-1B=inversa(A)*b=A\B 47 Fonti per lo studio + Credits DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Fonti per lo studio Introduzione alla programmazione in MATLAB, A.Campi, E.Di Nitto, D.Loiacono, A.Morzenti, P.Spoletini, Ed.Esculapio • Capitolo 1 • Credits Prof. A. Morzenti 48