Sei sulla pagina 1di 14

Indice

Linguaggio Matlab 1

Interfaccia grafica 1

Assegnazione di scalari 2

Istruzione format 3

Assegnazione di vettori e matrici 3

Operazioni su matrici e vettori 5

Funzioni matematiche elementari 8

Funzioni per la gestione di matrici 9

Grafici 11

Linguaggio Matlab
Matlab è un software per il calcolo numerico che fornisce un ambiente per varie applica-
zioni scientifiche ed ingegneristiche. Matlab è un software commerciale a pagamento, e si
possono reperire maggiori informazioni all’indirizzo http://www.mathworks.it. Un’alternativa
open–source è GNU Octave, che è gratuitamente scaricabile all’indirizzo http://www.gnu.org/
software/octave. Il linguaggio di base è essenzialmente identico.
Interfaccia grafica
Vi sono 4 ambienti:

• workspace: riassume le variabili istanziate, il tipo e la dimensione;


• current directory: è la cartella nella quale si sta lavorando;

• command history: cronologia dei comandi eseguiti;


• command window: interfaccia nella quale vengono inseriti i comandi. Il sistema è in
attesa quando compare il simbolo >>.
Laboratorio I INDICE

Assegnazione di scalari
Matlab è l’acronimo di Matrix laboratory, e dunque la sua filosofia è quella di rappresentare
tutti gli oggetti numerici come matrici: uno scalare sarà una matrice 1 × 1. Questo è conveniente
perché il linguaggio Matlab, oltre ad essere interpretato, è anche debolmente tipizzato (weakly
typed), ossia la variabile è un contenitore generico.
Per definire una variabile, basta scrivere:
>> a = 2 . 4 5
a =
2.45

Al nostro input a = 2.45, il sistema risponde con la rappresentazione della stessa. Nell’asse-
gnazione, se necessario, viene effettuato un arrotondamento del numero inserito, o meglio viene
assegnato il numero floating–point più vicino. Parleremo di questo più avanti.
Per sopprimere la risposta, basta far seguire il comando da punto e virgola:
>> a = 2 . 4 5 ;
>>

In generale i comandi vengono distinti dal ritorno a capo, dal punto e virgola o dalla virgola
semplice. L’unica differenza è che il punto e virgola sopprime l’output:
>> a = 2 . 4 5 , b = 3 . 1 ; A = 1 . 2
a =
2.45
A =
1.2

Nell’esempio osserviamo anche che Matlab è case–sensitive, ossia distingue maiuscole e minu-
scole: questo è standard su sistemi POSIX come UNIX, ma non per Windows; questo a volte può
essere fonte di errore, perché su quest’ultimo sistema operativo i nomi dei file non distinguono
maiuscole e minuscole, mentre Matlab sı̀, con il risultato di situazioni anomale con gli script.
Se viene eseguito un comando senza assegnare il risultato a nulla, viene definita automaticamente
la variabile ans che conterrà il risultato:
>> 2 . 4 5 ;
>> whos
Name Size Bytes Class Attributes
ans 1 x1 8 double

Vi sono delle variabili predefinite, quali pi, ossia π, oppure 1i, cioè l’unità immaginaria i. Per
quest’ultima Matlab accetta anche la semplice i, oppure j, ma sono sconsigliate in quando non
hanno precedenza su delle variabili con lo stesso nome:
>> a = 5 + 2∗ i
a =
5.0000 + 2.0000 i
>> i = 2 ;
>> b = 5 + 2∗ i
b =
9
>> c = 5 + 2∗1 i
c =
5.0000 + 2.0000 i

Per sapere quali sono le variabili attualmente in memoria si esegue

–2–
Laboratorio I INDICE

>> who
Your v a r i a b l e s a r e :
A a

mentre per una lista più dettagliata, simile al workspace


>> whos
Name Size Bytes Class Attributes
A 1 x1 8 double
a 1 x1 8 double

Si può eliminare una variabile con il comando clear <nome-var> :


>> c l e a r A

