MATLAB MATrix LABoratory 1
Cos è MATLAB? Sistema interattivo per il Calcolo Scientifico Integra Analisi numerica Calcolo matriciale Calcolo simbolico Capacità grafiche Interfaccia grafica (GUI) 2
Inizialmente fu scritto per facilitare l uso del software sviluppato dai progetti LINPACK ed EISPACK Oggi i package, detti TOOLBOXES, permettono la risoluzione di specifici problemi Financial Splines Optimization Statistic Symbolic Math.. 3
Il Sistema MATLAB consiste di: Linguaggio Ambiente di lavoro Gestore di grafici Funzioni matematiche Programma di interfaccia con le applicazioni 4
Il Linguaggio E ad alto livello orientato alle matrici e agli array, con: Costrutti di controllo Funzioni Strutture di dati Gestione di I/O 5
I comandi sono contenuti in directory distinte in base alla classificazione: ops lang strfun iofun timefun datatype Operatori e caratteri speciali Costrutti del linguaggio Stringhe di caratteri File di input e di output Tempi e data Tipi di dati e strutture 6
Maneggiare i grafici E possibile gestire i grafici mediante un sistema grafico che consente Visualizzazione di dati Animazione Presentazioni grafiche Costruzione di interfacce grafiche utente 7
L ambiente di lavoro Maneggiare le variabili nello spazio di lavoro Importare ed esportare dati Strumenti per sviluppare, mettere a punto programmi Tutti questi strumenti sono localizzati nella directory general 8
Funzioni matematiche Vasta collezione di funzioni elementari e complesse su matrici e funzioni Directory elmat elfun specfun matfun datafun polyfun funfun sparfun Contenuto Matrici elementari e manipolazione di matrici Funzioni matematiche elementari Funzioni matematiche speciali Algebra lineare numerica Analisi dei dati e trasformata di Fourier Interpolazione e polinomi Funzioni di funzioni e risoluzione di ODE Matrici sparse 9
Programma di interfaccia con le applicazioni (API) Questa è una libreria che permette di scrivere programmi in C e in FORTRAN che interagiscono con MATLAB Chiamare routine da Matlab Chiamare MATLAB come un motore computazionale 10
Come si presenta? Spazio di lavoro Finestra dei comandi Lista di comandi 11
COMMAND WINDOW In questa finestra è possibile inserire i comandi in linguaggio MATLAB. MATLAB prevede di lavorare essenzialmente con un solo tipo di dati strutturati: Matrice rettangolare Come casi particolari si ritrovano: gli scalari (matrici 1x1) i vettori (matrici nx1) 12
Input di una matrice 1. Lista esplicita degli elementi 2. Costruzione degli elementi della matrice 3. Caricare la matrice da un file di dati 13
1. Esempio INPUT OUTPUT A = [1 2 3; 4 5 6; 7 8 9] oppure A = [1 2 3 4 5 6 7 8 9] A = 1 2 3 4 5 6 7 8 9 carattere ; inibisce la visualizzazione del risultato ell istruzione 14
Cosa succede nella memoria? Matlab memorizza le matrici per colonna: una matrice è memorizzata come un vettore contenente la prima colonna seguita dalla seconda, dalla terza, etc. ESEMPIO: La matrice A di ordine 3x4 è memorizzata come a11a21 a31 12 a a22a 32 a 13 a 23 a 33 a 14 a 24 a34 15
ESEMPIO: a=rand(3,4) a = 0.9501 0.4860 0.4565 0.4447 0.2311 0.8913 0.0185 0.6154 0.6068 0.7621 0.8214 0.7919 a(4,2) a(6) 16
MATLAB è case sensitive cioè A è una variabile diversa da a La gestione degli array è dinamica, nel senso che le dimensioni possono variare durante il calcolo 17
2. Esempio INPUT r=[1 2 3] OUTPUT r= 1 2 3 n=[5 6 7]; r=[r ; n] r= 1 2 3 5 6 7 18
Si può individuare all interno di array un elemento indicando gli indici tra parentesi tonde Esempio: a=[1 2 3 4 5 6 7 8 9] a(2,3) Si può individuare all interno di array una riga o una colonna indicando la variazione degli indici a(1, 1 : 3) 19
Operazioni su matrici + - * ^ ` \ / addizione sottrazione moltiplicazione riga x colonna elevamento a potenza trasposizione divisione a sinistra divisione a destra 20
Divisione a sinistra X=A\B se A è quadrata, la matrice X contiene i vettori soluzione del sistema a più colonne AX=B equivale a X=inv(A)*B (risolto con il metodo di Gauss con pivoting parziale) Se A non è quadrata, la matrice X contiene i vettori soluzione del sistema sovra o sotto dimensionato AX=B risolto con il metodo dei minimi quadrati 21
Divisione a destra X=A/B se B è quadrata X=A/B equivale a X=A*inv (B) Se A e B hanno lo stesso numero di colonne, X=A/B=(B \A ) 22
Per eseguire operazioni aritmetiche su matrici, componente per componente si premette all operatore il punto C=A.*B C=A.^B C=A.\B C=A./B C = A * B ij C = ij ij A ij ij ij B C = B / ij ij C = A / ij B A ij ij ij L addizione e la sottrazione sono operazioni eseguite già componente per componente 23
ESEMPIO: INPUT OUTPUT A=[1 2 2; 2 1 1; 0 3 1]; A=A ^ 2 A=[1 0 2; 2 1 0; 0 0 1]; A=A.^ 2 A = 5 10 6 4 8 6 6 6 4 A = 1 0 4 4 1 0 0 0 1 24
Variabili logiche o booleane Associando a : 1 il valore vero 0 il valore falso si possono usare variabili di tipo logico anche se non esplicitamente dichiarate. Una variabile il cui valore è diverso da 0 si dice logicamente vera 25
Operatori logici ~ & Not And Or Gli operatori logici operano in generale su array della stessa dimensione. Se un operando è uno scalare e l altro no, l operazione viene applicata a ciascun elemento dell array (espansione scalare) 26
ESEMPIO: INPUT a=[1 2 3 0 1]; b=[1 0 0 0 1]; a & b ~ ans OUTPUT Variabile in cui viene memorizzato il risultato di una espressione se non è specificata la variabile a cui assegnar il valore del risultato ans = 1 0 0 0 1 ans = 0 1 1 1 0 a b ans = 1 1 1 0 1 27
Operatori relazionali Si possono utilizzare su tutti i dati dotati di un ordinamento naturale < > <= >= == ~= Minore Maggiore Minore o uguale Maggiore o uguale Uguale Non uguale 28
Anche questi operatori si comportano come gli operatori logici quando si opera con array e scalari. Componenti per cui il risultato dell operazione è vero assumono valore 1, mentre dove è falso assumono valore 0. ESEMPIO: INPUT x=2.5; a=2; b=3; L= x<=b L2= x>=a L & L2 OUTPUT L= 1 L2= 1 ans= 1 29
Variabili stringa In MATLAB il termine stringa si riferisce ad un array di caratteri e la sua rappresentazione interna corrisponde al valore ASCII dei caratteri. Sono riconosciute come stringhe i caratteri racchiusi tra apici. ESEMPIO: s= chimica Nel workspace avremo: Name Size Byte Class s 1x7 14 Char array 30
E possibile creare array bidimensionali di caratteri con la sola limitazione che le righe abbiano la stessa lunghezza. ESEMPIO: Due spazi Nome=[ Gianluca ; Franco ] equivalentemente Nome= char ( Gianluca, Franco ) Funzione che automaticamente inserisce caratteri bianchi alle stringhe più corte 31
Concatenazione di stringhe Questa operazione avviene sfruttando la capacità di MATLAB nella gestione degli array. ESEMPIO: Sia Nome la variabile precedentemente definita, allora l istruzione: S= [Nome(1, :) Nome(2, : ) ] assegna alla variabile S il valore GianlucaFranco sottostringhe 32
Costrutti di controllo if, if else, if elseif while for switch 33
if, if else, if elseif if espressione logica istruzioni end if espressione logica istruzioni else istruzioni end if espressione logica istruzioni elseif espressione logica istruzioni else istruzioni end 34
ESEMPI: if rem(a,2)==0 disp( A pari ) b=a/2 end Funzione built-in calcola il resto della divisione Funzione che permette la visualizzazione della stringa if n<0 disp( errore di input ) else a=n/2 end if n<0 disp( errore di input ) elseif rem(n,2)==0 a=n/2 else a=(n+1)/2 end 35
while while espressione istruzioni end Funzione built-in che esegue il prodotto degli elementi di un array ESEMPIO: Valutare il più piccolo intero n per cui n! è un numero di 10 o più cifre. n=1 while prod (1:n) < 1e10 n=n+1 end 36
for for indice = inizio: incremento: fine istruzioni end ESEMPIO: for i = 2:6 x(i) = 2* i end Per default l incremento è 1 Viene eseguita 5 volte 37
switch switch espressione case valore1 istruzioni case valore2 istruzioni... otherwise istruzioni end ESEMPIO: switch input_num case -1 disp ( -1 ) case 0 disp ( zero ) otherwise disp ( altro ) end 38
Aritmetica di MATLAB Matlab utilizza il Sistema aritmetico Floating-point Standard IEEE in doppia precisione F = ( 2, 52, -1024, 1023) base precisione Emin Emax 39
Visualizzazione dei numeri Matlab prevede i seguenti formati: Format short (default) Format short e Format short g Format long Format long e Format long g Format hex 40
ESEMPIO: format short Se il numero è compreso tra 10^-3 e 10^3 viene visualizzato in formato fixed-point con 4 cifre decimali altrimenti viene scalato per ridurre la parte intera ad 1 cifra Numero 12.3456789123456 Visualizzazione 12.3457 123.456789123456 123.4568 1234.56789123456 0.00012456789123 1.2346e+003 1.2457e-004 41
ESEMPIO: format short e Viene visualizzato il valore in formato floating-point con la parte intera di 1 cifra e la parte decimale di 4 Numero 12.3456789123456 123.456789123456 1234.56789123456 0.00012456789123 Visualizzazione 1.2346e+001 1.2346e+002 1.2346e+003 1.2457e-004 42
ESEMPIO: format short g Viene visualizzato il valore migliore tra il formato floating-point e fixed-point Numero 12.3456789123456 12345.6789123456 123456.789123456 0.00012456789123 0.00001234567891 Visualizzazione 12.346 12346 1.2346e+005 0.00012457 1.2346e-005 43
ESEMPIO: format long Simile al formato short ma con la visualizzazione di 15 cifre per la parte decimale 3.141592653589792 0.003141592653532 234567890123456.12345 format long : 3.14159265358979 format long e : 3.14159265358979e+000 format long g: format long : 0.00314159265353 format long e : 3.14159265353200e-003 format long g : format long format long e : format long g :1.23456789012346e+015 44
M-file Sono file che contengono istruzioni in linguaggio MATLAB. Devono avere estensione.m Tipi di M-file: Script file Function file Possono essere scritti con un qualsiasi editor di testo. MATLAB mette a disposizione un proprio editor che evidenzia le parole chiave e indenta automaticamente. 45
Script file I comandi contenuti nel file vengono eseguiti sequenzialmente quando nella finestra dei comandi viene digitato il nome del file senza estensione. Gli script operano sui dati presenti nel workspace o creano nuovi dati su cui operare. Le variabili create con uno script-file permangono nel workspace anche dopo la fine dell esecuzione dello script. 46
ESEMPIO: Primo.m N= input ( dimensione ) R= linspace ( 1, 10, N) for i =1:N a(i,:) = R*i end Funzione che visualizza la stringa dimensione e prende in input un valore da assegnare ad N Funzione che crea un array di N elementi equispaziati tra 1 e 10 47
struzione = input ( dimensione ) = linspace ( 1, 10, N) or i =1:N a(i,:) = R*i nd output dimensione 3 Dato digitato da tastiera N= 3 R= 1.0000 5.5000 10.0000 a= 1.0000 5.5000 10.0000 a= 1.0000 5.5000 10.0000 2.0000 11.0000 20.000 a= 1.0000 5.5000 10.0000 2.0000 11.0000 20.0000 48
Function file Sono M-file che accettano argomenti in input e ritornano argomenti in output. Operano con variabili del proprio workspace, separato dal workspace accessibile al prompt dei comandi MATLAB Le variabili delle function sono locali alla function stessa 49
Struttura di un function file Una funzione consiste di: Linea di definizione (testata) Testo di help per la funzione Corpo 50
Linea di definizione function [out(1),, out(n)] = nome ( in(1),,in(m) ) Parola chiave Parametri di ouput 31 caratteri al più o 1 carattere = lettera rimanenti = { lettere cifre underscore Nome della function Parametri di input 51
Raccomandazione E opportuno, anche se non è necessario, che il nome della function sia lo stesso del nome del file con estensione.m, che la contiene. Se sono diversi predomina il nome del file. Ad esempio: la funzione definita da: function [righe, colonne]= somma ( A ) deve trovarsi nel file somma.m 52
help per la funzione Le linee e che iniziano con il carattere % sono considerate da MATLAB commenti. Tutte le linee di commento consecutive che seguono la testata vengono visualizzate quando si richiede nella finestra dei comandi l help per la function. >> help nome_funzione 53
Corpo della funzione Sono istruzioni in linguaggio MATLAB che eseguono calcoli e assegnano valori ai parametri di output. Le istruzioni possono essere: chiamate a funzioni costrutti di controllo espressioni aritmetiche assegnazioni Inoltre possono esserci: commenti linee vuote 54
ESEMPIO: Problema Costruire una function che prende in input una matrice e restituisce in output una variabile logica con valore vero se le somme di tutte le righe della matrice sono uguali, falso altrimenti. Script file N=input( dimensione della matrice ) A=magic(N); Righe =somma(a) 55
unction nel file somma.m nction l= somma (Matrice) la funzione somma ritorna il valore vero (1) per la variabile l se le somme degli elementi di riga di Matrice sono uguali, il valore falso (0) altrimenti. determina le dimensioni della matrice, m]=size(matrice) calcola la somma degli elementi della prima riga = sum(matrice(1, : )) 1; i=2 verifica se le somme degli elementi di ciascuna riga sono uguali hile l & i<=n if sum (Matrice(i, :)) ~ = T l=0 end i=i+1 56
Verifica del numero di parametri Se una funzione ha molti parametri, può essere conveniente avere la possibilità di chiamarla con un numero di parametri minore di quelli che compaiono nella testata. Inoltre la function potrebbe eseguire parti di codice diverse in funzione del numero dei parametri di I/O. Le funzioni nargin e nargout permettono di determinare con quanti parametri di input e di output è chiamata una funzione 57
ESEMPIO: unction [X,fVal,nIT,iFail,delta,n,TEMPI]=... DIP_r2(Q,C,L,U,tol,X0,BigBnd,maxIT) set input default parameters f nargin < 8, maxit=100; if nargin < 7, BigBnd=10^6; if nargin < 6, flagx0=0; if nargin < 5, tol=10^(-5); if nargin < 4, flagul=1; U=ones(n,1); L=zeros(n,1); end end end end nd 58
Differenze tra M-file Script Non accettano parametri di input é restituiscono parametri di utput Operano sui dati del workspace Si usano per automatizzare un sieme di passi che devono essere seguiti più volte Function Possono accettare parametri di input e restituire parametri di output Le variabili interne sono locali alla function Si possono considerare come estensioni del linguaggio MATLAB 59
Ottimizzare la performance di un codice MATLAB 1. Vettorizzazione dei cicli 2. Preallocazione degli array 60
Vettorizzazione di cicli Vettorizzazione Convertire for e while in equivalenti operazioni su matrici o vettori 61
ESEMPIO: I=0 for t=1:0.1:10 I=I+1 Y(I)=sin(t) end t= 1:.1:10 Y=sin(t) Più veloce 62
Preallocazione di array Preallocazione Riservare area di memoria ad un array ridurre la frammentazione della memoria quando si aumentano le dimensioni degli array 63
ESEMPIO: preallocazione for I=1:100 Y(I)=cos(I) end y = zeros(1,100) for I=1:100 Y(I)=cos(I) end 64
Salvare i dati save-salva variabili da workspace su disco load-salva variabili da disco su workspace 65
Save save nome_file lista_variabili formato Il formato può essere: -mat formato binario di matlab (default) -ascii formato ASCII a 8 cifre -ascii -double formato ASCII a 16 cifre 66
Load File creato con ve file variabili ve file variabili ascii Comando load file load file Effetto Carica nel workspace le variabili Carica nel workspace la variabile file 67
M-file debugger Il debugging è il processo di correzione e di localizzazione di un errore nel codice Nel codice si possono trovare due tipi di errori: di sintassi, quali omissione di una parentesi, errore nello scrivere il nome di una variabile,... runtime, usualmente errori algoritmici più difficili da correggere 68
Gli errori di sintassi sono facili da correggere perché MATLAB produce un messaggio che specifica in quale linea è presente l errore e di che tipo è Gli errori di runtime si possono correggere: Eliminando il ; in opportune istruzioni Aggiungendo l istruzione keyboard nel file Trasformando la function in uno script, in modo da poter avere accesso immediato al workspace di base Usando il debugger di MATLAB 69
Debugger Permette di : accedere al workspace di una funzione per visionare i valori delle variabili posizionare dei breakpoint, cioè punti in cui l esecuzione si arresta momentaneamente 70
Tempi di esecuzione cputime - tempo di CPU in secondi tic, toc - tempo di esecuzione in secondi clock, etime - tempo trascorso in un certo intervallo 71
cputime > help cputime PUTIME CPU time in seconds. CPUTIME returns the CPU time in seconds that has been used by the MATLAB process since MATLAB started. For example: t=cputime; your_operation; cputime-t returns the cpu time used to run your_operation. The return value may overflow the internal representation and wrap around. 72
tic, toc >> help tic TIC Start a stopwatch timer. The sequence of commands TIC, operation, TOC prints the number of seconds required for the operation. 73
clock, etime > help etime TIME Elapsed time. ETIME(T1,T0) returns the time in seconds that has elapsed between vectors T1 and T0. The two vectors must be six elements long, in the format returned by CLOCK. Time differences over many orders of magnitude are computed accurately. The result can be thousands of seconds if T1 and T0 differ in their first five components, or small fractions of seconds if the first five components are equal. t0 = clock; operation etime(clock,t0) 74
Grafici 2D Per poter disegnare il grafico di una funzione bisogna: 1. Creare un vettore di ascisse in cui valutare la funzione 2. Valutare la funzione nelle ascisse così ottenute 3. Disegnare il grafico funzione plot 75
è possibile scegliere il colore e il tratto del disegno, specificando una stringa di due caratteri (il primo si riferisce al colore mentre il secondo al tipo di linea): rred g green b blue w white m magenta c cyan y yellow k black. point o circle x x-mark + plus * star - solid : dotted -- dashed -. dash-dot 76
Variabile predefinitaπ x=0:.5:2*pi y=sin(x) plot(x,y) Grafici 2-D2 plot(x,y, r* ) 77
Altri comandi utili per illustrare e per gestire i grafici ono: rid : sovrappone al grafico una griglia itle : aggiunge un titolo al disegno label : aggiunge una legenda per l asse x label : aggiunge una legenda per l asse y xis : scala gli assi del grafico es.:axis([xmin,xmax,ymin,ymax]); lf : cancella il grafico corrente 78
Il comando figure crea una nuova finestra grafica in cui far comparire il disegno; per spostarsi sulla n-ma finestra grafica, basta digitare figure(n) Il comando close all : chiude tutte le finestre grafiche 79
Grafici multipli hold on, permette di sovrapporre due o più grafici hold off, disabilita la funzione precedente plot(x,y,x,yy) disegna due grafici sulla stessa finestra subplot(m, n, p) divide la finestra grafica in m righe e n colonne e il prossimo grafico viene disegnato al posto p 80
ESEMPIO: x = 0 : 0.2 : 12; y1 = sin(x); y2 = cos(x); y3 = y1+y2; figure(2) h = plot(x, y1, x, y2, x, y3); set (h, 'LineWidth', 1.5, {'LineStyle'},{'--' ; ':' ; '-' }) set (h, {'Color'}, {'r'; b';'k'}) axis ([0 12-2 2]) grid on xlabel('ascisse') ylabel('ordinate') legend( h,'seno','coseno','somma') title( 'funzioni trigonometriche ) [y,ix] = min(y3); text (x(ix), y, ['\leftarrow ', num2str(y)], 'HorizontalAlignment', 'left') 81
82
ESEMPIO: x = 0 : 0.2 : 12; y1 = sin(x); y2 = cos(x); y3 = y1+y2; subplot (2, 2,1); plot(x,y1) title('seno') subplot (2,2,2); plot(x,y2) title('coseno') subplot(2,2,3); plot(x,y3) title('seno+coseno') 83
84
Grafici 3-D3 Per poter disegnare un grafico tridimensionale di una funzione di due variabili bisogna: 1. Creare una griglia di punti del piano x,y in cui valutare la funzione 2. Valutare la funzione nei punti della griglia 3. Disegnare il grafico 85
ESEMPIO: Si vuole disegnare il grafico della funzione: f( x, y) = sen( x) + cos( y) nel dominio D = [ π, π] [ 2 π, π] 1. Creare la griglia meshgrid è la funzione di Matlab che crea una griglia sul piano x,y 86
figure(1) x=linspace(-pi,pi,5); y=linspace(-2*pi,pi,10); [X,Y]=meshgrid (x,y); 87
2. Valutare la funzione nei punti della griglia Z=sin (X)+cos (Y); matrici create con meshgrid 88
3. Disegnare il grafico mesh meshc meshz surf surfl waterfall creano vari tipi di grafici 89
mesh(x,y,z) 90
Per ottenere un grafico migliore bisogna aumentare i punti della griglia =linspace(-pi,pi,50); =linspace(-2*pi,pi,100); X,Y]=meshgrid (x,y); =sin (X)+cos (Y); esh(x,y,z) 91
meshc(x,y,z) 92
meshz (Z) 93
surf(x,y,z) 94
surf(x,y,z) shading interp colormap copper 95
waterfall(x,y,z) colormap jet 96