Introduzione a MATLAB -...

63
Introduzione a MATLAB Stefano Berrone tel. 011 564 7503 [email protected] http://calvino.polito.it/sberrone Dipartimento di Matematica Politecnico di Torino Corso di Calcolo Numerico Corsi di Laurea in Ingegneria dell’Organizzazione d’Impresa Ingegneria Logistica e della Produzione a.a. 2005/2006 Bibliografia: Berrone, Pieraccini, Esercizi svolti di Calcolo Numerico con Introduzione a MATLAB, CLUT, 2004

Transcript of Introduzione a MATLAB -...

Introduzione a MATLAB

Stefano Berrone

tel. 011 564 7503

[email protected]

http://calvino.polito.it/∼sberrone

Dipartimento di Matematica

Politecnico di Torino

Corso di Calcolo Numerico

Corsi di Laurea in

Ingegneria dell’Organizzazione d’Impresa

Ingegneria Logistica e della Produzione

a.a. 2005/2006

Bibliografia: Berrone, Pieraccini, Esercizi svolti di Calcolo Numerico con Introduzione a MATLAB,

CLUT, 2004

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Cos’e Matlab?

Matlab e un linguaggio di programmazione interpretato e non di tipo compilato.

Nei linguaggi interpretati le istruzioni vengono immesse direttamente al prompt (in Matlab

rappresentato dalla stringa > >) ed eseguite una ad una dall’interprete dei comandi.

Esempio.

> > 3+4 (+ tasto invio)ans =

7

Vantaggi:

• elevato livello di interazione tra utente e interprete dei comandi

• notevole semplicita di programmazione.

Svantaggi:

• In generale, minore efficienza rispetto ad un linguaggio compilato.

1

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Comandi

Nel seguito indicheremo con il generico termine “comando” diverse operazioni, come ad esempio:

• l’assegnazione di un valore ad una variabile,

• la valutazione di un’espressione (eventualmente preceduta da un’assegnazione),

• l’esecuzione di una function esistente o creata dall’utente,

• l’esecuzione di uno script...

Per il momento supporremo di immettere i comandi direttamente al prompt.

Poi, programmazione strutturata in file.

2

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Variabili

Nomi di variabile ammissibili: sequenze di caratteri lunghe da 1 a 32 caratteri, contenenti lettere, numeri

(ma mai un numero in prima posizione) e il carattere (underscore).

Matlab e case sensitive, ovvero distingue fra maiuscole e minuscole indipindentemente dal sistema

operativo con cui si usa (Linux, Windows...).

Esempio. AB, aB, ab e Ab rappresentano quattro variabili diverse.

N.B. Tutte le funzioni predefinite di Matlab vanno usate con i caratteri minuscoli (nonostante il fatto

che nell’help in linea i nomi di funzione siano tutti scritti in caratteri maiuscoli).

Tipi di variabile

Tra le variabili numeriche, Matlab usa solamente variabili reali in doppia precisione; non usa variabili

intere, ne logiche (cio non significa che non gestisce operazioni di tipo logico).

E possibile definire variabili di tipo stringa (vettori di caratteri).

3

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Assegnazioni

Sintassi di una istruzione di assegnazione:

> > nomevariabile = espressione

Esempio.

> > a = 1;

N.B. Le variabili non richiedono una dichiarazione prima dell’assegnazione.

Se una assegnazione non e seguita dal carattere ; Matlab mostra immediatamente come output il

risultato dell’espressione o dell’assegnazione:

> > a = 1a =

1

Per definire una variabile di tipo stringa si assegna come contenuto una qualsiasi stringa racchiusa fra

apici:

> > var = ’pluto’;

4

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Costanti predefinite

In Matlab sono a disposizione dell’utente alcune variabili speciali e costanti predefinite:

• ans e la variabile a cui viene assegnata la most recent ANSwer, ovvero il risultato di espressioni

valutate al prompt senza che siano precedute da un’istruzione di assegnazione;

• eps contiene l’epsilon di macchina; nel caso di arrotondamento la precisione di macchina e 0.5*eps;

• realmax contiene il piu grande numero di macchina positivo;

• realmin contiene il piu piccolo numero di macchina positivo rappresentabile in forma normalizzata

(con denormalizzazione si possono rappresentare anche valori fino a realmin∗2−52);

• pi contiene il valore approssimato di π;

• i,j rappresentano entrambi l’unita immaginaria;

• inf rappresenta il valore speciale “infinito”; e il risultato ad esempio della divisione 1/0;

• NaN rappresenta il valore speciale Not a Number; e il risultato, ad esempio, della divisione 0/0.

N.B. Le costanti predefinite possono essere usate dall’utente come variabili, ignorando il loro valore e

significato, e usandole in una qualsiasi istruzione di assegnazione (ad esempio, le variabili i e j possono

essere tranquillamente usate in un ciclo for): il contenuto predefinito sara recuperato riavviando una

nuova sessione di lavoro.

5

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Errori e warning

Distinzione come in molti altri linguaggi fra errori e messaggi di warning.

Quando si commette un errore (ad esempio, se si tenta di fare riferimento ad una variabile non definita)

l’esecuzione si blocca.

Esiste un certo numero di operazioni per le quali viene prodotto sul display un messaggio di warningmentre l’esecuzione prosegue.

N.B. A causa della presenza delle costanti predefinite inf e NaN l’utente deve porre estrema attenzione

nell’assicurarsi che le operazioni che vengono effettuate siano ben definite. A volte un errore puo

