qui
Transcript
qui
Introduzione a MATLAB® Fabio Rossi [email protected] Concetti Fondamentali MATLAB = MATrix LABoratory • Nato come interfaccia alle librerie di algebra lineare LINPACK ed EISPACK • Interprete di comandi • Linguaggio di programmazione • Matrix-oriented – i vettori sono matrici ad 1 indice, gli scalari sono matrici 1x1 – Non è un linguaggio tipizzato: dimensionamento non richiesto • • • • Multi-piattaforma (Unix, Mac, Windows) Portabilità delle applicazioni Possibilità grafiche E’ possibile far interagire programmi scritti in C o FORTRAN con MATLAB – API, Application Program Interface Modularità • Toolbox (Librerie) – collezione omogenea di funzioni (m-files) che estende il pacchetto originario • Esempi: – – – – – – – – • • statistica reti neurali ottimizzazione elaborazione di immagini controllo e identificazione di sistemi equazioni alle derivate parziali (pde) matematica finanziaria … e molti altri … Programmazione grafica per agevolare la modellazzazione e la simulazione di sistemi complessi (SIMULINK). Riferimento: www.mathworks.com Prompt dei comandi • All’avvio compare: >> • Utilizzo come calcolatrice >> 2+2 ans = 4 • ans è una variabile standard dove viene caricato l’ultimo risultato >> quit • … esce dal programma • Help in linea: help nome-comando >>help sqrt >>help help Prompt dei comandi • Operazioni standard – +, -, *, /, ^ • Separazione dei comandi su una stessa linea con una virgola: , • Terminazione di un comando: ; – Non viene visualizzato l’output • Per spezzare una linea di comando troppo lunga: … • Comandi precedentemente inseriti: tasto ↑ • Utilizzo parentesi per modificare la priorità fra le operazioni • Variabili, operatore di assegnamento >> a = 3 Workspace • Lo spazio di memoria contenente le variabili presenti • Lista delle variabili: >>who • Lista delle variabili estesa (nome, dimensioni, occupazione di memoria, classe, attributi): >>whos Salvataggio sessioni di lavoro >>diary mywork.dat >>… >>diary off • mywork.dat è un semplice file di testo • Per salvare lo stato della memoria: >>save <nomefile> [lista variabili] Produce un .m file >>save work1 >>save work2 x y Omettendo [lista variabili] tutto il workspace viene salvato. Per ricaricare il workspace: >>load work1 Variabili predefinite • • • • • • • • • • ans: i, j: pi: eps: realmax realmin Inf NaN version computer • Nota: definizione di un numero complesso: >> c = 1 + 3*i Complesso coniugato >> cj = c’ • valore ultima operazione eseguita unità immaginaria, sqrt(-1) approssimazione di π precisione di macchina massimo numero reale positivo rappresentabile minimo numero reale positivo rappresentabile ∞, ossia un numero maggiore di realmax indeterminato (Not A Number) (0/0, Inf/Inf, …) versione di MATLAB tipo di computer Variabili • Anche quelle predefinite possono essere modificate >>clear <nome varibile> – Contenuto per le variabili predefinite, ripristina il valore di default – per le altre variabili, elimina la variabile dal workspace >>clear – Reset del workspace Formato di visualizzazione dei numeri • Comando format >>format % default - virgola fissa >>format long % virgola fissa estesa >>format long e % scientifica estesa >>format short e % scientifica abbreviata >>format rat % numero razionale • Importante: il formato in cui sono memorizzati i numeri ed effettuati I calcoli è comunque double (floating point in doppia precisione). Vettori e Matrici Definizione di vettori • Notazione con parentesi quadre – Variabile vuota >> e = [] – Vettore riga (1xn) >> vr = [1 2 3 4] – Vettore colonna (nx1) >> vc = [1; 2; 3; 4] – Definizione con intervalli – v= [inizio:incremento:fine] | [inizio:fine] >> v=[1:10] % incremento di default = 1 >> v=[-2:0.5:2] Definizione di matrici >> m1 = [1 2; 3 4] m1 = 1 2 3 4 >> m1 = [1 2; 3 4 5] … Errore! • Composizione di matrici e/o vettori: >> m2 = m1; m3 = [m1 m2] >> m4 = [1:3; 4:6; 7:9] Indicizzazione • Vettori (sia riga che colonna) – v(k): elemento di indice k (n.b.: si conta a partire da 1) – v(vettore_indici) • Matrici – – – – – m(l,k), elemento in riga l-esima, colonna k-esima m(l, :), riga l-esima m(:, k), colonna k-esima m(indici_riga, indici_colonna) m(:), tutti gli elementi vengono estratti in un vettore colonna di dimensioni nxm Indicizzazione – Esempio 1 • >> mi mi = 1 1/2 1/3 1/4 1/5 1/2 1/3 1/4 1/5 1/6 >> mi([1 3 5], [2 4]) ans = 1/2 1/4 1/6 1/4 1/6 1/8 1/3 1/4 1/5 1/6 1/7 1/4 1/5 1/6 1/7 1/8 1/5 1/6 1/7 1/8 1/9 Indicizzazione – Esempio 2 • • Cancellazione di una colonna da una matrice: >> m(:,k) = [ ] rimuove la colonna k-esima Ridimensionamento di vettori – Indicizzando in scrittura un elemento non presente nella matrice (o vettore), la matrice viene, se possibile, ridimensionata in modo da comprendere tale elemento ed il valore assegnato – Esempio: >> v=1 v= 1 >> v(3)=2 v= 1 0 2 >> v(2,4)=3 v= 1 0 2 0 0 0 0 3 >> v(11) = 4 ??? In an assignment A(I) = B, a matrix A cannot be resized. Dimensioni • Matrici: >> size(m1) ans = 2 • Vettori: >>length(b) ans = 4 2 % vettore contenente % numero di righe e colonne Operazioni su matrici • Somma “+”/Sottrazione “-” (dimensioni congrue) – Caso particolare: +,- con uno scalare, viene applicata elemento per elemento • Moltiplicazione riga-colonna “*”(matrice nxk * matrice kxm = matrice nxm) – Stesso caso particolare, moltiplicazione per uno scalare • Trasposta coniugata >> b = a’ • Trasposta non coniugata >> b = a.’ Moltiplicazione fra matrici Esempio >> a = 1:4 a= 1 2 3 4 >> b = 2:5 b= 2 3 4 5 4 6 8 10 6 9 12 15 8 12 16 20 >> b * a' ans = 40 >> b' * a ans = 2 3 4 5 Operazioni su matrici, per elemento • Facendo precedere l’operatore da “.”, ad esempio: >> m1 m1 = 1 3 2 4 >> m2 m2 = 1 3 2 4 >> m1.*m2 ans = 1 9 4 16 Operazioni su matrici, per elemento • Altro esempio >> m1 m1 = 1 2 3 4 >> m1^2 ans = 7 15 10 22 >> m1.^2 ans = 1 9 4 16 Nota: ^ è definito solo per matrici quadrate ed esponenti interi Divisioni • Divisione fra matrici non definita in matematica • In MATLAB: – A / B = A * inv(B) – A \ B = inv(A) * B Matrici predefinite • rand(n) • • • • zeros(n) ones(n) eye(n) hilb(n) matrice di nxn numeri random in [0,1] matrice nulla matrice costituita da 1 matrice identità matrice di Hilbert • (n) può essere sostituito con (n,m) • come definire un vettore di 0? Costruzione di matrici • diag(v) – dato un vettore v di lunghezza n, costruisce una matrice diagonale nxn avente gli elementi di v sulla diagonale • diag(v, i) – dato un vettore v di lunghezza n, costruisce una matrice (n+abs(i))x(n+abs(i)) avente gli elementi di v sulla i-esima diagonale • diag(M, i) – data una matrice M estrae in un vettore colonna la sua i-esima diagonale (se i viene omesso restituisce la diagonale principale) Funzioni built-in su vettori • max(v) (min(v)) : massimo (minimo) valore delle componenti di un vettore (considerate solo in modulo) • [m, i] = max(v) (min(v)), come sopra, ma restituisce in m il valore ed in i l’indice dell’elemento • sum(v), somma di tutti gli elementi di v • prod(v), prodotto di tutti gli elementi di v • sort(v), ordina gli elementi di v (ordine crescente) e li inserisce nel vettore restituito Funzioni built-in su vettori • norm(v), norma 2 del vettore v • norm(v,1), norma 1 del vettore v • norm(v, inf), norma infinito del vettore v Funzioni built-in su matrici • max(M) (min(M)) : massimo (minimo) valore delle componenti di una matrice per ogni colonna, generazione di un vettore riga che contiene i risultati • [m, i] = max(M) (min(M)), come sopra, ma restituisce in i gli indici di riga degli elementi selezionati per ogni colonna • sum(M), somma gli elementi di ogni colonna di M • prod(M), prodotto degli elementi di ogni colonna di M • sort(M), ordina gli elementi di ogni colonna di M (ordine crescente) e li inserisce nella matrice restituita Funzioni built-in su matrici • • • • det(M), determinante di M rank(M), rango di M null(M), calcola una base ortonormale del nucleo di M orth(M), calcola una base ortonormale dell’immagine di M • eig(M), calcola gli autovalori di M • [V, D] = eig(M), calcola autovalori e autovettori di M – Le colonne di V sono gli autovettori – D è una matrice diagonale contenente gli autovalori sulla diagonale – D = V-1 M V Funzioni built-in su matrici • trace(M), calcola la traccia di M (somma degli elementi sulla diagonale) • inv(M), calcola l’inversa di M • M\v, risolve il sistema lineare Mx=v utilizzando il metodo di eliminazione di Gauss • norm(M), norma 2 di M • norm(M,1), norma 1 di M • norm(M, inf), norma infinito di M • cond(M), fattore di condizionamento (in norma 2) di M – disponibili anche cond(M,1) e cond(M,inf) Il comando flops • Permette di contare il numero di operazioni in virgola mobile effettuate in una sessione di lavoro >>flops(0) % reset del contatore >>A+B; % due matrici 3x3… >>flops ans = 9 Programmazione in MATLAB Script • Memorizzati in .m files • Sequenza di comandi • Non ci sono parametri in ingresso né in uscita • Variabili a visibilità globale Script - Esempio • Il file script1.m contiene: a = [1:5] b = [6:10] c = a*b' d = a'*b Funzioni • Memorizzate in .m files • Accettano argomenti in ingresso e possono restituire argomenti in uscita • Le variabili interne ad una funzione sono locali • La prima riga del file rappresenta l’intestazione della funzione: – function [out1, out2, …] = nome_funzione( in1, in2, …) – si consiglia di avere nome_funzione e nome del file coincidenti • Dopo l’intestazione si possono inserire alcune righe di commento (che iniziano con il carattere %) che saranno stampate ogni volta che si invoca il comando: help nome_funzione • Segue il corpo della funzione Funzioni - Esempio Il file prima_funzione.m contiene: function [r1 r2] = prima_funzione(n) % non necessita di help... v1 = [1:n]; v2 = [n+1:2*n]; r1 = v1*v2'; r2 = v1'*v2; Operatori logici e di confronto • Operatori di confronto: – ==, <=, >=, <, >, ~= – 0 corrisponde a false – Un valore diverso da 0 corrisponde a true • Operatori logici – AND(&), OR (|), NOT(~) • Nota: il carattere ~ si può ottenere con Alt+126, dove i numeri vanno digitati in sequenza, dal tastierino numerico (sulle tastiere dei laptop Alt+Fn+126) • Ci serviranno per il controllo del flusso … Input/Output - Terminale • clc, pulisce il terminale • disp(), visualizza una stringa o una variabile • input, permette l’inserimento del valore di una variabile da tastiera >> n = input('Inserire un numero: ') Inserire un numero: 3 n= 3 >> • pause, sospende l’esecuzione del programma fino alla pressione di un tasto • pause(n), come sopra, fino ad un massimo di n secondi Input/Output - File • Apertura di un file in lettura >>fid = fopen(‘c:\quadrato.dat’, ‘r’); >>lato = fscanf(fid, ‘%f\n’); • Lettura di una valore da file • Formati di lettura/scrittura – – – – %s %d %f %e stringhe interi reali in virgola fissa reali in virgola mobile • Apertura di un file in scrittura >>fid = fopen(‘c:\area.dat’, ‘w’); • Scrittura di un valore su file >>fprint (fid, ‘il quadrato di lato %f ha area %f\n’, lato, area) Controllo del flusso (1) • For <indice>=<start>:<step>:<end> {blocco-istruzioni} end • step può essere omesso, default = 1 • Esempio: for i=1:n for j=1:n a(i,j) = 1/(i+j-1) end end Controllo del flusso (2) • while <condizione> {blocco-istruzioni} end • Esempio: >>n=1 >>while (prod(1:n)<1e10) n=n+1; end disp(n) Controllo del flusso (3) • if <condizione1> {blocco-istruzioni1} elseif <condizione2> {blocco-istruzioni2} else {blocco-istruzioni3} end • Le clausole elseif ed else sono opzionali • Esempio: n=input(‘Numero di cui calcolare il fattoriale >>’); If n<0 disp(‘n negativo’) Elseif n==0 fattorale = 1 Else fattoriale = prod(1:n) end