BOZZA Introduzione a MATLAB® BOZZA BOZZA Matlab sta per Matrix Laboratory ed è un ambiente interattivo e un linguaggio di calcolo tecnico di alto livello per lo sviluppo di algoritmi, la rappresentazione grafica dei dati, l'analisi dei dati e il calcolo numerico. Matlab include vari moduli aggiuntivi, chiamati Toolbox, per applicazioni specifiche. (Signal Processing Toolbox, Image Processing Toolbox, etc…) Il linguaggio MATLAB supporta operazioni su vettori e matrici. Con il linguaggio MATLAB, è possibile programmare e sviluppare algoritmi più rapidamente rispetto ai linguaggi tradizionali, in quanto non è necessario eseguire attività di gestione codice a basso livello come la dichiarazione di variabili, la specificazione dei tipi di dati e l'assegnazione della memoria. In molti casi MATLAB elimina la necessità di utilizzare loop. di Fabio Bozzoli 21 BOZZA Introduzione BOZZA BOZZA Funzioni principali Linguaggio di alto livello per il calcolo tecnico Ambiente di sviluppo per la gestione di codice, file e dati Funzioni matematiche per l'algebra lineare, la statistica, l'analisi di Fourier, il filtraggio, l'ottimizzazione e l'integrazione numerica Funzioni grafiche in 2D e 3D per la rappresentazione grafica dei dati Strumenti per la creazione di interfacce grafiche personalizzate Funzioni per integrare gli algoritmi basati su MATLAB con linguaggi e applicazioni esterni come C/C++, Fortran, etc… di Fabio Bozzoli 22 BOZZA Introduzione BOZZA BOZZA Analisi dei dati MATLAB supporta l'intero processo di analisi dei dati, dall'acquisizione da database e periferiche esterni fino alla preelaborazione, visualizzazione, analisi numerica e produzione dei risultati in un formato adatto a presentazioni. (Interpolazione e decimazione , estrazione di sezioni di dati, scalatura e calcolo della media, correlazione, analisi di Fourier e filtraggio, funzioni statistiche di base e curve fitting) Accesso ai dati MATLAB è un'efficace piattaforma per accedere ai dati da file, altre applicazioni, database e periferiche esterne. È possibile leggere i dati dai formati di file più diffusi, ad esempio Microsoft Excel, testi in formato ASCII o file binari, file video, audio e immagini. È’ possibile acquisire dati dalle periferiche hardware, ad esempio dalla scheda audio o dalla porta seriale di un computer. (Data Acquisition Toolbox, Instrument Control Toolbox) di Fabio Bozzoli 23 BOZZA Introduzione BOZZA BOZZA Visualizzazione dei dati • In MATLAB sono disponibili tutte le funzioni grafiche necessarie per visualizzare i dati tecnico-scientifici. Sono inclusi: funzioni grafiche in 2-D e 3-D, funzioni per la rappresentazione volumetrica 3D, strumenti per la creazione interattiva dei diagrammi e la possibilità di esportare i risultati in tutti i formati grafici più diffusi. Creazione ed editing interattivo dei grafici di Fabio Bozzoli 24 BOZZA Introduzione BOZZA BOZZA Calcolo numerico MATLAB comprende le funzioni matematiche, statistiche e tecniche per supportare tutte le operazioni più comuni di natura scientifica e tecnica. Tali funzioni costituiscono la base del linguaggio MATLAB. Le funzioni matematiche principali utilizzano le librerie di algebra lineare LAPACK e BLAS e la libreria della Trasformata Discreta di Fourier FFT. Manipolazione delle matrici e algebra lineare Polinomi e interpolazioni Analisi di Fourier e filtraggio Analisi dei dati e funzioni statistiche Ottimizzazione e integrazione numerica Equazioni differenziali ordinarie (ODE) Equazioni differenziali parziali (PDE) Operazioni su matrici di Fabio Bozzoli 25 BOZZA Introduzione BOZZA BOZZA MATLAB offre agli utenti una serie di funzioni per documentare e condividere il proprio lavoro. Il codice MATLAB può essere integrato con altri linguaggi e altre applicazioni, consentendo così di utilizzare le applicazioni e gli algoritmi MATLAB come programmi standalone o come moduli software. MATLAB presenta funzioni per integrare con le proprie applicazioni il codice C e C++, il codice Fortran Rilascio di applicazioni È possibile creare un algoritmo in MATLAB e distribuirlo ad altri utenti MATLAB sotto forma di codice M. Con il MATLAB Compiler (disponibile separatamente), l'algoritmo creato dall'utente può essere rilasciato come applicazione standalone oppure come modulo software da inserire nel progetto destinato agli utenti che non dispongono di MATLAB. di Fabio Bozzoli 26 BOZZA BOZZA BOZZA Avviare una sessione di lavoro Avviando Matlab si apre una sessione di lavoro e il prompt >> indica che il programma è pronto a ricevere istruzioni. Es. Digitando 7/10 e INVIO si ottiene » 7/10 ans = 0.7000 Matlab assegna la risposta ad una variabile temporanea (ans). E’ possibile memorizzare il risultato anche in un’altra variabile Es. r=7/10 r= 0.7000 Non e’ necessario né dimensionare né dichiarare il tipo di variabile Il segno = è l’operatore di assegnazione o sostituzione, da non confondere con l’operatore di uguaglianza (==) I nomi delle variabili devono iniziare con una lettera e non possono essere più lunghi di 31 caratteri. Possono contenere numeri e il carattere “underscore”. Matlab è case sensitive. di Fabio Bozzoli 27 BOZZA BOZZA BOZZA Avviare una sessione di lavoro Matlab conserva l’ultimo valore di una variabile finchè non chiudete la sessione di lavoro o non cancellate espressamente il valore della variabile. Alcuni comandi per gestire una sessione di lavoro: who elenca le variabili che si trovano in memoria. whos elenca le variabili, le loro dimensioni e indica se possiedono parti immaginarie non nulle. pwd visualizza il percorso della directory corrente. dir visualizza il contenuto della directory corrente. cd consente di cambiare directory. clear elimina tutte le variabili dalla memoria. Il punto e vigola al termine dell’istruzione consente di non visualizzare il risultato dell’operazione. di Fabio Bozzoli 28 BOZZA BOZZA Array e variabili BOZZA MATLAB utilizza la rappresentazione in virgola mobile in singola (32 bits) o doppia precisione (64 bits), in accordo a lo standard IEEE 754 . Il default è la doppia precisione, ma è possibile convertire un double in singola precisione. Uno dei punti di forza di Matlab è la capacità di raccogliere molti numeri in strutture chiamate array (o matrici) come se fossero una sola variabile. Un array numerico è una raccolta ordinata di numeri. Vettore: array monodimensionale Matrice: array a due o più dimensioni. Per inseririe un vettore riga: r=[2,4,10] Per inseririe un vettore colonna: s=[2;4;6] di Fabio Bozzoli 29 BOZZA BOZZA Array e variabili BOZZA Per inserire una matrice 3x3 digitate: Es. A=[1 2 3;4 5 6;7 8 9] A= 1 2 3 4 5 6 7 8 9 Per riferirsi agli elementi di un array si usano le parentesi rotonde e gli indici di riga e di colonna separati da virgole. A(1,2) è l’elemento a1,2 Per riferirsi ad intere righe o colonne si usano i due punti. A(:,2) indentifica tutti gli elementi nella 2° colonna di A Per unire vettori a matrici A=[1,2,3;4,5,6;7,8,9]; V=[10,11,12]; A=[A;v]; Operazioni importanti: trasposta, rotazione, ribaltamento di Fabio Bozzoli 30 BOZZA Esercizio BOZZA BOZZA Partendo dalle matrici . ⎡1 2 3⎤ A = ⎢⎢4 5 6⎥⎥ ⎢⎣7 8 9⎥⎦ ⎡13⎤ C = ⎢⎢14⎥⎥ ⎢⎣15⎥⎦ B = [10 11 12] D = [0 0 0] di Fabio Bozzoli 31 BOZZA Esercizio BOZZA BOZZA Ottenete le matrici . ⎡1 4 7 10 13⎤ R1 = ⎢⎢2 5 8 11 14⎥⎥ ⎢⎣3 6 9 12 15⎥⎦ ⎡7 8⎤ R4 = ⎢ ⎥ ⎣4 5⎦ ⎡8 9 ⎤ R2 = ⎢ ⎥ ⎣11 12⎦ ⎡4 5⎤ R3 = ⎢ ⎥ ⎣7 8⎦ di Fabio Bozzoli 32 BOZZA File .m BOZZA BOZZA In Matlab è possibile operare in due modi differenti: In modalità interattiva Eseguire un programma di matlab registrato in un file di tipo m o m-file. Esistono due categorie di M-file: file script e file di funzione. Con il comando edit si apre l’editor di Matlab. di Fabio Bozzoli 33 BOZZA Stringhe BOZZA BOZZA Un testo in Matlab viene interpretato come un vettore di caratteri. Le stringhe di caratteri vanno racchiuse tra apici A=‘stringa di testo’ Le stringhe di testo possono essere visualizzate con il comando disp In un m-file l’introduzione interattiva di dati può ottenersi con la funzione input N=input(‘Numero di discretizzazioni ….’) nome=input(‘ Come ti chiami?’,’s’) Altre funzioni per la gestione delle stringhe di testo: Int2str, str2num, strncmp….. di Fabio Bozzoli 34 BOZZA BOZZA Altri tipi di dati BOZZA Celle (Cell array) Strutture Celle Le celle sono array che possono contenere elementi di tipo diverso tra loro. Possono essere create direttamente per assegnamento o utilizzando il comando cell. L’indicizzazione ad una cella avviene tramite le parentesi graffe. Es. A=rand(2,2) c={A, det(A), inv(A)} L’uso principale previsto è quello relativo alla gestione delle stringhe. di Fabio Bozzoli 35 BOZZA BOZZA Altri tipi di dati BOZZA Strutture Sono arrays multidimensionali a cui si accede tramite la definizioni di campi. Es. studente.nome=‘Marco’ studente.cognome=‘Bianchi’ studente.ccl=‘Meccanica’ studente.anno=‘quinto’ Un intero elemento può essere aggiunto con studente(2)=struct(‘nome’,’Paolo’,’cognome’,’Verdi’,’ccl’,’Elettronica’,’anno’, ’quarto’) …………… di Fabio Bozzoli 36 BOZZA BOZZA Operazioni con le matrici BOZZA Gli elementi sono separati da spazi o virgole, le righe dal punto e virgola entro parentesi quadre. Matlab consente di effettuare operazioni su matrici in modo molto semplice. Es. B= A’ calcola la trasposta della matrice A e memorizza il risultato nella matrice B. » B=A' B= 1 4 2 5 3 6 7 8 9 di Fabio Bozzoli 37 BOZZA BOZZA BOZZA Operatori matematici Osservate il risultato delle seguenti operazioni: A+2, A-2, A*2, A/2 C=A+B, D=A*B, E=A/B, F=A.*B, G=A./B, H=A.^2 Operazioni aritmetiche scalari ^ Elevazione a potenza * Moltiplicazione / Divisione a destra \ Divisione a sinistra + Addizione - Sottrazione Ordine di precedenza standard della programmazione di Fabio Bozzoli 38 BOZZA BOZZA BOZZA Operatori matematici Operazioni con le matrici (elemento per elemento) + Somma array scalare - Sottrazione array scalare + Somma di matrici - Sottrazione di matrici .* Moltiplicazione di matrici elemento per elemento ./ Divisione destra di matrici elemento per elemento .\ Divisione sinistra di matrici elemento per elemento .^ Elevamento a potenza elemento per elemento * Moltiplicazione di matrici riga per colonna / Divisione destra \ Divisione sinistra o inversa di Fabio Bozzoli 39 BOZZA BOZZA BOZZA Divisione matriciale Se A è una matrice quadrata invertibile e B è un vettore X=A\B è la soluzione di AX=B X=B/A è la soluzione di XA=B Quindi B/A=(A’\B’)’ Se la matrice è mxn vi sono 2 casi m>n sistema sovradeterminato (soluzione ai minimi quadrati) m<n sistema sottodeterminato (soluzione fondamentale con al più m componenti non nulle) di Fabio Bozzoli 40 BOZZA BOZZA BOZZA Divisione matriciale Metodo matriciale ⎡2 9 ⎤⎡ x1 ⎤ ⎡5⎤ ⎢3 − 4⎥⎢ x ⎥ = ⎢7⎥ ⎣ ⎦⎣ 2 ⎦ ⎣ ⎦ 2x1+9x2=5 3x1-4x2=7 Ax=b x=A\b (DIVISIONE SINISTRA) Se il sistema è scritto nella forma Xc=D x=D/c (DIVISIONE DESTRA) [x1 ⎡6 2⎤ x2 ] ⎢ = [3 −19] ⎥ ⎣3 5⎦ di Fabio Bozzoli 41 BOZZA BOZZA Operatori relazionali BOZZA = Assegnazione == Uguaglianza < > <= >= Minore, maggiore minore o uguale, maggiore o uguale & AND logico | OR logico ∼ NOT logico Xor OR esclusivo di Fabio Bozzoli 42 BOZZA BOZZA Istruzioni condizionali e cicli BOZZA if else, sintassi: if, condizione sulle variabili, istruzioni, else o elseif, condizione sulle variabili, istruzioni,... end Es. x=10; if x>=0 y=sqrt(x) end While, sintassi: while, condizione sulle variabili, istruzioni end. A=zeros(4,4); k=1; while k<=4 A(k,k)=1, k=k+1; end For, sintassi: for, variabile=espressione, istruzioni, end. A=zeros(4,4); for k=1:4 A(k,k)=1, end di Fabio Bozzoli 43 BOZZA BOZZA Istruzioni condizionali e cicli BOZZA Switch case, sintassi: switch(condizione) case ‘valore’ istruzione otherwise end switch (value) case {1,3,5,7,9} disp(‘Il valore è dispari') case {2,4,6,8,10} disp(‘Il valore è pari') otherwise disp(‘Il valore è al di fuori dell‘intervallo.) end di Fabio Bozzoli 44 BOZZA Esercizio BOZZA BOZZA Data l’equazione di secondo grado ax^2+bx+c=0 Utilizzando la struttura if elseif end creare un programma al fine di individuare, noti i coefficienti a,b e c, le caratteristiche delle soluzioni x1 e x2. Visualizzare su schermo se le soluzioni dell’equazione saranno reali, reali coincidenti o complesse. Creare un programma analogo utilizzando la struttura switch case end. Riscrivere il programma utilizzando la struttura while end di Fabio Bozzoli 45 BOZZA Soluzione: if BOZZA BOZZA % Programma per la risoluzione di un equazione di II grado complete del tipo ax^2+bx+c=0 delta=(b^2-4*a*c); d=sqrt(delta); x1=(-b+d)/(2*a); x2=(-b-d)/(2*a); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%IF%%%%%%%%%%%%%%%% if delta<0 disp('le soluzioni sono complesse coniugate') disp(['x1=',num2str(x1)]); disp(['x2=',num2str(x2)]); elseif delta==0 disp('le soluzioni reali coincidenti') disp(['x1=',num2str(x1)]); disp(['x2=',num2str(x2)]); else disp('le soluzioni reali distinte') disp(['x1=',num2str(x1)]); disp(['x2=',num2str(x2)]); di Fabio Bozzoli end 46 BOZZA BOZZA Soluzione: Switch BOZZA %%%%%%%%%%%%%%SWITCH%%%%%%%%%%%%%%%%%%%%%% switch sign(delta) case{-1} disp('le soluzioni sono complesse coniugate') disp(['x1=',num2str(x1)]); disp(['x2=',num2str(x2)]); case {0} disp('le soluzioni reali coincidenti') disp(['x1=',num2str(x1)]); disp(['x2=',num2str(x2)]); case{1} disp('le soluzioni reali distinte') disp(['x1=',num2str(x1)]); disp(['x2=',num2str(x2)]); end di Fabio Bozzoli 47 BOZZA BOZZA BOZZA Soluzione: While %%%%%%%%%%%%%%%%%%%WHILE%%%%%%%%% while delta<0 disp('le soluzioni sono complesse coniugate') disp(['x1=',num2str(x1)]); disp(['x2=',num2str(x2)]); break end while delta==0 disp('le soluzioni reali coincidenti') disp(['x1=',num2str(x1)]); disp(['x2=',num2str(x2)]); break end while delta>0 disp('le soluzioni reali distinte') disp(['x1=',num2str(x1)]); disp(['x2=',num2str(x2)]); break end di Fabio Bozzoli 48 BOZZA Esercizio BOZZA BOZZA Creare un programma che, dopo aver “pensato” a un numero compreso tra 0 e 100, chieda all’utente di indovinarlo fino a quando non ci riesce. Il programma darà un aiuto dicendo ogni volta se il numero introdotto è maggiore o minore di quello da indovinare. Utilizzare la struttura while Aiuto: utilizzare rand(1) e round(X) e if dentro a while di Fabio Bozzoli 49 BOZZA Soluzione BOZZA BOZZA x= rand(1)*100; x= round(x); y=input('introduci un numero'); while not(x==y) if x>y disp('più alto') else disp('più basso') end y=input('introduci un numero'); end disp('hai indovinato') di Fabio Bozzoli 50