oppure tutte le variabili digitando semplicemente clear. Inoltre si può pulire la command window
con clc oppure home. Infine, per conoscere informazioni su un dato comando o funzione, vi sono
le istruzioni help <comando> e doc <comando> :
>> help c l c
CLC C l e a r command window .
CLC c l e a r s t h e command window and homes t h e c u r s o r .

See a l s o HOME.

R e f e r e n c e page i n Help b r o w s e r
doc c l c

Riassumendo:

clear → Cancella tutte le variabili


clear <var> → Cancella la variabile var
clc → Pulisce tutte le istruzioni a schermo e blocca la barra di scorrimento
home → Pulisce tutte le istruzioni a schermo
help <comando> → Fornisce le funzionalità e le modalità d’uso di comando
who → Elenca tutte le variabili in memoria
whos → Elenca le variabili, il loro tipo e la dimensione di memoria occupata

Istruzione format
Il formato di visualizzazione dei risultati, ma NON la precisione con la quale sono eseguiti i
calcoli, può essere cambiato utilizzando il comando format <tipo> . Ad esempio, se dopo aver
cambiato il formato, digitiamo la frazione 1/7 si ottiene:

format rat → ans = 1/7


format short → ans = 0.1429
format short e → ans = 1.4286e-01
format short g → ans = 0.14286
format long → ans = 0.142857142857143
format long e → ans = 1.428571428571428e-01
format long g → ans = 0.142857142857143

Assegnazione di vettori e matrici


Vi sono diversi modi per creare dei vettori. Il più diretto è il seguente:
>> b = [ 1 5 6 2 ] ;
>> c = [ 1 , 5 , 6 , 2 ] ;

–3–
Laboratorio I INDICE

I due vettori b e c saranno identici, infatti la virgola nel secondo caso è opzionale; a volte però
è utile per evitare confusione. La dimensione è 1 × 4 per entrambi, cioè 1 riga e 4 colonne. Se si
vuole creare un vettore colonna, basta usare il punto e virgola (questa volta obbligatorio):
>> d = [ 1 ; 5; 6; 2 ] ;
>> whos
Name Size Bytes Class Attributes
b 1 x4 32 double
c 1 x4 32 double
d 4 x1 32 double

Osserviamo che ognuno occupa 32 bytes = 4 · 8 bytes, dove 8 bytes = 64 bit è la dimensione di
un numero in virgola mobile a doppia precisione.
Per definire un vettore dati gli estremi e l’incremento, la notazione è:
< i n i z i o > : <i n c r e m e n t o > : <f i n e >

Se l’incremento è omesso, si assume pari ad uno. Ad esempio:


>> 1 : 8
ans =
1 2 3 4 5 6 7 8
>> 1 : 2 : 8
ans =
1 3 5 7
>> 0 . 5 : − 0 . 1 : 0
ans =
0.5000 0.4000 0.3000 0.2000 0.1000 0

L’ultimo caso è da evitare, perché l’accumulazione degli errori nelle somme, dovuto all’arro-
tondamento, può precludere la corretta chiusura del vettore (l’ultimo elemento non sarà quello
richiesto). A questo scopo è molto più sicuro utilizzare linspace:
>> linspace ( 0 , 1 , 5 )
ans =
0 0.2500 0.5000 0.7500 1.0000

Quanto visto si estende facilmente alle matrici:


>> A = [ 1 2 3 4 ; 5 6 7 8 ; 9 10 11 1 2 ; 13 14 15 16 ]
A =
1 5 9 13
2 6 10 14
3 7 11 15
4 8 12 16

viene cosı̀ creata una matrice 4 × 4. Per creare matrici più complesse si possono utilizzare com-
binazioni dei metodi visti fino ad ora, insieme ad altri comandi come reshape, che ridimensiona
la matrice:
>> reshape (A, 2 , 8 )
ans =
1 3 5 7 9 11 13 15
2 4 6 8 10 12 14 16

È inoltre possibile definire matrici a blocchi, tenendo conto però delle corrette dimensioni:
>> B = [ 1 : 3 0 ; 4 : − 1 : 1 ]
B =
1 2 3 0
4 3 2 1

–4–
Laboratorio I INDICE

Vi sono infine delle funzioni che creano matrici con una struttura particolare:

