Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
2013 2014
Calcolo Numerico
Proff: D. Ambrosi, P. Antonietti,
Laboratorio 1
Introduzione al linguaggio Matlab
c
2007
2014 Questo testo (compresi i quesiti ed il loro svolgimento) `
e coperto da diritto dautore. Non pu`
o essere sfruttato a fini commerciali o di pubblicazione editoriale.
Non possono essere ricavati lavori derivati. Ogni abuso sar`
a 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/).
Matlab `e un software numerico per il calcolo che fornisce un ambiente per varie applicazioni scientifiche e ingegneristiche; maggiori informazioni possono essere reperite allindirizzo http://www.mathworks.
com. Prima di passare allintroduzione di alcuni comandi elementari, ricordiamo che per chiarimenti circa
luso di una funzione `e possibile utilizzare il comando help, digitando help nome comando.
Assegnazione di scalari Cominciamo con lassegnare il valore 2.45 alla variabile a:
>> a = 2 . 4 5
a =
2.45
assegniamo ora il valore 3.1 alla variabile A. Osserviamo che Matlab fa distinzione tra le lettere maiuscole
e le lettere minuscole.
>> A = 3 . 1
A =
3.1
il precedente valore 3.1 viene definitivamente perso. Osserviamo che possiamo far seguire un comando
da una virgola, senza rilevare nessuna differenza; tale virgola `e per`o necessaria per separare pi`
u comandi
scritti sulla stessa linea.
>> a = 1 . 2 ,
a =
1.2
>> a = 1 . 7 , a = 2 . 4 5
a =
1.7
a =
2.45
Se invece si fa seguire il comando da un punto e virgola, Matlab non visualizzer`a sulla finestra di
comando il risultato delloperazione; il punto e virgola pu`o essere usato per separare due comandi sulla
stessa riga.
>> a = 1 . 2 ;
>> a = 1 . 7 ; a = 2 . 4 5
a =
2.45
Le variabili possono essere cancellate utilizzando il comando clear. Possiamo ad esempio cancellare la
variabile A digitando:
>> c l e a r A
Digitando il comando:
>> c l e a r
vengono cancellate tutte le variabili definite dallutente. Per sapere quali sono le variabili dellutente
attualmente in memoria si utilizza il comando:
>> who
Your v a r i a b l e s a r e :
a
Per sapere quali sono le variabili in memoria definite dallutente `e anche possibile utilizzare il comando
whos. Questultimo, a differenza di who, mostra anche la dimensione, loccupazione di memoria in numero
di bytes e il tipo della variabile.
Variabili predefinite
queste ricordiamo:
i: lunit`
a immaginaria 1;
eps: il minimo valore tale che, per il calcolatore, sia (1 + eps) > 1, pari a (sul calcolatore che stiamo
usando):
>> eps
eps =
2 . 2 2 0 4 e 16
>> 1 + eps / 2 1
ans =
0
In questo caso si consiglia di utilizzare 1i al posto di i, che Matlab riconoscer`a in modo univoco come
lunit`
a immaginaria i.
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`o 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 . 1 2 3 4 5 6 7 8 ;
>> format s h o r t
>> a
a =
0.1234
>> format s h o r t e
>> a
a =
1 . 2 3 4 5 e1
1.4
1.5
1.6
1.7
1.8
1.9
Si pu`
o 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 dellintervallo e il numero di
elementi del vettore. Nellesempio il vettore e `e costituito da 6 elementi equispaziati nellintervallo
[0, 5]:
>> e = linspace ( 0 , 5 , 6 )
e =
0
1
2
3
4
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 immediatamente 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
Naturalmente applicando loperazione di trasposizione a tutte le modalit`a viste per definire dei
vettori riga, si ottengono dei vettori colonna.
Somma e sottrazione (attenzione alla compatibilit`a delle dimensioni delle matrici!):
>> c = [ 2 5 4 1 ]
c =
2
5
4
1
>> a + c
ans =
3
7
7
5
>> a c
ans =
1 3 1
3
>> d = [ 1 2 3 ]
d =
1
2
3
>> a + d
? ? ? E r r o r u s i n g ==> p l u s
Matrix d i m e n s i o n s must a g r e e
>> c = c
c =
2
5
4
1
>> a c
? ? ? E r r o r u s i n g ==> minus
Matrix d i m e n s i o n s must a g r e e
Somma e sottrazione elemento per elemento: Bisogna fare molta attenzione, perche in Matlab
sono definite anche delle operazioni particolari che agiscono sulle matrici (e sui vettori) elemento
per elemento. Si pu`
o sommare uno scalare ad una matrice e la matrice risultante ha le stesse
3
dimensioni della matrice di partenza e i suoi elementi sono tutti ottenuti sommando il valore dello
scalare agli elementi della matrice iniziale.
>> f = [
f =
1
2
3
>> f + 3
ans =
4
5
6
1 2 3 ; 2 4 6 ; 3
2
4
6
3
6
9
5
7
9
6
9
12
6 9 ]
Prodotto:
prodotto (righe per colonne) vettore riga - vettore colonna (della stessa lunghezza):
>> a b
ans =
30
2
4
6
8
3
6
9
12
4
8
12
16
prodotto elemento per elemento (attenzione alla compatibilit`a, in questo caso i due oggetti
devono avere le stesse dimensioni!):
>> b . c
ans =
2
10
12
4
>> a . b
? ? ? E r r o r u s i n g ==> t i m e s
Matrix d i m e n s i o n s must a g r e e
Si osservi che tutte le operazioni elemento per elemento sono contraddistinte dal . che precede
il simbolo delloperazione, con leccezione delloperazione di somma/sottrazione
Elevamento a potenza elemento per elemento:
>> a . 2
ans =
1
16
size: fornisce la dimensione del vettore o della matrice passata in input, cio`e restituisce un vettore
contenente due interi, il primo indicante il numero di righe (1 se `e un vettore riga) e il secondo
indicante il numero di colonne (1 se `e un vettore colonna) delloggetto passato in input.
>> s i z e ( v1 )
ans =
3
1
>> s i z e ( v2 )
ans =
1
3
>> s i z e ( v1 , 1 )
ans =
3
>> s i z e ( v1 , 2 )
ans =
1
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: ha due parametri in input: un vettore v e un numero intero n oppure lopzione inf. Se viene
passato solo il vettore, calcola la norma 2 (norma euclidea) di v, definita come
v
ulength(v)
u X
kvk2 = t
v2i .
i=1
n1
length(v)
kvkn =
|vi |n .
i=1
Infine se viene passata lopzione inf, calcola la norma infinito di v definita come
kvk =
max
1ilength(v)
|vi |.
>> norm( v1 )
ans =
374.1657
>> norm( v1 , 2 )
ans =
374.1657
>> norm( v1 , 1 )
ans =
600
>> norm( v1 , i n f )
ans =
300
abs: restituisce un vettore avente come componenti il valore assoluto di ciascuna componente del
vettore passato in input.
>> w = [ 1 4 5 9 ]
w =
1 4
5 9
>> abs ( w )
ans =
1
4
5
9
exp(x): calcola ex . Se x `e un vettore o una matrice esegue loperazione per ogni componente.
>> exp ( 1 )
ans =
2.7182
>> exp ( [ 1 ; 0 ] )
ans =
2.7182
1.
zeros(size(A)), dove A `e 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
1, 3 )
1
1
3, 1 )
3, 3 )
1
1
1
1
1
1
ones(size(A)), dove A `e una matrice, costruisce una matrice della stessa dimensione di A con
elementi tutti pari a uno.
>> o n e s (
ans =
1
1
1
3 )
1
1
1
1
1
1
Matrice identit`
a: eye(n) costruisce la matrice identit`a di dimensione n.
>> eye ( 3 )
ans =
1
0
0
1
0
0
0
0
1
eye(n,m) costruisce una matrice n x m con 1 sulla diagonale principale e 0 altrove (aii = 1,
i = 1, . . . , min(n, m) e aij = 0, i 6= j).
>> eye ( 2 , 3 )
ans =
1
0
0
0
1
0
>> eye ( 3 , 2 )
ans =
1
0
0
1
0
0
Matrice di numeri casuali: rand(n,m) costruisce una matrice n x m di numeri casuali nellintervallo
[0, 1].
>> rand ( 1 , 3 )
ans =
0.2113
0.7560
>> rand ( 3 , 3 )
ans =
0.8497
0.0684
0.6857
0.5608
0.8782
0.6624
0.0002
0.7264
0.1985
0.5446
rand(size(A)), dove A `e una matrice, costruisce una matrice della stessa dimensione di A di numeri
casuali nellintervallo [0, 1]. Il comando rand genera un numero casuale nellintervallo [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
>> x = 1 . e 15;
ans =
1.1102
((1+ x ) 1)/ x
Questo risultato `e decisamente poco accurato e lerrore commesso `e del 11%! Tale fenomeno `e detto
cancellazione di cifre significative. Un altro esempio molto sorprendente `e il seguente
>> 0.1+0.1+0.1 0.3
ans =
5 . 5 5 1 1 e 17
Seppur molto basso il valore non `e 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 `e corretta. Cosa cambia tra i due esempi? La differenza `e nella loro
rappresentazione nel calcolatore.
Calcolo simbolico Attraverso il toolbox symbolic di Matlab possiamo calcolare analiticamente la
derivata e gli integrali di funzioni. Infatti attraverso le seguenti righe di codice possiamo calcolare la
derivata e lintegrale della funzione x2
>> syms x ;
>> f = x 2 ;
>> d i f f ( f , x )
ans =
2 x
>> i n t ( f , x )
ans =
1/3 x 3
16
5
A=
9
4
2
11
7
14
3
10
6
15
13
8
12
1
a) Inserire la matrice.
I modo)
>> A = [ 1 6 2 3 1 3 ; 5 11 10 8 ; 9 7 6 1 2 ; 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
5
11
10
9
7
6
4
14
15
13
8
12
1
34
34
II Modo)
>> A = A
A =
16
5
2
11
3
10
13
8
>> sum( A, 1 )
ans =
34
34
9
7
6
12
4
14
15
1
34
34
Il comando diag(M,k), dove M `e una matrice, costruisce un vettore colonna avente per elementi
gli elementi della diagonale k-esima di M, dove k = 0 indica la diagonale 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 `e un vettore,
costruisce una matrice di dimensione (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
Loperazione si pu`
o eseguire in una sola riga di comando scrivendo:
oppure
>> sum( [ A( 1 , 4 ) , A( 2 , 3 ) , A( 3 , 2 ) , A( 4 , 1 ) ] )
ans =
34.
II Modo) Non esiste un comando per estrarre lantidiagonale. Possiamo, utilizzando un ciclo
for, estrarre la sotto-diagonale (non sar`a conveniente utilizzare il primo modo con una matrice
di grandi dimensioni, per esempio 50 x 50!)
>> n = s i z e ( A, 1 )
n =
4
>> f o r i = 1 : n
ad ( i ) = A( i , ni +1 ) ;
>> end
>> ad
ad =
13
10
7
4
>> sum( ad )
ans =
34
N.B.: le variabili utilizzate durante lesecuzione dellMfile 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 sullantidiagonale di M. A questo scopo apriamo una nuova
finestra nelleditor di Matlab e scriviamo quindi la funzione:
10
function r i s = a d i a g ( a )
%
%
%
%
ris = [ ] ;
n = size ( a ) ;
i f n ( 1 ) = n ( 2 )
disp ( Errore : ) ;
disp (
la matrice deve essere quadrata ! ) ;
return
end
dim = n ( 1 ) ;
f o r i = 1 : dim
r i s ( i ) = a ( i , dimi +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`e
che non sar`
a eseguita; `e buona norma commentare le funzioni indicando cosa fanno e quali
sono i parametri in input ed in output ed inizializzare, allinizio 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 lestensione .m.
A questo punto possiamo usare adiag per estrarre la sotto-diagonale e ottenerne la somma:
>> v = a d i a g ( A ) ;
>> v
v =
13
10
7
>> sum( v )
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 dim, pur essendo
utilizzata nellesecuzione 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 Matlab 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
11
>> A A
ans =
345
257
281
273
>> A2
ans =
345
257
281
273
>> A . A
ans =
256
25
81
16
>> A. 2
ans =
256
25
81
16
257
313
305
281
281
305
313
257
273
281
257
345
257
313
305
281
281
305
313
257
273
281
257
345
4
121
49
196
9
100
36
225
169
64
144
1
4
121
49
196
9
100
36
225
169
64
144
1
Con loperatore * si intende il prodotto matriciale righe per colonne, per cui le dimensioni delle
matrici devono essere compatibili. Con loperatore si intende lelevamento a potenza, rispetto al
prodotto righe per colonne. Quindi An = A*...*A, n volte. Per avere compatibilit`a di dimensioni
nel prodotto righe per colonne, tale operazione pu`o essere eseguita solo su matrici quadrate. Loperatore . indica che loperazione 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.
i) Calcolare la radice quadrata degli elementi di A:
>> sqrt ( A )
ans =
4.0000
2.2361
3.0000
2.0000
>> A. ( 1 / 2 )
ans =
4.0000
2.2361
3.0000
2.0000
1.4142
3.3166
2.6458
3.7417
1.7321
3.1623
2.4495
3.8730
3.6056
2.8284
3.4641
1.0000
1.4142
3.3166
2.6458
3.7417
1.7321
3.1623
2.4495
3.8730
3.6056
2.8284
3.4641
1.0000
12
Esercizio 1
1. Inserire la matrice di Hilbert di dimensione 5x5 definita da:
ai j =
1
i+j1
13