Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
c
°2007–2011 - Questo testo (compresi i quesiti ed il loro svolgimento) è coperto da diritto d’autore. Non può essere sfruttato a fini
commerciali o di pubblicazione editoriale. Non possono essere ricavati lavori derivati. Ogni abuso sarà punito a termine di legge dal
titolare del diritto.
This text is licensed to the public under the Creative Commons Attribution-NonCommercial-NoDerivs2.5 License
(http://creativecommons.org/licenses/by-nc-nd/2.5/)
Matlabr è un software numerico per il calcolo che fornisce un ambiente per varie applicazioni
scientifiche e ingegneristiche; maggiori informazioni possono essere reperite all’indirizzo web
www.mathworks.com
Prima di passare all’introduzione di alcuni comandi elementari, ricordiamo che per chiarimenti
circa l’uso di una funzione è possibile utilizzare il comando help, digitando help nome comando.
1
>> a = 1.2;
>> a = 1.7; a = 2.45
a =
2.45
Le variabili possono essere cancellate utilizzando il comando clear. Possiamo ad esempio
cancellare la variabile A digitando:
>> clear A
Digitando il comando:
>> clear
vengono cancellate tutte le variabili definite dall’utente. Per sapere quali sono le variabili
dell’utente attualmente in memoria si utilizza il comando:
>> who
Your variables are:
a
Per sapere quali sono le variabili in memoria definite dall’utente è anche possibile utilizzare il
comando whos. Quest’ultimo, a differenza di who, mostra anche la dimensione, l’occupazione
di memoria in numero di bytes e il tipo della variabile.
>> eps
eps =
2.2204e-16
>> 1 + eps / 2 - 1
ans =
0
2
Istruzione format. Serve per modificare il formato di visualizzazione dei risultati ma NON
la precisione con cui i calcoli vengono condotti. Il comando ha la seguente sintassi: format
type, dove type può ad esempio assumere i valori: short per visualizzare in formato decimale
fisso a 5 cifre e long a 15 cifre, short e per visualizzare in formato floating point a 5 cifre e
long e a 15 cifre.
>> a = 0.12345678;
>> format short
>> a
a =
0.1234
>> format short e
>> a
a =
1.2345e-1
Il comando format, senza ulteriori specifiche, seleziona automaticamente il formato più con-
veniente per la classe delle variabili in uso.
• Vettori riga:
>> b = [ 1 2 3 4 ]
b =
1 2 3 4
>> b1 = [ 1, 2, 3, 4 ]
b1 =
1 2 3 4
>> b2 = [ 1 : 1 : 4 ]
b2 =
1 2 3 4
>> b3 = [ 1 : 4 ]
b3 =
1 2 3 4
>> d = [ 1 : 0.1 : 2 ]
d =
1 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2
>> c = [ 0 : -0.3 : -1 ]
c =
0 - 0.3 - 0.6 - 0.9
Si può utilizzare anche il comando linspace per definire un vettore riga di elementi
equispaziati. Al comando devono essere forniti come parametri di ingresso i due estremi
dell’intervallo e il numero di elementi del vettore. Nell’esempio il vettore e è costituito
da 6 elementi equispaziati nell’intervallo [0, 5]:
>> e = linspace( 0, 5, 6)
3
e =
0 1 2 3 5 6
• Vettori colonna:
>> f = [ 1; 2; 3; 4 ]
f =
1
2
3
4
Combinando i comandi visti per definire i vettori riga e colonna si ottengono immedia-
tamente le istruzioni per definire le matrici, per esempio:
>> h = [ 1 2 3 ; 2 4 7 ; 1 4 3 ]
h =
1 2 3
2 4 7
1 4 3
• Trasposizione:
>> a = [ 1 : 4 ]
a =
1 2 3 4
>> b = a’
b =
1
2
3
4
>> c = [ 2 5 4 1 ]
c =
2 5 4 1
>> a + c
ans =
3 7 7 5
>> a - c
ans =
4
- 1 - 3 - 1 3
>> d = [ 1 2 3 ]
d =
1 2 3
>> a + d
??? Error using ==> plus
Matrix dimensions must agree
>> c = c’
c =
2
5
4
1
>> a - c
??? Error using ==> minus
Matrix dimensions must agree
• Somma e sottrazione elemento per elemento: Bisogna fare molta attenzione, perché in
Matlabr sono definite anche delle operazioni particolari che agiscono sulle matrici (e
sui vettori) elemento per elemento. Si può sommare uno scalare ad una matrice e la
matrice risultante ha le stesse dimensioni della matrice di partenza e i suoi elementi
sono tutti ottenuti sommando il valore dello scalare agli elementi della matrice iniziale.
>> f = [ 1 2 3 ; 2 4 6 ; 3 6 9 ]
f =
1 2 3
2 4 6
3 6 9
>> f + 3
ans =
4 5 6
5 7 9
6 9 12
• Prodotto:
◦ prodotto (righe per colonne) vettore riga - vettore colonna (della stessa lunghezza):
>> a * b
ans =
30
◦ prodotto vettore colonna per vettore riga (della stessa lunghezza):
>> b * a
ans =
1 2 3 4
2 4 6 8
3 6 9 12
4 8 12 16
5
◦ prodotto elemento per elemento (attenzione alla compatibilità, in questo caso i due
oggetti devono avere le stesse dimensioni!):
>> b .* c
ans =
2
10
12
4
>> a .* b
??? Error using ==> times
Matrix dimensions must agree
Si osservi che tutte le operazioni elemento per elemento sono contraddistinte dal “.”
che precede il simbolo dell’operazione, con l’eccezione dell’operazione di somma/sottrazione
>> a.^2
ans =
1 4 9 16
• size: fornisce la dimensione del vettore o della matrice passata in input, cioè restituisce
un vettore contenente due interi, il primo indicante il numero di righe (1 se è un vettore
riga) e il secondo indicante il numero di colonne (1 se è un vettore colonna) dell’oggetto
passato in input.
>> size( v1 )
ans =
3 1
>> size( v2 )
ans =
1 3
>> size( v1, 1 )
ans =
3
>> size( v1, 2 )
ans =
1
>> length( v1 )
ans =
6
3
>> length( v2 )
ans =
3
max, min: calcolano il massimo e il minimo valore delle componenti del vettore passato
in input.
>> max( v1 )
ans =
300
>> min( v1 )
ans =
100
• sum, prod: calcolano la somma e il prodotto degli elementi del vettore passato in input.
>> sum( v1 )
ans =
600
>> prod( v1 )
ans =
6000000
>> norm( v1 )
ans =
374.1657
>> norm( v1, 2 )
ans =
374.1657
>> norm( v1, 1 )
ans =
600
>> norm( v1, inf )
ans =
300
7
>> w = [ 1 -4 5 -9 ]
w =
1 - 4 5 - 9
>> abs( w )
ans =
1 4 5 9
• sqrt: calcola la radice quadrata degli elementi dello scalare, vettore o matrice passato
in input.
>> sqrt( 4 )
ans =
2
>> sqrt( [ 4, -1 ] )
ans =
2 i
>> exp( 1 )
ans =
2.7182
>> exp( [ 1; 0 ] )
ans =
2.7182
1.
8
>> sin( pi / 2 )
ans =
1
>> sin( [ pi / 2, 0 ] )
ans =
1 0
>> asin(1)
ans =
1.5708
>> asin( [ 1, 0.5 ] )
ans =
1.5708 0.5236
>> zeros( 1, 3 )
ans =
0 0 0
>> zeros(3,1)
ans =
0
0
0
>> zeros(3,3)
ans =
0 0 0
0 0 0
0 0 0
zeros(size(A)), dove A è una matrice, costruisce una matrice della stessa dimensione
di A con elementi tutti nulli.
>> zeros( 3 )
ans =
0 0 0
0 0 0
0 0 0
9
• Matrice di 1: ones(n,m) : costruisce una matrice n x m di elementi pari a uno.
>> ones( 1, 3 )
ans =
1 1 1
>> ones( 3, 1 )
ans =
1
1
1
>> ones( 3, 3 )
ans =
1 1 1
1 1 1
1 1 1
ones(size(A)), dove A è una matrice, costruisce una matrice della stessa dimensione
di A con elementi tutti pari a uno.
>> ones( 3 )
ans =
1 1 1
1 1 1
1 1 1
>> eye( 3 )
ans =
1 0 0
0 1 0
0 0 1
>> eye( 2, 3 )
ans =
1 0 0
0 1 0
>> eye( 3, 2 )
ans =
1 0
0 1
0 0
10
>> rand( 1, 3 )
ans =
0.2113 0.7560 0.0002
>> rand( 3, 3 )
ans =
0.8497 0.0684 0.7264
0.6857 0.5608 0.1985
0.8782 0.6624 0.5446
rand(size(A)), dove A è una matrice, costruisce una matrice della stessa dimensione
di A di numeri casuali nell’intervallo [0, 1]. Il comando rand genera un numero casuale
nell’intervallo [0, 1], diverso ogni volta che il comando viene invocato.
>> rand
ans =
0.3616
>> rand
ans =
0.2922
Errore macchina. Il calcolatore, per sua natura, deve lavorare in aritmetica non esatta
e quindi opera delle appossimazioni. Queste approssimazioni, anche se in generale vengono
trascurate, possono dare luogo a fenomeni sorprendenti. Consideriamo ad esempio la seguente
riga di codice
Questo risultato è decisamente poco accurato e l’errore commesso è del 11%! Tale fenomeno
è detto cancellazione di cifre significative. Un altro esempio molto sorprendente è il seguente
>> 0.1+0.1+0.1-0.3
ans =
5.5511e-17
Seppur molto basso il valore non è zero. Infine il seguente esempio sembra contraddire il
precedente, infatti scrivendo la seguente riga
>> 0.1+0.1-0.2
ans =
0
E in questo caso la risposta è corretta. Cosa cambia tra i due esempi? La differenza è nella
loro rappresentazione nel calcolatore.
Calcolo simbolico. Attraverso il toolbox symbolic di Matlabr possiamo calcolare ana-
liticamente la derivata e gli integrali di funzioni. Infatti attraverso le seguenti righe di codice
possiamo calcolare la derivata e l’integrale della funzione x2
11
>> syms x;
>> f = ’x^2’;
>> diff(f,x)
ans =
2*x
>> int(f,x)
ans =
1/3*x^3
a) Inserire la matrice.
◦ I modo)
>> A = [16 2 3 13; 5 11 10 8; 9 7 6 12; 4 14 15 1]
A =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
◦ II Modo)
>> A = [ 16 2 3 13
>> 5 11 10 8
>> 9 7 6 12
>> 4 14 15 1 ]
A =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
◦ III Modo) Usare il comando magic( 4 ) che costruisce la matrice magica di ordine
4.
>> A = magic( 4 )
A =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
12
>> sum( A, 1 )
ans =
34 34 34 34
◦ I Modo)
>> sum( A, 2 )
ans =
34
34
34
34
◦ II Modo)
>> A = A’
A =
16 5 9 4
2 11 7 14
3 10 6 15
13 8 12 1
>> sum( A, 1 )
ans =
34 34 34 34
Il comando A’ costruisce la matrice trasposta della matrice A. Osserviamo che il
comando sum(A) calcola la somma per colonne degli elementi della matrice A.
13
1
>> a = diag( A, 0 )
a =
16
11
6
1
Il comando diag(M,k), dove M è una matrice, costruisce un vettore colonna avente
per elementi gli elementi della diagonale k-esima di M, dove k = 0 indica la dia-
gonale principale, k > 0 indica la k-esima sopra-diagonale mentre k < 0 indica
la k-esima sotto-diagonale; se k viene omesso, si suppone k=0. Osserviamo infine
che il comando diag(v,k), dove v è un vettore, costruisce una matrice di dimen-
sione (length(v)+k)x(length(v)+k) con gli elementi di v sulla diagonale k-esima
e gli altri elementi nulli. Una volta estratta la sotto-diagonale, possiamo usare il
comando sum visto nel caso dei vettori.
>> sum( a )
ans =
34
L’operazione si può eseguire in una sola riga di comando scrivendo:
>> sum( diag( A ) )
ans =
34
14
>> ad
ad =
13 10 7 4
>> sum( ad )
ans =
34
oppure, effettuando direttamente la somma:
>> s = 0;
>> for i = 1 : n
s = s + A( i, n-i+1 );
>> end
>> s
s =
34
Al posto di eseguire i comandi direttamente da linea di comando, possiamo scriverli
su un file .m, salvarli e successivamente eseguirli; file di questo tipo sono detti M–
files. A questo scopo apriamo l’editor di Matlabr utilizzando il comando edit
o cliccando sulla prima icona in alto a sinistra (l’icona con un foglio bianco) e
riportiamo i comandi usati.
n = size( A, 1 );
for i = 1 : n
ad( i ) = A( i, n-i+1 );
end
sum( ad )
Salviamo il file modificato (di tipo M–file) cliccando sul menù file e successiva-
mente su save as, come (ad esempio) antidiag.m (l’estensione .m indica un file di
Matlabr ). Eseguiamo il file (e quindi i comandi salvati) digitando semplicemente
il nome del file, se il file si trova nella cartella in cui stiamo lavorando, oppure run
. . . /antidiag.m, dove . . . indicano il percorso dalla cartella dove stiamo lavorando
alla cartella in cui il file è salvato.
N.B.: è possibile cambiare la directory di lavoro utilizzando il comando cd (si
digiti help cd per maggiori chiarimenti) oppure utilizzando le apposite icone nella
barra dei comandi.
>> antidiag
ans =
34
N.B.: le variabili utilizzate durante l’esecuzione dell’M–file vengono assegnate
nello spazio di lavoro.
◦ III Modo) Scriviamo la funzione adiag.m che, data in input una generica matrice
M, restituisce in output il vettore v degli elementi sull’antidiagonale di M. A questo
scopo apriamo una nuova finestra nell’editor di Matlabr e scriviamo quindi la
funzione:
function ris = adiag( a )
15
% Funzione che estrae l’antidiagonale di una matrice quadrata
% Se la matrice non e’ quadrata viene mostrato un messaggio d’errore
% Input : a = matrice
% Output : ris = vettore contenente l’antidiagonale di a
ris = [];
n = size( a );
if n( 1 ) ~= n( 2 )
disp(’Errore:’);
disp(’ la matrice deve essere quadrata !’);
return
end
dim = n( 1 );
for i = 1 : dim
ris( i ) = a( i, dim-i+1 );
end
Le funzioni devono sempre cominciare con la parola function; prima del nome
della funzione, bisogna inserire, tra parentesi quadre, le variabili in output (le
parentesi quadre possono essere omesse se deve essere restituita una sola variabile).
Dopo il nome della funzione si scrivono, tra parentesi tonde, le variabili in input.
Il % indica una riga di commento, una riga cioè che non sarà eseguita; è buona
norma commentare le funzioni indicando cosa fanno e quali sono i parametri in
input ed in output ed inizializzare, all’inizio della funzione, le variabili in output.
Il comando disp scrive a video, sulla command window, la stringa passata in input;
il comando return rende il controllo al chiamante, restituendo le variabili indicate
come output. Le funzioni devono essere salvate con l’estensione .m.
A questo punto possiamo usare adiag per estrarre la sotto-diagonale e ottenerne
la somma:
>> v = adiag( A );
>> v
v =
13 10 7 4
>> sum( v )
ans =
34
oppure, dato che abbiamo un unico output:
>> sum( adiag( A ) )
ans =
34
N.B.: le variabili utilizzate nella funzione non vengono assegnate nello spazio di
lavoro; ovviamente fanno eccezione le variabili di output. Per esempio la variabile
16
dim, pur essendo utilizzata nell’esecuzione della funzione, non viene assegnata come
variabile nello spazio di lavoro.
f ) Estrarre la prima riga di A. Per estrarre la prima riga di A, dobbiamo prendere gli elementi
di A che stanno sulla prima riga e su tutte le colonne di A:
>> a1 = A(1,:)
a1 =
16 2 3 13
Il simbolo : significa “tutti”. Se si trova al posto del primo indice, indica a Matlabr di
prendere tutte le righe, mentre se si trova al posto del secondo indice indica di prendere
tutte le colonne.
g) Estrarre i primi tre elementi della seconda colonna di A. Per estrarre gli elementi richiesti,
dobbiamo prendere gli elementi che stanno sulla seconda colonna e sulle righe dalla
prima alla terza. Scriviamo quindi:
>> a2 = A( 1 : 3, 2 )
a2 =
2
11
7
>> A * A
ans =
345 257 281 273
257 313 305 281
281 305 313 257
273 281 257 345
>> A^2
ans =
345 257 281 273
257 313 305 281
281 305 313 257
273 281 257 345
>> A .* A
ans =
256 4 9 169
25 121 100 64
81 49 36 144
16 196 225 1
>> A.^2
ans =
256 4 9 169
17
25 121 100 64
81 49 36 144
16 196 225 1
Con l’operatore * si intende il prodotto matriciale righe per colonne, per cui le dimensioni
delle matrici devono essere compatibili. Con l’operatore ^ si intende l’elevamento a
potenza, rispetto al prodotto righe per colonne. Quindi A^n = A*...*A, n volte. Per
avere compatibilità di dimensioni nel prodotto righe per colonne, tale operazione può
essere eseguita solo su matrici quadrate. L’operatore . indica che l’operazione che
lo segue deve essere eseguita elemento per elemento (per cui le due matrici coinvolte
devono avere le stesse dimensioni). Quindi A.*A costruisce una matrice con la stessa
dimensione di A e con elementi pari al prodotto degli elementi nella stessa posizione e
A.^2 rende una matrice con la stessa dimensione di A e con elementi pari al quadrato
degli elementi della matrice A.
>> sqrt( A )
ans =
4.0000 1.4142 1.7321 3.6056
2.2361 3.3166 3.1623 2.8284
3.0000 2.6458 2.4495 3.4641
2.0000 3.7417 3.8730 1.0000
>> A.^(1/2)
ans =
4.0000 1.4142 1.7321 3.6056
2.2361 3.3166 3.1623 2.8284
3.0000 2.6458 2.4495 3.4641
2.0000 3.7417 3.8730 1.0000
18
Esercizio 1
2. Scrivere una funzione mat hilbert.m che fornisca la matrice di Hilbert avente una
generica dimensione n inserendo un commento.
19