Introduzione all’uso di MATLAB Lidia Aceto Dipartimento di Matematica Applicata “U. Dini” Università di Pisa E-mail: [email protected] Lidia Aceto (Facoltà di Ingegneria) Matlab 1 / 73 Introduzione Informazioni generali Matlab è un sistema interattivo che consente, in modo molto semplice ed intuitivo, di definire algoritmi per la elaborazione numerica di matrici vettori e scalari sono considerati come particolari matrici; il suo nome, infatti, è l’acronimo di MATrix LABoratory; è un software dotato di notevoli capacità grafiche in 2 e 3 dimensioni; include un help in linea molto ben documentato. Lidia Aceto (Facoltà di Ingegneria) Matlab 2 / 73 Introduzione Informazioni generali Per avviare Matlab in ambiente Windows è sufficiente selezionare con il mouse l’icona Si aprirà una finestra, suddivisa in sottofinestre tra cui il Command Window (quadro comandi) Quando nel quadro compare il prompt ≫ si può cominciare a lavorare in Matlab. Per uscire da Matlab digitare il comando exit oppure quit. Lidia Aceto (Facoltà di Ingegneria) Matlab 3 / 73 Introduzione Help in linea Per consultare l’help in linea di Matlab si può: digitare help <nomecomando> da prompt dei comandi ad esempio, digitando >> help sqrt SQRT Square root. SQRT(X) is the square root of the elements of X. Complex results are produced if X is not positive. ..... ..... selezionare MATLAB Help dal menù Help si aprirà un browser di Help; dall’Help Navigator che trovate sulla sinistra potete selezionare l’argomento che desiderate consultare. Lidia Aceto (Facoltà di Ingegneria) Matlab 4 / 73 Definizione di matrici Il concetto di variabile in informatica, una variabile identifica una porzione di memoria destinata a contenere dei dati che possono essere modificati; in Matlab, le variabili più utilizzate contengono gli elementi di una matrice; ad ogni variabile è associato un nome (o identificatore) composto da caratteri alfanumerici, con distinzione fra lettere maiuscole e minuscole, che viene utilizzato per accedere ai valori della variabile; Matlab non richiede alcuna dichiarazione a priori di tipo e/o dimensione delle variabili che utilizza (è un interprete); quando incontra la definizione di una nuova variabile crea automaticamente tale variabile allocando lo spazio di memoria necessario per memorizzarla. Lidia Aceto (Facoltà di Ingegneria) Matlab 5 / 73 Definizione di matrici Definizione di matrici È possibile definire una matrice in molti modi diversi fra cui definizione elemento per elemento; definizione a blocchi; definizione mediante funzioni elementari. Lidia Aceto (Facoltà di Ingegneria) Matlab 6 / 73 Definizione di matrici Definizione elemento per elemento >> A=[1 2 3; 4 5 6; 7 8 9] A = 1 4 7 2 5 8 3 6 9 È stata definita una nuova variabile il cui nome (o identificatore ) è A a cui si è assegnata la seguente matrice 3 × 3 1 4 7 2 3 5 6 8 9 il risultato della assegnazione viene visualizzato. Se non si desidera questo occorre terminare l’istruzione con “; ”(punto e virgola). Lidia Aceto (Facoltà di Ingegneria) Matlab 7 / 73 Definizione di matrici Definizione elemento per elemento >> A=[1 2 3; 4 5 6; 7 8 9]; >> A A = 1 4 7 2 5 8 3 6 9 con la prima istruzione abbiamo definito la variabile A assegnandole la stessa matrice dell’esempio precedente ed abbiamo richiesto di non visualizzarne il valore; con la seconda istruzione abbiamo chiesto a Matlab di visualizzare il valore di una variabile precedentemente definita. Lidia Aceto (Facoltà di Ingegneria) Matlab 8 / 73 Definizione di matrici Definizione elemento per elemento Un modo alternativo per definire la stessa matrice che è visivamente più vicino alla struttura della stessa è il seguente >> A=[1 4 7 A = 1 4 7 2 5 8 3 6 9] 2 5 8 3 6 9 In generale nella definizione di una matrice gli elementi di una riga possono essere separati con uno o più spazi bianchi (come negli esempi precedenti) oppure con una virgola; le righe possono essere separate con un punto e virgola oppure premendo Invio Lidia Aceto (Facoltà di Ingegneria) Matlab 9 / 73 Definizione di matrici Vettori e scalari Vettore riga o colonna >> riga = [8, 9, 2, 1, 2] riga = 8 9 2 1 2 >> colo = [7 ; 6 ; 1] colo = 7 6 1 Scalare >> s = [2] s = 2 >> s = 2 s = 2 Lidia Aceto (Facoltà di Ingegneria) Matlab 10 / 73 Definizione di matrici Accesso agli elementi di una matrice o di un vettore Per accedere ad un particolare elemento di una matrice o di un vettore occorre procedere come mostrato nel seguente esempio >> A=[1 4 7 2 5 8 3 6 9]; >> a22 = A(2,2) a22 = 5 >> v = [8 9 2 1 2]; >> v4 = v(4) v4 = 1 Lidia Aceto (Facoltà di Ingegneria) Matlab 11 / 73 Definizione di matrici Dimensionamento automatico di matrici >> A = [3 7 1; 4 2 9] A = 3 7 1 4 2 9 >> A(3,5) = 5 A = 3 7 4 2 0 0 1 9 0 0 0 0 0 0 5 la seconda istruzione assegna all’elemento in posizione (3, 5) (ossia terza riga e quinta colonna) il valore 5; la dimensione della matrice viene aggiornata automaticamente in modo tale da poter eseguire la assegnazione richiesta; gli elementi non inizializzati vengono posti uguale a zero; gli indici delle matrici devono essere interi positivi. Lidia Aceto (Facoltà di Ingegneria) Matlab 12 / 73 Definizione di matrici Dimensionamento automatico di matrici >> A = [3 7 1; 4 2 9] A = 3 7 1 4 2 9 >> A(1,3) = 5 A = 3 7 4 2 5 9 >> A = [1 0; 0 1] A = 1 0 0 1 la seconda istruzione modifica soltanto il valore in posizione (1, 3). Gli altri elementi vengono mantenuti inalterati; la terza istruzione ridefinisce completamente il valore di A cambiandone la dimensione (da (2 × 3) a (2 × 2)) ed il valore di tutti gli elementi. Lidia Aceto (Facoltà di Ingegneria) Matlab 13 / 73 Definizione di matrici Definizione di matrici a blocchi Le matrici possono anche essere definite concatenando altre matrici precedentemente inizializzate. >> A = [3 7 1; 4 2 9] A = 3 7 1 4 2 9 >> B = [10 5;11 8] B = 10 5 11 8 >> C = [A B] C = 3 7 1 10 4 2 9 11 5 8 Le dimensioni delle matrici coinvolte devono essere compatibili. Lidia Aceto (Facoltà di Ingegneria) Matlab 14 / 73 Definizione di matrici Matrici elementari Matrici elementari possono essere costruite facendo uso di istruzioni built-in. Le più usate sono: zeros(m,n): matrice di dimensione (m × n) con elementi tutti nulli; ones(m,n): matrice di dimensione (m × n) con elementi tutti uguali ad 1; rand(m,n): matrice di dimensione (m × n) con elementi pseudocasuali (distribuzione uniforme) compresi fra 0 e 1; eye(m): matrice identità di ordine m. Se i comandi zeros, ones e rand vengono richiamati con un solo parametro di ingresso, ad esempio zeros(m), Matlab restituisce una matrice quadrata di dimensione (m × m). Lidia Aceto (Facoltà di Ingegneria) Matlab 15 / 73 Definizione di matrici L’operatore colon È un carattere speciale che consente di definire in modo molto semplice vettori riga i cui elementi assumono valori equidistanti >> v = [0:10] v = 0 1 2 3 4 5 6 7 8 9 10 La distanza fra due elementi consecutivi può essere altresì definita dall’utente >> v = 2:3:11 v = 2 5 8 >> w = 10:-2:4 w = 10 8 11 6 4 Le parentesi quadre non sono necessarie come mostrato nel secondo esempio. Come vedremo, esso è un operatore molto importante in Matlab. Lidia Aceto (Facoltà di Ingegneria) Matlab 16 / 73 Definizione di matrici Sottomatrici In generale, per fare riferimento ad una sottomatrice di una matrice precedentemente definita, sia questa A, occorre digitare il seguente comando: A(indriga,indcolonna) dove indriga e indcolonna sono vettori che contengono gli indici delle righe e delle colonne della sottomatrice che si desidera estrarre. >> A A = 3 4 6 7 2 3 1 9 8 10 11 -1 >> B=A(1:2,4:-1:3) B = 10 1 11 9 Lidia Aceto (Facoltà di Ingegneria) Matlab 17 / 73 Definizione di matrici Sottomatrici Per estrarre una intera riga oppure una intera colonna i comandi che conviene usare sono >> A A = >> r1 >> c2 3 7 4 2 6 3 r1 = A(1,:) = 3 7 c2 = A(:,2) = 7 2 3 1 9 8 10 11 -1 1 10 Lidia Aceto (Facoltà di Ingegneria) Matlab 18 / 73 Definizione di matrici Sottovettori Per estrarre un sottovettore di un vettore riga o colonna è sufficiente un solo vettore di indici che specifica le posizioni degli elementi che ci interessano >> v v = 3 7 1 10 9 -1 6 >> w = v([1 2 4]) w = 3 7 10 Lidia Aceto (Facoltà di Ingegneria) Matlab 19 / 73 Numeri decimali Numeri decimali Le costanti decimali (ossia non intere) possono essere inserite usando due notazioni alternative: Virgola fissa >> x = 5.8741 x = 5.8741 Da notare come il separatore della parte intera dalla parte decimale sia il punto. Virgola mobile >> x = 3.8105e5 x = 3.8105e+05 Il valore che abbiamo assegnato ad x è 3.8105 × 105 . Lidia Aceto (Facoltà di Ingegneria) Matlab 20 / 73 Numeri decimali Visualizzazione di variabili Il formato utilizzato per la visualizzazione del valore delle variabili numeriche può essere scelto dall’utente mediante il comando format [opzioni] Alcune delle opzioni più comunemente utilizzate sono le seguenti: short: formato virgola fissa con 5 cifre; long: formato virgola fissa con 15 cifre; short e: formato virgola mobile (in base 10) con 5 cifre; long e: formato virgola mobile (in base 10) con 15 cifre; rat: formato razionale (numeratore/denominatore). Lidia Aceto (Facoltà di Ingegneria) Matlab 21 / 73 Numeri decimali Visualizzazione di variabili Il comando format definisce soltanto come vengono visualizzate le variabili e non come sono rappresentate nel calcolatore >> format short e >> x=1.23451789012345 x = 1.2345e+00 >> format long >> x x = 1.23451789012345 Matlab non ha cancellato le cifre decimali che non ha potuto visualizzare con il formato short e. In generale tutte le variabili numeriche vengono memorizzate in accordo con lo standard IEEE 754 per la doppia precisione dei numeri in virgola mobile. Lidia Aceto (Facoltà di Ingegneria) Matlab 22 / 73 Numeri decimali Costanti predefinite Le principali sono: eps precisione di macchina pi π = 3.14159265 . . . i, j unità immaginaria (i = j = √ −1) realmin minimo numero di macchina positivo realmax massimo numero di macchina positivo Inf NaN ∞, ossia un numero maggiore di realmax Not a Number tipicamente il risultato di 0/0 Lidia Aceto (Facoltà di Ingegneria) Matlab 23 / 73 Workspace (area di lavoro) Workspace (area di lavoro) Il Workspace contiene tutte le variabili che sono state definite dal momento dell’apertura di Matlab; il comando who restituisce una lista degli identificatori di tali variabili; con il comando whos si ottengono maggiori informazioni quali, ad esempio, la dimensione di ciascuna variabile e lo spazio di memoria, in bytes, che ognuna di esse occupa. >> A = [1 2; 3 4]; >> v = 1:10; >> whos Name Size A v 2x2 1x10 Bytes 32 80 Class double array double array Grand total is 14 elements using 112 bytes Lidia Aceto (Facoltà di Ingegneria) Matlab 24 / 73 Workspace (area di lavoro) Clear Per eliminare una o più variabili dall’area di lavoro, usare il comando clear. In particolare, digitando clear var1 var2 ..... le variabili specificate vengono rimosse dall’area di lavoro. >> clear v >> whos Name A Size 2x2 Bytes 32 Class double array Grand total is 4 elements using 32 bytes Se la lista di variabili non viene specificata allora vengono cancellate tutte le variabili (è come avere iniziato da capo la sessione di lavoro). Lidia Aceto (Facoltà di Ingegneria) Matlab 25 / 73 Workspace (area di lavoro) Save e Load il comando save consente di salvare il contenuto dell’area di lavoro. La sua sintassi è la seguente save nomefile var1 var2 ..... . In questo caso, le variabili specificate vengono salvate in un file di nome nomefile.mat, per salvare l’intera area di lavoro omettere l’elenco delle variabili; se anche nomefile non viene specificato allora l’intera area di lavoro viene salvata nel file di default matlab.mat. il comando load, che ha la stessa sintassi di save, consente di caricare nell’area di lavoro variabili precedentemente salvate. Lidia Aceto (Facoltà di Ingegneria) Matlab 26 / 73 Espressioni Espressioni Matlab è un interprete le cui istruzioni sono del tipo [variabile =] espressione la espressione è costituita da identificatori di variabile, costanti, operatori e funzioni; essa viene valutata ed il risultato assegnato alla variabile specificata (che può anche essere una sottomatrice) >> x = sqrt(9) + 1 x = 4 su una stessa riga di comando è possibile inserire più istruzioni separandole mediante una virgola oppure un punto e virgola. Lidia Aceto (Facoltà di Ingegneria) Matlab 27 / 73 Espressioni La variabile ans se si omette “variabile =” allora il risultato della espressione viene assegnato alla variabile ans (dall’inglese answer) che viene poi mantenuta nell’area di lavoro; tale variabile può quindi essere successivamente utilizzata; il suo valore non viene cambiato fino a quando non si esegue un’altra istruzione priva di “variabile =” >> sqrt(16) + 3 ans = 7 >> x = ans - 1 x = 6 Lidia Aceto (Facoltà di Ingegneria) Matlab 28 / 73 Espressioni Operatori aritmetici operatore/i +, − ∗ ∗ sinistro matrice matrice scalare matrice matrice destro matrice matrice matrice scalare matrice / matrice matrice ∧ matrice quadrata scalare intero \ descrizione Addizione e Sottrazione Prodotto righe per colonne Prodotto matrice per scalare Divisione a sinistra (A \ B ≡ A−1 ∗ B) Divisione a destra (A/B ≡ A ∗ B−1 ) Elevamento a potenza (A ∧ 3 ≡ A ∗ A ∗ A) le dimensioni degli operandi devono essere compatibili; le regole di precedenza sono quelle usuali dell’algebra. Utilizzare le parentesi tonde per cambiarle. Lidia Aceto (Facoltà di Ingegneria) Matlab 29 / 73 Espressioni Operatori aritmetici: esempi >> A=[2 3; 4 5], b=[-1;2], A = 2 3 4 5 b = -1 2 >> A*b ans = 4 6 >> A^2 ans = 16 28 21 37 >> b^2 ??? Error using ==> mpower Matrix must be square. Lidia Aceto (Facoltà di Ingegneria) Matlab 30 / 73 Espressioni Operatori aritmetici elemento per elemento Se gli operatori aritmetici sono preceduti da un punto allora l’operazione viene eseguita elemento per elemento: >> C = A.*B ⇒ C = (cij ), con cij = aij ∗ bij >> C = A.\B ⇒ C = (cij ), con cij = bij /aij >> C = A./B ⇒ C = (cij ), con cij = aij /bij >> C = A.^B ⇒ C = (cij ), con cij = aij ˆ bij Lidia Aceto (Facoltà di Ingegneria) Matlab 31 / 73 Espressioni Operatori aritmetici elemento per elemento: esempio >> A=[6 8; 10 14], B=[3 2;5 7] A = 6 8 10 14 B = 3 2 5 7 >> A.*B ans = 18 50 16 98 >> A./B ans = 2 2 4 2 Lidia Aceto (Facoltà di Ingegneria) Matlab 32 / 73 Espressioni Operatori relazionali e logici Si applicano a matrici della stessa dimensione. Restituiscono una matrice di risultati con valori pari ad 1 se la relazione è verificata e 0 altrimenti. I principali operatori sono: <, <=, >, >= rispettivamente minore, minore o uguale, maggiore, maggiore o uguale, ==, ∼= uguaglianza e non uguaglianza rispettivamente &, |, ∼ and, or e not rispettivamente >> A=[1 -1; 2 ans = 0 1 3]; B=[2 -1; 2 0]; A==B 1 0 Lidia Aceto (Facoltà di Ingegneria) Matlab 33 / 73 Espressioni Eccezione alla regola se uno degli operandi è uno scalare allora la regola di compatibilità delle dimensioni è rilassata; tale scalare viene interpretato come una matrice con le stesse dimensioni del secondo operando ed elementi uguali al valore dello scalare. >> A = [6 8; 10 A = 6 8 10 14 3 -1 >> A + 1 ans = 7 11 4 14; 3 -1] 9 15 0 Lidia Aceto (Facoltà di Ingegneria) Matlab 34 / 73 Espressioni Precedenze fra operatori Valgono le seguenti regole di precedenza fra le tre classi di operatori viste: w w operatori aritmetici w w w operatori relazionali w w operatori logici >> 3 + 1 > 2 & 6 <= 7 ans = 1 Anche se non necessario, è consigliabile usare le parentesi tonde per evidenziare meglio l’ordine di applicazione degli operatori. Lidia Aceto (Facoltà di Ingegneria) Matlab 35 / 73 Espressioni Trasposto e trasposto coniugato Un altro operatore importante è ’ (apice) che restituisce la trasposta coniugata della matrice a cui viene applicato ( .’ restituisce soltanto la trasposta). Matlab infatti gestisce ed elabora anche i numeri complessi. >> A = [ 0 A = -i; 1+i 0 1.0000 + 1.0000i 3-i] 0 - 1.0000i 3.0000 - 1.0000i >> A’ ans = 0 0 + 1.0000i Lidia Aceto (Facoltà di Ingegneria) 1.0000 - 1.0000i 3.0000 + 1.0000i Matlab 36 / 73 Funzioni built-in Funzioni scalari Sono disponibili numerose funzioni built-in per la elaborazione di scalari, vettori e matrici. Nel seguito alcune di queste sono elencate. Funzioni scalari Trigonometriche: sin, cos, tan, . . . Esponenziali: sqrt, exp, log, log10, log2, . . . Complesse: real, imag, conj, . . . Arrotondamento: fix: arrotonda verso zero (fix(2.7) = 2, fix(-2.7) = -2) floor: arrotonda verso −∞ (floor(2.7) = 2, floor(-2.7) = ceil: arrotonda verso +∞ (ceil(2.7) = 3, ceil(-2.7) = -2) -3) se applicate a matrici operano elemento per elemento restituendo una matrice di risultati; per maggiori informazioni consultare help elfun. Lidia Aceto (Facoltà di Ingegneria) Matlab 37 / 73 Funzioni built-in Funzioni vettoriali Funzioni vettoriali length: restituisce la lunghezza di un vettore (ossia il numero dei suoi elementi). Analisi dei dati: max e min: restituiscono l’elemento massimo e minimo rispettivamente max([4 10 -2]) → 10 sort: ordina gli elementi del vettore in ordine crescente sort([4 10 -2]) → [-2 4 10] sum: calcola la somma degli elementi; prod: calcola il prodotto degli elementi; se applicate a matrici operano colonna per colonna restituendo un vettore riga; per maggiori informazioni consultare help datafun. Lidia Aceto (Facoltà di Ingegneria) Matlab 38 / 73 Funzioni built-in Funzioni matriciali Funzioni matriciali Alcune informazioni di base sulle matrici: size: dimensione di una matrice; numel: restituisce il numero di elementi di una matrice. Manipolazione di matrici: reshape: modifica le dimensioni di una matrice; diag: restituisce la diagonale di una matrice oppure crea una matrice diagonale; tril, triu: estrae la parte triangolare inferiore o superiore da una matrice; find: trova gli indici degli elementi non nulli di una matrice; end: ultimo indice; per maggiori informazioni consultare help elmat. Lidia Aceto (Facoltà di Ingegneria) Matlab 39 / 73 Funzioni built-in Funzioni matriciali Funzioni matriciali Analisi di matrici: rank: rango; det: determinante; trace: somma degli elementi diagonali di una matrice; null: spazio nullo; Equazioni lineari: inv: matrice inversa; \ e /: risoluzione di equazioni lineari; per maggiori informazioni consultare help matfun. Lidia Aceto (Facoltà di Ingegneria) Matlab 40 / 73 Flusso Istruzioni per il controllo del flusso di esecuzione Matlab possiede le principali istruzioni di controllo del flusso di esecuzione che lo rendono un linguaggio strutturato. Le due principali categorie sono: Istruzioni per la selezione si utilizzano quando un gruppo di istruzioni devono essere eseguite soltanto se certe condizioni sono verificate; Istruzioni per la iterazione si utilizzano per ripetere l’esecuzione di un gruppo di istruzioni. Descriveremo soltanto le istruzioni più utilizzate. Per maggiori dettagli consultare help lang. Lidia Aceto (Facoltà di Ingegneria) Matlab 41 / 73 Flusso Selezione La istruzione IF if (condizione) istruzioni end la condizione è una espressione booleana solitamente ottenuta facendo uso di operatori logici e/o relazionali (esempio, a==1); essa viene valutata e nel caso in cui sia verificata (ossia se il suo valore è diverso da zero) le istruzioni comprese fra if e end vengono eseguite; se il risultato della espressione booleana è una matrice la condizione è ritenuta vera qualora tutti gli elementi di tale matrice siano diversi da zero. Lidia Aceto (Facoltà di Ingegneria) Matlab 42 / 73 Flusso La istruzione IF Più in generale if (condizione 1) istruzioni 1 [elseif (condizione 2) istruzioni 2] [else istruzioni 3] end se la condizione 1 è verificata viene eseguito il gruppo di istruzioni 1; in caso contrario, se è verificata la condizione 2, viene eseguito il gruppo di istruzioni 2; altrimenti, ovvero se nessuna delle precedenti condizioni è verificata, si esegue il gruppo di istruzioni 3; il blocco elseif può essere ripetuto più di una volta. Lidia Aceto (Facoltà di Ingegneria) Matlab 43 / 73 Flusso Esempio Istruzioni per valutare la funzione così definita: 0 se x < 0 x se 0 ≤ x < 1 f (x) = 1 se x > 1 if (x < 0) f = 0; elseif (x < 1) f = x; else f = 1; end Lidia Aceto (Facoltà di Ingegneria) Matlab 44 / 73 Flusso Il ciclo FOR Viene utilizzato per ripetere la esecuzione di un gruppo di istruzioni un numero di volte noto a priori. La sua sintassi è la seguente for x = v istruzioni end v può essere: un vettore riga precedentemente definito (es. v = 1:10) il ciclo viene ripetuto tante volte quanto vale la lunghezza di v, assegnando ad x i valori del vettore in sequenza: durante la prima iterazione x = v(1) durante la seconda iterazione x = v(2) etc. una matrice il ciclo viene ripetuto tante volte quante sono le colonne della matrice v, assegnando ad x i valori di tali colonne in sequenza. Lidia Aceto (Facoltà di Ingegneria) Matlab 45 / 73 Flusso Ciclo FOR: esempi Le seguenti sono due versioni equivalenti di un codice per calcolare la somma degli elementi di un vettore. Prima versione v = rand(1,5); s = 0; for i = 1:length(v) s = s + v(i); end Seconda versione v = rand(1,5); s = 0; for x = v s = s + x; end Lidia Aceto (Facoltà di Ingegneria) Matlab 46 / 73 Flusso Il ciclo WHILE Lo si utilizza quando la esecuzione di un gruppo di istruzioni deve essere ripetuto un numero di volte non noto a priori while (condizione booleana) istruzioni end la condizione booleana viene valutata se è falsa il ciclo viene chiuso altrimenti, ossia se è vera, si esegue il blocco di istruzioni viene rivalutata la condizione e si procede come prima Lidia Aceto (Facoltà di Ingegneria) Matlab 47 / 73 Flusso Esempio: calcolo della precisione di macchina La precisione di macchina è metà della distanza fra 1 ed il successivo numero macchina. Un codice che la calcola è il seguente: x = 1; while ( 1+x > 1) x = x/2; end x = x * 2; Il valore finale di x coincide con la costante eps di Matlab. Lidia Aceto (Facoltà di Ingegneria) Matlab 48 / 73 Flusso Istruzione break termina l’esecuzione di cicli FOR o WHILE; in cicli annidati, permette di uscire dal ciclo più interno. Lidia Aceto (Facoltà di Ingegneria) Matlab 49 / 73 M-files M-files Matlab permette di eseguire una successione di istruzioni memorizzate in un file detto M-file in quanto deve essere memorizzato con il suffisso .m per creare un M-file si può usare l’editor di Matlab File −→ New −→ M-file −→ nomefile.m per salvare il file creato File −→ Save As . . . esistono due tipi di M-files: script e function Lidia Aceto (Facoltà di Ingegneria) Matlab 50 / 73 M-files Script consiste in una sequenza di comandi Matlab; utile qualora tale sequenza debba essere eseguita più di una volta; si esegue digitando il nome dell’M-file (senza il suffisso); la esecuzione termina in corrispondenza della istruzione return o in corrispondenza della fine dell’M-file. Il controllo torna a chi ha lanciato la esecuzione (prompt dei comandi, altro M-file ...); le variabili utilizzate in uno script sono variabili globali: rimangono definite, e sono presenti all’interno dell’area di lavoro, al termine della esecuzione dello script; per accedere ad una variabile precedentemente definita occorre usare lo stesso identificatore (ossia nome); non ha parametri di input: per modificare i valori delle variabili all’interno di uno script si deve modificare lo script stesso; alternativamente si può utilizzare il comando input che permette all’utente di assegnare ad alcune variabili il valore che si desidera dal Command Window. Lidia Aceto (Facoltà di Ingegneria) Matlab 51 / 73 M-files Script: esempio calcola_media.m n = length(v); media = sum(v)/n; Esecuzione >> v = [1 4 5 2]; v = 1 4 5 2 >> calcola_media >> who Your variables are: media n v >> media media = 3 Lidia Aceto (Facoltà di Ingegneria) Matlab 52 / 73 M-files Script: esempio calcola_media.m v = input(’inserire il vettore v = ’); n = length(v); media = sum(v)/n; media Esecuzione >> calcola_media >> inserire il vettore v = [1 media = 3 Lidia Aceto (Facoltà di Ingegneria) 4 5 2]; Matlab 53 / 73 M-files Function utilizza solamente variabili locali: al suo interno non sono visibili le variabili presenti nell’area di lavoro al momento della loro chiamata; anche facendo uso dello stesso identificatore una function non può cambiare il valore o cancellare una variabile definita al suo esterno; quando la esecuzione della function ha termine, tutte le variabili in essa definite ed utilizzate vengono rimosse; si interfaccia con l’esterno mediante l’utilizzo di parametri di input e di output che possono essere matrici e/o vettori di qualunque dimensione. Intestazione La prima riga di una function deve essere della seguente forma: function [outf1,...,outfn] = nomefunction(inf1,...,infk) inf1,.., infk: parametri formali di input; outf1,.., outfn: parametri formali di output; ∗ nel caso di un solo output si possono omettere le parentesi quadrate. Lidia Aceto (Facoltà di Ingegneria) Matlab 54 / 73 M-files Function Intestazione function [outf1,...,outfn] = nomefunction(inf1,...,infk) Esecuzione >> [outa1,...,outan] = nomefunction(ina1,...,inak) ina1,...,inak: parametri attuali di input; outa1,...,outan: parametri attuali di output; non vi è alcun legame tra gli identificatori dei parametri formali (intestazione) e quelli dei parametri attuali (chiamata): la assegnazione avviene per posizione; al momento della chiamata viene assegnato ad inf1 il valore di ina1, ad inf2 il valore di ina2, etc.; quando la esecuzione della function termina viene assegnato ad outa1 il valore di outf1, ad outa2 il valore di outf2, etc. Lidia Aceto (Facoltà di Ingegneria) Matlab 55 / 73 M-files Parametri di input e output prova.m function x = prova(in1,in2) who in1, in2, x = 2; Lidia Aceto (Facoltà di Ingegneria) Matlab 56 / 73 M-files Parametri di input e output Esecuzione >> A = rand(5); >> z = prova(x,y) x = 1:6; y = eye(3); Your variables are: in1 in2 in1 = 1 2 3 1 0 0 0 1 0 0 0 1 4 5 6 in2 = z = 2 Lidia Aceto (Facoltà di Ingegneria) Matlab 57 / 73 M-files Function: esempio calcola_massimo.m function massimo = calcola_massimo(v) massimo = v(1); for i = 2:length(v) if (v(i)> massimo) massimo = v(i); end end Lidia Aceto (Facoltà di Ingegneria) Matlab 58 / 73 M-files Function: esempio Esecuzione >> w=rand(1,3) w = 4.0571e-01 9.3547e-01 9.1690e-01 >> mass = calcola_massimo(w) mass = 9.3547e-01 >> who Your variables are: mass w Lidia Aceto (Facoltà di Ingegneria) Matlab 59 / 73 M-files Documentazione per inserire commenti in un M-file occorre utilizzare il simbolo %; il testo che segue tale simbolo nella stessa riga viene considerato commento ovvero non viene interpretato ed eseguito; particolare importanza hanno le righe di commento consecutive poste all’inizio dell’M-file; esse vengono visualizzate qualora si digiti help nomeMfile cosicché è possibile creare l’help in linea del proprio software. Lidia Aceto (Facoltà di Ingegneria) Matlab 60 / 73 M-files Function: esempio calcola_massimo.m function massimo = calcola_massimo(v) % massimo = calcola_massimo(v) % % Determina il valore massimo del vettore v massimo = v(1); for i = 2:length(v) if (v(i)> massimo) massimo = v(i); end end Lidia Aceto (Facoltà di Ingegneria) Matlab 61 / 73 M-files Function: esempio >> help calcola_massimo massimo = calcola_massimo(v) Determina il valore massimo del vettore v >> Lidia Aceto (Facoltà di Ingegneria) Matlab 62 / 73 M-files Function All’interno di un singolo M-file è possibile memorizzare più di una function. Tuttavia: l’unica accessibile dall’esterno è la prima; le eventuali altre, quindi, devono essere considerate come delle sottoprocedure della prima. Lidia Aceto (Facoltà di Ingegneria) Matlab 63 / 73 M-files Function: alcuni comandi utili Alcuni comandi che risultano utili quando si scrive un codice Matlab sono: disp(<testo>): per visualizzare un messaggio. Esempio: disp(’esecuzione terminata con successo’); error(<messaggio>): interrompe la esecuzione del codice visualizzando il messaggio specificato. Esempio: error(’Divisione per zero’); warning(<messaggio>): visualizza un messaggio di avvertimento. La esecuzione del codice prosegue comunque. Lidia Aceto (Facoltà di Ingegneria) Matlab 64 / 73 M-files Grafica in 2D Il principale comando per tracciare grafici in 2D è plot. Può essere utilizzato in svariati modi. Ne vedremo alcuni. Formato base plot( X , Y ) X ed Y sono vettori riga (o colonna) della stessa lunghezza; disegna la spezzata che unisce i punti (X(1),Y(1)),(X(2),Y(2)), . . . Lidia Aceto (Facoltà di Ingegneria) Matlab 65 / 73 M-files Grafica in 2D >> plot([1 2 3 4],[2 6 4 8]) 9 8 7 6 5 4 3 2 1 0 0.5 1 Lidia Aceto (Facoltà di Ingegneria) 1.5 2 2.5 3 3.5 4 4.5 5 Matlab 66 / 73 M-files Grafica in 2D Formato della spezzata plot( X , Y , S ) S è una stringa (sequenza di caratteri racchiusa fra apici) che specifica il formato desiderato per la spezzata, ovvero il colore della linea; il tipo di linea (continua, tratteggiata, . . . ); il marker da utilizzare per indicare i punti che individuano la spezzata. Lidia Aceto (Facoltà di Ingegneria) Matlab 67 / 73 M-files Grafica in 2D Colore Marker · b blu g verde o cerchio r rosso x croce k nero * asterisco m .. . magenta .. . s .. . quadratino .. . Lidia Aceto (Facoltà di Ingegneria) punto Linea − continua (default) : punteggiata −. tratto-punto −− tratteggiata Matlab 68 / 73 M-files Grafica in 2D >> plot([1 2 3 4],[2 6 4 8],’ r--o’) 9 8 7 6 5 4 3 2 1 0 0.5 1 Lidia Aceto (Facoltà di Ingegneria) 1.5 2 2.5 3 3.5 4 4.5 5 Matlab 69 / 73 M-files Il grafico si cos(x) Una approssimazione del grafico di cos(x) la si può ottenere così: >> x = 0:0.01:2*pi; >> plot(x,cos(x),’ r-’) 1 0.8 0.6 0.4 0.2 0 −0.2 −0.4 −0.6 −0.8 −1 0 1 Lidia Aceto (Facoltà di Ingegneria) 2 3 4 5 6 Matlab 70 / 73 M-files Ancora plot Plot plot ( X1, Y1, S1, X2, Y2, S2, .... , XN, YN, SN ) Disegna sullo stesso grafico N spezzate usando per ciascuna di esse il formato correspondente: S1 per la spezzata individuata da (X1,Y1), S2 per quella individuata da (X2,Y2), etc. Lidia Aceto (Facoltà di Ingegneria) Matlab 71 / 73 M-files Altri tipi di scale I seguenti comandi hanno la stessa sintassi di plot ma differiscono per il tipo di scala metrica che utilizzano sugli assi coordinati: semilogx: scala logaritmica (base 10) sull’asse delle ascisse e lineare su quello delle ordinate: la lunghezza del segmento tra 100 e 101 coincide con quella tra 101 e 102 , etc. semilogy: reciproco di semilogx; loglog: scala logaritmica su entrambi gli assi. Lidia Aceto (Facoltà di Ingegneria) Matlab 72 / 73 M-files Grafica 2D: alcuni comandi utili xlabel, ylabel, title: per inserire, rispettivamente, una etichetta sull’asse delle ascisse, delle ordinate ed un titolo del grafico ylabel(’cos(x)’); axis: per definire il range sui due assi axis ([xmin xmax ymin ymax ]) hold on: per conservare un grafico precedentemente creato. Eventuali altre linee verranno tracciate sullo stesso grafico (per disabilitare hold off; legend: per inserire la legenda delle curve; text, gtext: per inserire del testo sulla figura; figure: crea una nuova finestra grafica; shg: per portare in evidenza la finestra grafica; print: per salvare su file un grafico (png, jpeg, eps, ps, .... ). Lidia Aceto (Facoltà di Ingegneria) Matlab 73 / 73