compensarsi con altre operazioni senza che l’utente se ne renda conto!

Esempio.> > 1/0 → risultato inf (con warning)

> > 1/inf → risultato 0.> > 1/(1/0) → risultato 0! (preceduto da un messaggio di warning per la divisione 1/0).

6

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Si tenga presente che Matlab lavora anche nel campo complesso.

Il tentativo di calcolare sqrt(-1) (vale a dire√−1) non genera ne messaggi d’errore, ne messaggi di

warning, ma semplicemente la risposta 0+i.

Dev’essere cura dell’utente inserire controlli per assicurarsi di lavorare sempre in campo reale (se e

questo che si desidera).

7

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Interagire con l’ambiente di calcolo

Una variabile attiva e una variabile che e stata assegnata e che risulta essere ancora memorizzata.

L’insieme delle variabili attive costituisce il workspace di Matlab.

E possibile in ogni momento controllare il contenuto del workspace con uno dei comandi seguenti:

> > who (mostra l’elenco delle variabili)

> > whos (ne indica anche la dimensione e il tipo).

Esempio.

> > a = 1;> > b = 6;> > whosName Size Bytes Class

a 1x1 8 double arrayb 1x1 8 double array

Grand total is 2 elements using 16 bytes

8

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Il contenuto del workspace puo essere salvato su un file in qualsiasi momento della sessione di lavoro

usando il comando save:

> > save nomefile

apre un file binario di nome nomefile.mat in cui vengono salvate le variabili attive; se il nome del file

non viene specificato, il nome di default usato e matlab.mat.

Per salvare solo alcune variabili, ad esempio le variabili var1 e var2, si puo usare la sintassi

> > save nomefile var1 var2

Per recuperare, all’interno di una sessione di lavoro, il contenuto delle variabili salvate in un file con

estensione .mat, e sufficiente digitare il comando

> > load nomefile

Per cancellare completamente il contenuto del workspace si puo usare il comando

> > clear

Per eliminare solo alcune variabili si usa il comando clear seguito dalle variabili che si desidera cancellare:

> > clear var1

9

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Il flusso di comandi digitato durante una sessione di lavoro puo essere salvato su un file di testo usando

il comando diary. Per la precisione, con il comando

> > diary nomefile

viene aperto il file di testo nomefile.dat su cui vengono trascritti tutti i comandi lanciati al prompt e

le relative risposte eventualmente fornite dal programma.

Con il comando

> > diary off

viene interrotto il salvataggio del flusso di comandi, il file viene chiuso e salvato.

10

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

help !

Uno tra i comandi piu utili di Matlab e senz’altro il comando help.

Se e noto il nome di un comando, l’istruzione

> > help nomecomando

fornisce il cosiddetto help in linea del comando: la sintassi d’uso, gli effetti, varie opzioni di utilizzo ed

eventuali comandi correlati.

L’istruzione

> > doc nomecomando

fornisce in generale dettagli ancora maggiori, attingendo alla documentazione di Matlab.

Il comando help puo essere usato anche in modo piu generale. I comandi di Matlab sono raggruppati

per topic (“argomenti”). Lanciando al prompt il comando help da solo, si ottiene come output la lista

dei vari argomenti.

11

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

>> help

HELP topics:

matlab/general - General purpose commands.matlab/ops - Operators and special characters.matlab/lang - Programming language constructs.matlab/elmat - Elementary matrices and matrix manipulation.matlab/elfun - Elementary math functions.matlab/specfun - Specialized math functions.matlab/matfun - Matrix functions - numerical linear algebra.matlab/datafun - Data analysis and Fourier transforms.matlab/audio - Audio support.matlab/polyfun - Interpolation and polynomials.matlab/funfun - Function functions and ODE solvers.matlab/sparfun - Sparse matrices.matlab/graph2d - Two dimensional graphs.matlab/graph3d - Three dimensional graphs.matlab/specgraph - Specialized graphs....

12

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Una volta noto il nome degli argomenti, con il comando

> > help nome argomento

si ottiene la lista dei comandi collegati a quell’argomento.

>> help general

General purpose commands.MATLAB Toolbox Version 6.1 (R12.1) 18-May-2001

General informationhelpbrowser - Bring up the help browser.doc - Complete on-line help, displayed in the help browser.help - M-file help, displayed at the command line.helpwin - M-file help, displayed in the help browser.lookfor - Search all M-files for keyword.syntax - Help on MATLAB command syntax.support - Open MathWorks Technical Support Web Page.demo - Run demonstrations.ver - MATLAB, SIMULINK, and toolbox version information.

13

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

version - MATLAB version information.whatsnew - Access Release Notes.

Managing the workspace.who - List current variables.whos - List current variables, long form.workspace - Display Workspace Browser, a GUI for managing the workspace.clear - Clear variables and functions from memory.pack - Consolidate workspace memory.load - Load workspace variables from disk.save - Save workspace variables to disk.quit - Quit MATLAB session.

L’help dei comandi di Matlab e costituito da una prima riga seguita dalla descrizione completa:

> > help norm

NORM Matrix or vector norm.For matrices...NORM(X) is the largest singular value of X, max(svd(X)).NORM(X,2) is the same as NORM(X)....

14

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Con il comando

> > lookfor stringa

Matlab cerca l’occorrenza di stringa nella prima riga dell’help di ogni funzione.

15

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Con il comando format si puo scegliere la modalita di visualizzazione dei numeri.