zeros(n, m) → Matrice n×m riempita con 0


ones(n, m) → Matrice n×m riempita con 1
rand(n, m) → Matrice n×m riempita con numeri casuali in [0, 1]
eye(n, m) → Matrice n×m riempita con 1 nei termini i = j

Di tutti questi esiste la versione con un solo argomento, dove si sottointende n = m: ad esempio
ones(4) crea una matrice 4 × 4 con tutti 1.

Esercizio 1.1

Utilizzando i comandi visti, come zeros, eye e ones, per un dato numero n, si crei la matrice
2n × 2n seguente:
n n
 
1 1 ··· 1 0 0 ··· 0
1 ··· 0 ···
 
 1 1 0 0 
n  .. .. .. .. .. .. 
. . . . . .
 
 
 

 1 1 ··· 1 0 0 ··· 0 

 
1 0 ··· 0 1 2 ··· n
 
 
0 1 ··· 0 n n ··· n
 
 
n  .... . . .. .. .. .. 

 . . . . . . .


0 0 ··· 1 n n ··· n

Operazioni su matrici e vettori


La manipolazione delle matrici (e dunque vettori e scalari), può avvenire in molti modi differenti.
La più semplice operazione è l’accesso ad un elemento:
>> v = linspace ( 0 , 1 , 5 ) ;
>> v ( 2 )
ans =
0.2500

L’operazione ( ) è molto potente, perché permette di ottenere slices (“fette”):


>> v ( [ 1 3 5 ] )
ans =
0 0.5000 1.0000
>> v ( 1 : 3 )
ans =
0 0.2500 0.5000
>> v ( 2 : end )
ans =
0.2500 0.5000 0.7500 1.0000
>> v ( [ 1 2 ; 3 2])
ans =
0 0.2500
0.5000 0.2500

–5–
Laboratorio I INDICE

Quello che si mette tra parentesi tonde, sia esso un numero intero, o un vettore o matrice di
interi, viene interpretato come un insieme di indici. Il risultato sarà una matrice della stessa
dimensione della matrice indice, con valori che corrisponderanno a quello cui il singolo indice
punta. Ad esempio, se gli indici sono [1 3 5], il risultato sarà [v(1) v(3) v(5)].
Un discorso analogo vale per l’accesso alle matrici. Vi sono due modalità : nella prima, dove si
utilizza la notazione (i,j):
>> A = [ 1 2 3 ; 4 5 6 ; 7 8 9 ]
A =
1 2 3
4 5 6
7 8 9
>> A( 1 , 1 )
ans =
1
>> A( 1 : 3 , 1 : 2 )
ans =
1 2
4 5
7 8
>> A( 1 : end− 1 , 2 :end )
ans =
2 3
5 6
>> A( [ 1 2 ] , [ 2 3 ] )
ans =
2 3
5 6

Nell’ultimo caso viene estratta la prima e la seconda riga, ed incrociate con la seconda e terza
colonna. La seconda modalità consiste nel considerare la numerazione naturale di una matrice
per colonne (column–wise): partendo in alto a sinistra, si scende verso il basso, e una volta
arrivati in fondo si risale nella colonna subito a destra.
>> A( 1 : end )
ans =
1 4 7 2 5 8 3 6 9
>> A( [ 2 3 ; 9 6 ] )
ans =
4 7
9 8

L’operazione A(:) è come A(1:end), ma restituisce un vettore colonna (è come se mettesse le
colonne della matrice una sotto l’altra).
Veniamo ora alle operazioni algebriche tra matrici. Le regole di base sono, per due matrici
A ∈ Cn×m e B ∈ Cp×q :

• la somma è definita se e solo se n = p e m = q, e A + B ∈ Cn×m ;


• il prodotto è definito se e solo se m = p, e AB ∈ Cn×q ;
• il trasposto AT ∈ Cm×n , con (AT )ij = Aji ;

• il trasposto coniugato AH ∈ Cm×n , con (AH )ij = Aji .

Le ultime due operazioni si ottengono rispettivamente in questo modo:

–6–
Laboratorio I INDICE

>> A = [ 1+1 i , 3 ; 1 , 1−2 i ] ;