>> help format

FORMAT Set output format.All computations in MATLAB are done in double precision.FORMAT may be used to switch between different outputdisplay formats as follows:FORMAT Default. Same as SHORT.FORMAT SHORT Scaled fixed point format with 5 digits.FORMAT LONG Scaled fixed point format with 15 digits.FORMAT SHORT E Floating point format with 5 digits.FORMAT LONG E Floating point format with 15 digits....

Esempio.

> > pians =

3.1416> > format long

16

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

> > pians =

3.14159265358979> > format short e> > pians =

3.1416e+00

Per poter eseguire dal prompt di Matlab una istruzione del sistema operativo in uso, e sufficiente

digitarla preceduta da un punto esclamativo !.

Il simbolo % serve a commentare tutto quanto si trova alla sua destra sulla stessa riga.

y = sin(x); % questo e’ un commento

Tre punti consecutivi (...) rappresentano un simbolo di continuazione, per proseguire un’istruzione

lunga alla riga successiva.

> > y = sin(x)+cos(x)-log(x)...-exp(x);

17

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Matlab = MATrix LABoratory

Una delle prerogative di Matlab consiste nella possibilita di eseguire tutte le operazioni fondamentali

(e non) direttamente su matrici e vettori senza la necessita di implementarle attraverso cicli for che ne

scandiscano tutti gli elementi.

Inoltre e dotato di moltissime routine specializzate per il calcolo scientifico e in particolare per l’algebra

lineare.

Nel seguito useremo il termine array per riferirci indifferentemente ad un vettore o ad una

matrice.L’oggetto su cui lavora Matlab e un array.

Parlare in termini di array consente di trattare in modo unificato diversi argomenti che seguono.

Scalare → array 1x1

Vettore → array 1xn (vettore riga) o nx1 (vettore colonna).

18

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Costruzione di array - Assegnazione per elementi

Contrariamente a quanto accade in molti linguaggi di programmazione, non e necessario dimensionare

a priori gli array: la loro dimensione sara automaticamente stabilita nel corso dell’assegnazione e potra

essere in seguito eventualmente aumentata aggiungendo altre righe e/o colonne.

Il modo piu semplice di costruire un array consiste nell’assegnazione per elementi:si elencano gli elementi

uno per uno racchiudendoli fra parentesi quadre e separandoli con uno spazio o una virgola:

> > nomevettore = [elemento1 elemento2 ... elementon]

> > x = [1 2 4];> > y = [2,3,4];

I vari elementi possono essere valori costanti, nomi di variabile gia assegnati o espressioni.

> > a = 2;> > b = 3;> > x = [1 a 1 b]x =

1 2 1 3

19

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Per assegnare ad una variabile un vettore colonna si puo far seguire un’assegnazione come la precedente

dal carattere apice, che rappresenta l’operatore di trasposizione (help transpose):

> > x = [1 a 1 b]’x =

1213

Altrimenti, un vettore colonna puo essere assegnato direttamente usando una sintassi del tipo

> > nomevettore = [elemento1; elemento2; ... elementon]

(il carattere ; indica il termine di una riga di un array; si puo anche usare il tasto invio).

> > z = [a; a; b]z =

223

20

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

N.B. Nell’assegnazione di un array il carattere spazio e sempre interpretato come il separatore tra due

elementi. Si osservino ad esempio le seguenti istruzioni:

> > x = [1 2 3+4]x =1 2 7

> > y = [1,2,3+4]y =1 2 7

> > z = [1,2,3 +4]z =1 2 3 4

Per fare riferimento alla componente di indice i di un vettore si usa la sintassi nomevettore(i). In

Matlab non sono ammessi indici nulli o negativi, per fare riferimento alle componenti di un array.

21

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Assegnazione per elementi di matrici

Lo stesso principio vale per assegnare delle matrici: caratteri su una stessa riga si separano con uno

spazio o una virgola; le righe si terminano con un carattere ; o andando a capo.

Esempio.

> > A = [ 1 2; 3 4]

assegna

A =„

1 23 4

«> > B = [ 1 , 1, 2; pi pi 7]

assegna

B =„

1 1 2π π 7

«

22

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

E possibile assegnare matrici rettangolari con un numero arbitrario di righe e di colonne; l’unico vincolo

e ovviamente costituito dal fatto che ogni riga (e ogni colonna) deve avere la stessa lunghezza.

Esempio. > > B = [ 1 2; 3] → Errore!

Per indicare l’elemento ij di una matrice, si usa la sintassi nomematrice(i,j). L’operatore di

trasposizione ’ puo ovviamente essere usato anche per matrici.

Esempio.

> > A = [1 1;2 2]A =

1 12 2

> > B = A’B =

1 21 2

Il comando B = transpose(A) ha lo stesso effetto.

23

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Costruzione di array - Assegnazione a blocchi

L’assegnazione a blocchi e analoga a quella per elementi: ogni “elemento” puo a sua volta essere

un array, anziche un valore scalare. Nel rispetto delle dimensioni complessive dell’array, si possono

combinare a piacimento scalari, vettori e matrici.Per separare i blocchi su una stessa riga si usa sempre

una virgola o uno spazio, per separare blocchi su righe diverse si usa un punto e virgola o si va a capo.

Esempio. Siano assegnati nel workspace i vettori x = [1 2] e y = [3 4].

• z = [x y x] genera il vettore z = (1, 2, 3, 4, 1, 2)

• B = [x; x] genera la matrice

B =„

1 21 2

«• C = [y’ B; 5 6 7] genera la matrice

C =

0@ 3 1 24 1 25 6 7

1A• u = [y’ x] e errata!

• u = [B; z] e errata!

24

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

N.B. Poiche non e necessario dimensionare a priori gli array (Matlab effettua allocazione dinamica

della memoria), non esiste nessuna contraddizione nelle seguenti due istruzioni, eseguite nell’ordine:

> > A = 1;> > A(2,2) = 3;

Ad A verra assegnata la matrice

A =„

1 00 3

«.

Se le istruzioni sono immesse nell’ordine inverso, con la prima si assegna alla variabile A la seguente

matrice:

A =„

0 00 3

«mentre con la seconda si cancella completamente il vecchio contenuto di A e le viene assegnato il

valore scalare 1.

N.B. Se ad un array gia allocato si vuole assegnare un array di dimensioni inferiori e opportuno usare

prima il comando clear.

25

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Costruzione di array - Routine predefinite

Come possibile generare array particolari, anche di grandi dimensioni?

Esistono molte routine predefinite.Partiamo dai vettori.

• colon Genera vettori di valori equispaziati compresi fra due valori estremi assegnati. La forma

abbreviata usa il simbolo : (due punti).

> > a:b

genera il vettore (a, a + 1, a + 2, ..., a + m), dove m e la parte intera di b− a. Se a > b, il

comando genera un vettore vuoto.

Esempio.

> > x = 3:6x =

3 4 5 6> > y = -4:2y =

-4 -3 -2 -1 0 1 2

26

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Piu in generale, si puo specificare la spaziatura da usare tra i valori:

> > a:d:b

genera il vettore (a, a + d, a + 2d, ..., a + md), con m parte intera di (b− a)/d; d puo essere

arbitrario (< 0, non intero); se a > b e d > 0 o se a < b e d < 0 viene generato un vettore

vuoto.

Esempio.

> > x = 3:2:9x =

3 5 7 9> > y = 3:2:10y =

3 5 7 9> > z = 20:-5:0z =

20 15 10 5 0> > w = 0:0.1:0.5w =0.0 0.1 0.2 0.3 0.4 0.5

27

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Le due istruzioni precedenti possono anche essere scritte colon(a,b) e colon(a,d,b),rispettivamente.

N.B. Sono molte le routine di Matlab che accettano in entrata un numero di argomenti variabile.

• linspace Genera un vettore di valori equispaziati compresi fra due estremi assegnati; la differenza

con colon e che a linspace non si specifica il passo ma il numero totale di punti che si desidera.

> > linspace(a,b,n)

genera un vettore di n valori equispaziati compresi fra a e b, estremi inclusi.

Esempio.

> > x = linspace(-2,4,7)x =-2 -1 0 1 2 3 4

Se n viene omesso il valore di default usato e 100.

28

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Routine predefinite per assegnazione di matrici

• eye(n) genera la matrice identita di ordine n

> > B = eye(2)B =

1 00 1

• zeros(m,n) genera una matrice di m righe e n colonne i cui elementi sono tutti uguali a 0

> > B = zeros(2,3)B =

0 0 00 0 0

• ones(m,n) come zeros, ma tutti gli elementi della matrice sono uguali a 1

• rand(m,n) genera una matrice di numeri pseudo-casuali con distribuzione uniforme; senza argomenti

in entrata genera un solo numero pseudo-casuale

29

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

N.B. A zeros, ones, rand si puo passare un solo argomento; in questo caso si genera una matricequadrata che ha per ordine l’argomento in ingresso e non un vettore; per ottenere un vettore di n

componenti occorre ad esempio usare il comando zeros(1,n) o zeros(n,1).

Un array puo ovviamente venire assegnato anche elemento per elemento, utilizzando uno o piu cicli forcome nella maggior parte dei linguaggi di programmazione.

30

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Sottomatrici

Una volta che un array e assegnato nel workspace, e possibile fare riferimento ad una qualunque sua

sottomatrice in modo estremamente agevole.

Per estrarre da un array A di m righe e n colonne soltanto certi elementi che formano una sottomatrice,

e sufficiente usare la sintassi seguente:

> > A(ir,ic)

dove ir ed ic sono due vettori contenenti gli indici che corrispondono, rispettivamente, alle righe e alle

colonne da selezionare per estrarre la sottomatrice.

Esempi.

• Per estrarre la sottomatrice di testa di ordine 2 di A → A([1 2],[1 2]) o A(1:2,1:2)

• Per estrarre una sottomatrice costituita dalle prime tre colonne di A ma contenente tutte le righe →A(1:m,1:3) o A(:,1:3).

• Per rappresentare solo la riga i-esima di A → A(i,1:n) o A(i,:)

• B = A([2 2 2 5],:) costruisce una matrice B di 4 righe e n colonne avente le prime tre righe tutte

uguali alla seconda riga di A e la quarta riga uguale alla quinta di A.

31

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Un tipo di notazione analogo vale per i vettori.

Sia v un vettore (riga o colonna, indifferentemente) di n elementi.

Esempi.

• w = v(1:5) crea un vettore w di cinque elementi uguali ai primi 5 elementi di v.

• z = v(n-4:n) crea un vettore z i cui elementi saranno gli ultimi 5 elementi di v.

Se v e un vettore riga (colonna), anche w e z saranno vettori riga (colonna).

32

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Operazioni su array - Operatori algebrici