>> A. ’
ans =
1.0000 + 1.0000 i 1.0000
3.0000 1.0000 − 2.0000 i
>> A’
ans =
1.0000 − 1.0000 i 1.0000
3.0000 1.0000 + 2.0000 i

Se la matrice è reale le due operazioni coincidono: infatti quasi sempre si trova indicato ’ come
il trasposto di una matrice.
>> a = [ 1 2 5 ] ;
>> b = [ 4 6 4 ] ;
>> H = [ 1 2 3 ; 2 4 7 ; 1 4 3 ] ;
>> G = [ 4 6 2 ; 8 4 1 ; 3 2 9 ] ;
>> a + b
ans =
5 8 9
>> a − b
ans =
−3 −4 1
>> H + G
ans =
5 8 5
10 8 8
4 6 12
>> H ∗ G
ans =
29 20 31
61 42 71
45 28 33
>> G ∗ a
Error using ∗
I n n e r m a t r i x d i m e n s i o n s must a g r e e .

Questo è l’errore più comune, infatti il vettore a è 1 × 3, mentre H è 3 × 3, quindi non va bene.
>> G ∗ a ’
ans =
26
21
52
>> a ∗ G
ans =
35 24 49
>> 2 ∗ a
ans =
2 4 10
>> a ’ ∗ b
ans =
4 6 4
8 12 8
20 30 20
>> a ∗ b ’
ans =
36
>> Hˆ2
ans =
8 22 26
17 48 55
12 30 40

–7–
Laboratorio I INDICE

>> a ˆ2
Error using ˆ
I n p u t s must be a s c a l a r and a s q u a r e m a t r i x .
To compute e l e m e n t w i s e POWER, u s e POWER ( . ˆ ) i n s t e a d .

L’ultimo messaggio ci dice che l’elevamento a potenza è inteso nel senso di prodotto di matrici,
e dunque è definito solo per matrici quadrate. Ci viene suggerito anche di usare la versione con
il punto. Infatti, le operazioni binarie scalari di prodotto, divisione ed elevamento a potenza,
diventano operazioni elemento per elemento per vettori e matrici nel momento in cui si pone un
punto davanti al simbolo dell’operazione:
>> a . ∗ b
ans =
4 12 20
>> a . / b
ans =
0.2500 0.3333 1.2500
>> a . ˆ 2
ans =
1 4 25
>> a . ˆ b
ans =
1 64 625

L’unica accortezza, in questo caso, è che i due operandi siano della stessa dimensione, o che
almeno uno dei due sia scalare (nel qual caso viene ripetuto).

Esercizio 1.2

Dato un numero n, utilizzare l’operatore : e il comando ones per costruire un vettore colonna
c e uno riga r tali per cui il loro prodotto matriciale c * r definisca la seguente matrice n × n:
 
1 1 ··· 1
 
 2 2 ··· 2 

 .. .. .. 

 . . . 
n n ··· n

Funzioni matematiche elementari


Un punto di forza di Matlab è l’enorme quantità di funzioni matematiche (elementari e non)
utilizzabili. Se non specificato altrimenti, quasi tutte queste funzioni si applicano elemento per
elemento: data una matrice A, exp(A) non è la matrice esponenziale (che invece si calcola con
expm(A)), bensı̀ la matrice i cui elementi sono gli esponenziali degli originali. Eccone alcune:

–8–
Laboratorio I INDICE

abs(A) → Valore assoluto degli elementi di A


sqrt(A) → Radice quadrata degli elementi di A
exp(A) → Funzione esponenziale degli elementi di A
log(A) → Logaritmo naturale degli elementi di A
log10(A) → Logaritmo in base 10 degli elementi di A
log2(A) → Lograritmo in base 2 degli elementi di A
sin(A) → Seno degli elementi di A
cos(A) → Coseno degli elementi di A
tan(A) → Tangente degli elementi di A
asin(A) → Arcoseno degli elementi di A (in radianti)
acos(A) → Arcocoseno degli elementi di A (in radianti)
atan(A) → Arcocotangente degli elementi di A (in radianti)
sinh(A) → Seno iperbolico degli elementi di A
cosh(A) → Coseno iperbolico degli elementi di A
tanh(A) → Tangente iperbolica degli elementi di A