E possibile effettuare in modo trasparente tutte le usuali operazioni elementari ben definite tra matrici,

vettori e scalari:

• prodotto righe per colonne;

• prodotto di uno scalare per un array;

• somma di array.

Sia ◦ un qualunque operatore binario per il quale l’operazione A ◦ B fra due array A e B e definita.

La sintassi per effettuare l’operazione in Matlab e semplicemente

> > A ◦ B

Esempi

A*B Se il numero di colonne di A e uguale al numero di righe di B, fornisce il prodotto righe per

colonne C = AB;come caso particolare, si osservi che se x e y sono due vettori colonna, x’*yfornisce il prodotto scalare xTy.

33

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

a*B,B*a Se a e uno scalare e B un array di qualsiasi dimensione, fornisce l’array C avente le stesse

dimensioni di B e ottenuto moltiplicando ogni elemento di B per a: cij = a · bij.Un discorso

analogo vale per l’operazione B/a.

A^m Se A e una matrice quadrata e m un intero, fornisce il prodotto righe per colonne di A per se

stessa m volte.

A±B Se A e B sono due array della stessa dimensione, fornisce la loro somma/differenza A± B.

a±B,B±a Se a e uno scalare e B un array di qualsiasi dimensione, fornisce l’array C con le stesse

dimensioni di B ottenuto sommando/sottraendo ad a ogni elemento di B: cij = a± bij.

Ogni tentativo di usare in modo inappropriato gli operatori (ad esempio, se le dimensioni degli operandi

non sono compatibili) produce un messaggio di errore.

In aggiunta agli operatori precedenti, menzioniamo l’utilissimo operatore \ (help slash).

Esercizio Studiare l’help per capirne il funzionamento.

34

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Operazioni elemento per elemento

Ognuno degli operatori +, -, *, / puo essere usato applicandolo anche “elemento per elemento” ad

array delle stesse dimensioni usando la cosiddetta sintassi del punto.

Se ◦ e uno degli operatori binari sopra citati e A e B sono due array con uguali dimensioni, con la

sintassi

> > A .◦ B

si crea un terzo array, con le stesse dimensioni di A e di B, il cui elemento di posizione ij e dato

dall’espressione

aij ◦ bij.

35

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Esempio. Se A e B contengono rispettivamente le seguenti matrici

A =„

2 34 5

«, B =

„1 00 1

«,

sono ben definite le operazioni

> > C = A*B e > > D = A.*B

C =„

2 34 5

«, D =

„2 00 5

«.

Certe operazioni (come la somma e la sottrazione) sono in realta gia applicate elemento per elemento;

l’uso della sintassi del punto e in tal caso ridondante, anche se non errato.

Esempio.

• le espressioni A.+B e A.-B hanno lo stesso significato di A+B e A-B, rispettivamente;

• se a e uno scalare e B un array di dimensioni arbitrarie, le espressioni a.+B e a.*B sono equivalenti,

rispettivamente, ad a+B e a*B.

36

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Anche l’operatore ^ puo essere applicato elemento per elemento ad un array eventualmente rettangolare

usando ancora la sintassi del punto: dati un array A di dimensioni arbitrarie e uno scalare m, con

> > A.^m

si genera una matrice con le stesse dimensioni di A il cui elemento di posizione ij e dato dall’espressione

amij .

Esempio. Sia A una variabile a cui e assegnata la matrice

A =„

1 2 34 5 6

«.

• B = A^2 → errore

• B = A.^2 →B =

„1 4 916 25 36

«.

37

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Funzioni elementari

La maggior parte delle funzioni elementari (funzioni trigonometriche, funzione esponenziale, logaritmonaturale, in base 2 e in base 10...) sono gia predefinite in Matlab (help elfun).

Caratteristica comune delle funzioni elementari e che possono essere applicate direttamente ad un array

di qualunque dimensione. Il risultato in uscita e un array con le stesse dimensioni di quello fornito in

ingresso, ottenuto applicando la funzione elemento per elemento all’array di partenza.

Esempio.

> > x = 1:10;> > y = cos(x);

y conterra un vettore riga di 10 elementi il cui elemento i-esimo sara yi = cos xi, i = 1, ..., 10.

> > x = rand(4,7);> > y = exp(x);

y conterra un array di 4 righe e 7 colonne in cui yij = exij, i = 1, ..., 4, j = 1, ..., 7.

38

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Strumenti per l’algebra lineare

Matlab ha a disposizione una notevole libreria di funzioni per effettuare molte operazioni di uso comune

su matrici (→ help matfun):

• calcolo del determinante e della traccia

• calcolo degli autovalori

• calcolo di alcune norme di vettori e matrici (norma 1, 2, ∞, Frobenius)

• calcolo del numero di condizionamento

• calcolo di alcune fattorizzazioni (PA = LU , Cholesky, QR...)

• ...

Le funzioni richiedono in ingresso uno o piu argomenti e restituiscono in uscita uno o piu argomenti.

Possono essere usate richiamandole dal prompt o inserendole in un’espressione o assegnandone il risultato

ad una variabile.

Esempio. La funzione det calcola il determinante di una matrice quadrata. Sia A una variabile attiva

in cui e memorizzata una matrice quadrata

> > det(A) > > d = det(A) > > x = det(A)ˆ2-5*det(A)+1

39

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Esempio. Il raggio spettrale ρ(A) di una matrice quadrata A di ordine n e definito come segue:

ρ(A) = max1≤i≤n

|λi(A)|.

Vogliamo calcolare ρ(A). Esistono le seguenti funzioni predefinite:

• eig: calcola gli autovalori di una matrice (eig(A)); restituisce in uscita un vettore contenente gli

autovalori;

• max: passandogli in ingresso un vettore, calcola il valore della componente massima del vettore;

• abs: passando in ingresso un array, calcola il modulo di ogni elemento; restituisce in uscita i valori

calcolati in un array con le stesse dimensioni di quello passato in ingresso.

> > x = eig(A);> > y = abs(x);> > rho = max(y);

o in modo ancora piu compatto con l’unica istruzione

> > rho = max(abs(eig(A)));

40

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Argomenti in ingresso e uscita

Una function puo prevedere piu argomenti in uscita. In una istruzione di assegnazione questi dovranno

essere racchiusi fra parentesi quadre.

Esempio. La funzione lu calcola la fattorizzazione PA = LU di una matrice A assegnata. Si ottiene

in uscita i fattori L e U e la matrice di permutazione P. La chiamata:

> > [L,U,P] = lu(A)

N.B. Molte funzioni predefinite di Matlab possono fornire risposte differenti a seconda di come

vengono richiamate dall’utente.

Esempio. La funzione eig calcola e resituisce gli autovalori... come li restituisce? Fa altro?

• e = eig(A) la variabile in uscita e sara un vettore contenente gli autovalori di A;

• [V,D] = eig(A) la variabile D sara una matrice diagonale con gli autovalori sulla diagonale, la

variabile V sara una matrice le cui colonne saranno gli autovettori.

Morale:⇒ HELP(che non e un grido di disperazione ma un aiuto fondamentale...)

41

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Costrutti sintattici - Ciclo for

Sintassi semplificata:

for variabile = inizio:incremento:fineblocco istruzioni

end

L’incremento puo essere omesso, in tal caso il valore di default e 1.

Esempio.

> > S = 0;for i = 1:100

S = S+i;end

Per interrompere forzatamente un ciclo for prima del termine, si puo usare il comando break.

Se il comando e usato all’interno di due cicli annidati, il comando interrompe il ciclo piu interno.

N.B. Il precedente e in realta un uso semplificato del ciclo for.

42

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

La sintassi corretta e

for variabile = espressioneblocco istruzioni

end

dove espressione e in generale un array. L’effetto del costrutto e di assegnare, ad ogni ripetizione del

ciclo, a variabile una delle colonne di espressione e di ripetere quindi il blocco di istruzioni tante

volte quante sono le colonne di espressione.

Le due sintassi non sono in contraddizione, la prima e un caso particolare di questa, basta ricordare

che 1:100 genera un vettore riga contenente i numeri da 1 a 100 intervallati di 1!

Esempio. Ricordando che l’istruzione 0:2:m genera un vettore riga contenente valori compresi fra 0 e

m intervallati di due unita, il seguente ciclo ripetera il blocco di istruzioni per j = 0, 2, 4, ..., m:

> > for j = 0:2:m...

end

43

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Un uso meno familiare e il seguente.

Esempio.> > S = 0;

for i = [1 15 100]S = S+i;

end

Essendo [1 15 100] un vettore riga, la variabile i assumera successivamente i valori 1, 15, 100 e quindi

il blocco di istruzioni sara ripetuto tre volte; al termine del ciclo la variabile S varra 116.

Se invece consideriamo il ciclo seguente

> > S = 0;for i = [ 1 15 100]’

S = S+i;end

questa volta l’espressione [1 15 100]’ e costituita da un vettore colonna; alla variabile i viene assegnato

quindi una sola volta il vettore colonna [1 15 100]’ e il blocco di istruzioni verra eseguito una volta;

la variabile S al termine conterra il vettore [1 15 100]’.

44

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

La logica in Matlab

Premessa: Matlab non ha variabili di tipo logico.

Matlab gestisce espressioni di tipo logico usando le variabili numeriche.

Il valore falso e rappresentato dal numero 0, mentre qualsiasi numero non nullo (generalmente 1)

rappresenta il valore vero.

E possibile effettuare confronti fra espressioni attraverso i seguenti operatori relazionali (help relop).

Simbolo Nome Descrizione

== eq uguale

∼= ne diverso

< lt minore

> gt maggiore

<= le minore o uguale

>= ge maggiore o uguale

45

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Il risultato di un confronto fra due valori e quindi a sua volta un valore numerico.

Esempio. L’espressione 1==2 ha valore 0. L’espressione 1<2 ha valore 1.

Gli operatori relazionali si applicano anche ad array con le stesse dimensioni. Il confronto viene effettuato

elemento per elemento. Il risultato sara un terzo array con le stesse dimensioni dei due su cui si e

operato il confronto, in cui ogni elemento sara dato dall’esito del confronto corrispondente.

Esempio. Assegnati i vettori x=[1 2 3] e y =[3 3 3], il risultato dell’espressione

> > x==y

non e 0, ma e il vettore [0 0 1].

Se gli operatori vengono usati fra uno scalare a ed un array B, il risultato sara un array con le stesse

dimensioni di B, contente il risultato del confronto fra a e ciascun elemento di B.

Esempio. Se x e definito come nell’esempio precedente, l’espressione

> > 2.7>x

avra valore [1 1 0].

46

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Connettivi logici

(help relop).

Simbolo Nome Descrizione

& and and

| or or

∼ not negazione