Esercizio 1.3
e5 + sin(π)
Si calcolino p ed elog10 50 + eln 30 + elog2 40 .
log2 30 − 10

  x = [1, 3, 4] edy = [1, 1, 2] e si calcolino 2xi log2 (|yi | + 1) − yi log10 (xi + 2) e


Si definiscano
xi
− sin2 xi 3 |yi |2 .
p
arctan
yi

Funzioni per la gestione di matrici


Siano A, B due matrici e b un vettore.

–9–
Laboratorio I INDICE

size(A) → Restituisce un vettore di due elementi, il primo è il numero di righe


di A, il secondo il numero di colonne;
size(A, 1) → Restituisce il primo elemento di size(A), ossia il numero di righe;
size(A, 2) → Restituisce il secondo elemento di size(A), ossia il numero di
colonne;
length(b) → Restituisce il numero di elementi del vettore b;
max(b) → Restituisce il più grande elemento del vettore b;
min(b) → Restituisce il più piccolo elemento del vettore b;
max(A) → Restituisce un vettore riga contenente il più grande elemento di ogni
colonna di A;
min(A) → Restituisce un vettore riga contenente il più piccolo elemento di ogni
colonna di A;
max(A,B) → Restituisce una matrice delle stessi dimensioni di A e B contenente
il massimo elemento per elemento;
min(A,B) → Restituisce una matrice delle stessi dimensioni di A e B contenente
il minimo elemento per elemento;
max(A,[],2) → Restituisce un vettore colonna contenente il più grande elemento di
ogni riga di A. Se al posto del 2 c’è 1 si ha semplicemente max(A);
min(A,[],2) → Restituisce un vettore colonna contenente il più piccolo elemento di
ogni riga di A. Se al posto del 2 c’è 1 si ha semplicemente max(A);
sum(b) → Restituisce uno scalare pari alla somma degli elementi del vettore
b;
sum(A) → Restituisce un vettore riga i cui elementi sono la somma per colonne
degli elementi della matrice A;
sum(A,2) → Restituisce un vettore colonna i cui elementi sono la somma per
righe degli elementi della matrice A;
diag(A) → Restituisce il vettore della diagonale della matrice A;
diag(A,k) → Restituisce il vettore della k–esima sopradiagonale della matrice A;
diag(A,-k) → Restituisce il vettore della k–esima sottodiagonale della matrice A;
diag(b) → Restituisce una matrice sulla cui diagonale ci sono gli elementi del
vettore b;
diag(b,k) → Restituisce una matrice sulla cui k–esima sopradiagonale ci sono gli
elementi del vettore b;
diag(b,-k) → Restituisce una matrice sulla cui k–esima sottodiagonale ci sono gli
elementi del vettore b;
tril(A) → Restituisce la parte triangolare inferiore (lower ) della matrice A,
ossia annulla tutti i termini strettamente sopra la diagonale (anche
nel caso rettangolare);
triu(A) → Restituisce la parte triangolare superiore (upper ) della matrice A,
ossia annulla tutti i termini strettamente sotto la diagonale (anche
nel caso rettangolare);

Vi sono moltissime altre funzioni importanti, quali det, che restituisce il determinante di una
matrice quadrata, trace, che restituisce la traccia, norm per calcolare le norme, e via discorrendo.
Man mano che serviranno introdurremo queste funzioni.

– 10 –
Laboratorio I INDICE

Esercizio 1.4

Dato uno scalare positivo n, sia A = magic(n).


Sommare per righe, per colonne. Sommare inoltre gli elementi della diagonale. Cosa si osserva?

Grafici
Per disegnare il grafico di una funzione reale di variabile reale si utilizza il comando plot. Nella
sua versione di base, la sintassi prevede che siano dati in ingresso due vettori x ed y della stessa
dimensione, che indicano la posizione dei punti.
>> x = linspace ( −1 , 1 , 1 0 0 ) ;
>> y = x . ˆ 2 ;
>> plot ( x , y ) ;

0.9

0.8

0.7

0.6