xor xor or esclusivo

• any applicato ad un vettore restituisce il valore vero se almeno uno degli elementi del vettore e uguale

a zero. Applicato ad una matrice, opera sulle colonne della matrice (ovvero effettua il confronto

colonna per colonna, restituendo un vettore riga con i corrispondenti risultati).

• all come any, ma controlla che tutti gli elementi del vettore siano uguali a zero.

47

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Costrutto if

if espressione 1

blocco 1

elseif espressione 2

blocco 2...elseif espressione n-1

blocco n-1

elseblocco n

end

I blocchi elseif possono anche non essere presenti, cosı come puo mancare anche il blocco else.

48

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Istruzione while

while espressione

blocco di istruzioni

end

Il blocco di istruzioni viene eseguito finche la condizione e vera, ovvero fintanto che l’espressione ha

valore diverso da 0.

Anche in questo caso si puo usare il comando break per interrompere forzatamente il ciclo while(quindi per uscire dal ciclo anche se espressione continua ad essere vera).

49

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

M-files

Per ora abbiamo supposto di inserire le istruzioni al prompt.

Come strutturare le istruzioni in file?

I file di istruzioni Matlab vengono chiamati generalmente m-files. Sono di due tipi: script e function.

script

Uno script e un file di testo contenente una sequenza di comandi.

L’estensione del file deve essere .m, mentre per il nome valgono le stesse regole viste per i nomi di

variabile.

Il file deve essere salvato nella directory di lavoro.

Per usare lo script e sufficiente digitare al prompt il nome del file, omettendo l’estensione .m.

N.B. Le istruzioni contenute nello script devono essere tali e quali quelle che digiteremmo al prompt.

Ogni variabile a cui si fa riferimento nello script deve essere gia attiva prima di eseguirlo.

50

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Function

La prima riga di una function ha la seguente struttura:

function [y1,y2,...,yn] = nomefunzione(x1,x2,...,xm)

y1,y2,...,yn: variabili in uscita

x1,x2,...,xm: variabili in ingresso.

E opportuno (obbligatorio, in versioni vecchie di Matlab) salvare ogni function su un file distinto,

sempre con estensione .m. Il nome della function deve coincidere con il nome dell’m-file (estensione

esclusa).

Dopo l’intestazione e utile inserire delle righe di commento (%). I commenti inseriti immediatamente

dopo l’intestazione faranno parte dell’help in linea di Matlab.

La function al suo interno puo usare anche variabili di appoggio non elencate nell’intestazione. Ogni

variabile che non compaia nell’elenco dei parametri in ingresso sara solo locale.

51

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Una function si puo usare dal prompt, all’interno di uno script o di un’altra function. Chiamata:

> > [y1,y2,...] = nomefunzione(x1,x2,...)

Alle variabili y1, y2,... verranno assegnati i valori in uscita e tali valori saranno visibili nel workspace.

I parametri in uscita possono anche essere omessi, in tutto o in parte:

>> [y1,y2] = nomefunzione(x1,x2,...);>> y1 = nomefunzione(x1,x2,...);>> nomefunzione(x1,x2,...);>> nomefunzione(x1,x2,...)

Esempio. In Matlab sono disponibili le seguenti funzioni predefinite: log(x) (logaritmo naturale),

log2(x) (logaritmo in base 2), log10(x) (logaritmo in base 10). Si vuole scrivere una function che

permetta di calcolare loga x per un qualsiasi a > 0, a 6= 1, e x > 0 sfruttando la formula

loga x =logc x

logc a

52

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

function [y,mess] = mylog(a,x)%% Uso: [y,mess] = mylog(a,x)%% Input: a (base del logaritmo)% x (argomento del logaritmo)% Output: y = log_a(x) se l’operazione e’ ben definita,% ’ERRORE’ altrimenti% mess = ’OK’ se l’operazione e’ ben definita,% ’ERRORE’ altrimenti% Se x>0 e a>0, a~=1 calcola il logaritmo in base a di x,% ne assegna il valore ad y e assegna a mess la stringa ’OK’.% Altrimenti, assegna sia a mess che a y il messaggio ’ERRORE’.%if x>0 & a>0 & a~=1

y = log(x)/log(a);mess = ’OK’;

elsey = ’ERRORE’;mess=’ERRORE’;

end

53

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Possiamo usare mylog richiamandola in uno dei seguenti modi:

> > mylog(3,27)> > y = mylog(3,27)> > [y, mess] = mylog(3,27)

E possibile definire funzioni a cui si possa fornire un numero variabile di argomenti in ingresso e/o in

uscita, comportandosi diversamente a seconda di quanti sono i valori specificati in ingresso e/o uscita

(come linspace(0,1) e linspace(0,1,25)).

nargin e una variabile locale sempre definita in ogni function. Viene posta automaticamente uguale al

numero di parametri in ingresso con cui si e effettuata la chiamata alla funzione.

nargout e una variabile locale posta uguale al numero di parametri in uscita con cui e stata richiamata

la funzione.

Se si e definita una function di nome pippo, il comando nargin(’pippo’) restituisce il numero di

argomenti dichiarati in ingresso, nargout(’pippo’) restituisce il numero di argomenti dichiarati in

uscita.

54

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Funzioni definite dall’utente

Come definire una funzione f(x) da valutare all’interno di espressioni?

Esempio. f(x) = x3 − log x

inline Definizione:

f = inline(’x.^3-log(x)’)Uso:

> > f(7), > > y=f(7)

eval Definizione:

f = ’x.^3-log(x)’Uso:

> > x = 7; eval(f)

feval Definizione: la funzione f viene definita in una function di nome funz.m:

function [y] = funz(x)y = x.^3 - log(x);

Uso: tramite il comando feval> > y = feval(’funz’,4)

55

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

function come argomento in ingresso

Come passare una function come argomento in ingresso ad un’altra function?

Esempio. Si vuole scrivere una function di nome integra che approssimi con una formula di quadratura

l’integrale definito di una funzione f su un intervallo [a, b], passando in ingresso a, b, f .

1. Definiamo la funzione f in una function funz.m.

2. Definiamo la function integra mettendo tra gli argomenti in ingresso un parametro formale

(nomefunzione):

function [I] = integra(a,b,nomefunzione)

3. Nel corpo di integra, useremo il comando feval per valutare nomefunzione in corrispondenza di

un valore assegnato:

feval(nomefunzione,a)

4. Per richiamare la funzione integra passando come argomento in ingresso funz, useremo una delle

sintassi seguenti:

> > integra(0,2,’funz’)> > integra(0,2,@funz)

56

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Grafica

Matlab e uno strumento versatile per tracciare molti tipi di grafici differenti (curve in 2D, curve in 3D,

superfici in 3D, curve di livello, grafici di tipo statistico...).

figure Apre una nuova finestra.

hold on Permette di tracciare due grafici sovrapposti sulla stessa figura (hold off annulla).

plot Se y e un vettore, plot(y) traccia in un grafico i punti di coordinate (i, yi), unendoli con una

linea “spezzata”.

Se abbiamo anche a disposizione il vettore x delle ascisse xi corrispondenti, plot(x,y) traccia i

punti (xi, yi) uniti con una spezzata.

plot(x,y,s) sceglie il colore, tipo di riga, indicatore... ttraverso la stringa s (es.

plot(x,y,’r:o’)).plot(x1,y1,s1,x2,y2,s2,...) traccia piu grafici nella stessa finestra.

subplot Permette di tracciare piu grafici in aree separate di una sola finestra.

loglog,semilogx,semilogy Come plot, ma usano scale (semi-)logaritmiche.

ezplot Si passa in ingresso l’espressione della funzione di cui si vuol tracciare il grafico sotto forma di

stringa:

ezplot(’log(x)’)ezplot(’log(x)’,[2 4]) specifica l’intervallo di variabilita della x (default: (−2π, 2π)).

57

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

plot3 Traccia curve: se x, y, z sono tre vettori della stessa lunghezza, plot3(x,y,z) traccia il grafico

ottenuto congiungendo i punti (xi, yi, zi).

ezplot3 Versione facilitata di plot3: si passano in ingresso le equazioni parametriche

(x(t), y(t), z(t)) della curva, es. ezplot3(’cos(t)’,’sin(t)’,’t’). Il dominio di default e

t ∈ [0, 2π] e puo essere cambiato.

ezmesh, ezsurf Tracciano superfici in 3D passando in ingresso una stringa che contiene una funzione

in due variabili.

mesh, surf Tracciano superfici note per punti.

xlabel, ylabel, title, legend... vasta gamma di possibilita di intervento per migliorare l’aspetto

delle figure.

58

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Input & Output

• input permette di immettere un valore da tastiera assegnandolo ad una variabile:

> > var = input(’Messaggio da mostrare sul display’);

• disp mostra l’argomento (una variabile o una stringa) sul display

> > disp(argomento)

La funzione richiede un solo argomento in ingresso.

• sprintf consente di produrre output formattato attraverso una stringa di formattazione. Gli

specificatori di formato sono gli stessi del linguaggio C per le funzioni printf e scanf.

Esempio.

>> k = 3;>> s = sprintf(’Variabili:\tk=%d,\tpi=%.2f,\teps=%E\n’,k,pi,eps);>> disp(s)Variabili: k=3, pi=3.14, eps=2.220446E-16

• fopen, fclose, fprintf, fscanf: aprono e chiudono file, scrivono e leggono dati formattati su e

da file.

59

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Flops e tempi di calcolo

Per misurare il tempo necessario ad eseguire un certo blocco di istruzioni:

tic;blocco di istruzioni

toc;

tic;blocco di istruzioni

t = toc;

Nelle versioni di Matlab precedenti alla 6 era possibile usare anche il comando flops, che contava le

operazioni floating point effettuate.

60

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

Le strutture

E possibile raggruppare variabili di tipo diverso in un unico oggetto detto struttura.

Esempio.

>> parametri.delta_x = 0.01;>> parametri.delta_t = 0.001;>> parametri.c1 = 3.4;>> parametri.alpha = 1;>> parametri.choice = ’test number 1’;

Il nome della struttura e parametri.

Si accede ai vari campi con l’operatore punto esattamente come per l’assegnazione:

>> parametri.alpha

ans =

1

61

Dipartimento di Matematica - Politecnico di Torino Calcolo Numerico - Introduzione a MATLAB

E possibile creare vettori di strutture.

>> parametri(1).alpha = 2;>> parametri(1).delta_x = 0.01;>> parametri(2).c1 = 0.5;

Il contenuto del secondo elemento del vettore parametri sara:

>> parametri(2)

ans =

alpha: []delta_x: []

c1: 0.5

I campi non assegnati ma presenti nella struttura vengono visualizzati come matrici vuote ([]).

62