0.5

0.4

0.3

0.2

0.1

0
−1 −0.8 −0.6 −0.4 −0.2 0 0.2 0.4 0.6 0.8 1

Per controllare stile, dimensione, colore del tratto, vi sono numerose opzioni, che tipicamente
sono inserite subito dopo l’ultimo argomento, in questo modo:
>> x = linspace ( −1 , 1 , 2 0 ) ;
>> plot ( x , y , ’r * - - ’ , ’ LineWidth ’ , 2 . 0 , ’ MarkerSize ’ , 1 5 . 0 ) ;
>> grid on ;
>> xlabel ( ’ Ascissa ’ ) ;
>> ylabel ( ’ Ordinata ’ ) ;
>> t i t l e ( ’ Una parabola ’ , ’ FontWeight ’ , ’ bold ’ ) ;

– 11 –
Laboratorio I INDICE

Una Parabola
1

0.9

0.8

0.7

0.6
Ordinata

0.5

0.4

0.3

0.2

0.1

0
−1 −0.8 −0.6 −0.4 −0.2 0 0.2 0.4 0.6 0.8 1
Ascissa

Digitando help plot o doc plot si avrà una panoramica di tutte le possibili combinazioni per
lo stile. Il più utilizzato è il terzo argomento, ossia la stringa r*--: tradotto risulta r = red, cioè
tratto di linea rosso, *, cioè markers a forma di asterisco, e --, ossia linea a tratti. L’ordine è
fissato, ma ognuno è facoltativo: scrivendo semplicemente y si ha una linea gialla (yellow ).
Per sovrapporre dei grafici, si può procedere in diversi modi:
>> x = linspace ( −1 , 1 , 2 0 ) ;
>> parab = x . ˆ 2 ;
>> cubic = x . ˆ 3 ;
>> plot ( x , parab , x , c u b i c ) ;

oppure:
>> plot ( x , [ parab ; c u b i c ] ) ;

oppure:
>> plot ( x , parab ) ;
>> hold a l l ;
>> plot ( x , c u b i c ) ;
>> hold o f f ;

Si può aggiungere una legenda con il comando:


>> legend ( ’ Parabola ’ , ’ Cubica ’ ) ;

– 12 –
Laboratorio I INDICE

1
parab
0.8 cubic

0.6

0.4

0.2

−0.2

−0.4

−0.6

−0.8

−1
−1 −0.8 −0.6 −0.4 −0.2 0 0.2 0.4 0.6 0.8 1

Esercizio 1.5

Disegnare il grafco della funzione f (x) = 2 + (x − 3) sin 5(x − 3) , per 0 ≤ x ≤ 6. Sovrapporre
a questo grafico, in linea a tratti, le rette che delimitano tale funzione.

Un altro tipo di grafico molto importante, in particolare quando si deve valutare l’andamento
dell’errore rispetto a dei parametri, è quello in scala logaritmica o semilogaritmica. Per una data
funzione f (x), con grafico y = f (x):

• semilogx rappresenta i punti dopo il cambio di variabile x 7→ log x;

• semilogy rappresenta i punti dopo il cambio di variabile y 7→ log y;


• loglog effettua entrambi i precedenti cambi di variabile.

Ad esempio, il grafico y = eαx , in scala y–logaritmica diventa ỹ := log y = αx, ossia una retta.
>> x = linspace ( 1 , 1 0 , 1 0 0 ) ;
>> semilogy ( x , exp ( x ) , x , exp ( 2 ∗ x ) , ’ LineWidth ’ , 2 . 0 ) ;
>> grid on ;
>> legend ( ’ Pendenza 1 ’ , ’ Pendenza 2 ’ , ’ Location ’ , ’ NorthWest ’ ) ;

– 13 –
Laboratorio I INDICE

10
10
Pendenza 1
Pendenza 2

8
10

6
10

4
10

2
10

0
10
1 2 3 4 5 6 7 8 9 10

Esercizio 1.6

Sia f (x) = (log x)2 per 0.01 ≤ x ≤ 10. Cosa ci si aspetta dal grafico in scala x–logaritmica?
Disegnare e verificare.

– 14 –