Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
A.A. 2009/2010
1
Dipartimento di Matematica Pura ed Applicata, Via Trieste 63 - 35121
PADOVA - demarchi@math.unipd.it
Stefano De Marchi 20 novembre 2009
Queste note sono rivolte agli studenti del Dottorato in Scienze Statistiche
ed Economia dell’Università degli Studi di Padova.
pagina 2 di 49
Capitolo 1
3
Stefano De Marchi 20 novembre 2009
1
B
1 + ε = (0. 10 . . . 00)B · B + 0. 00 . . . 0 · B0 =
| {z } 2 B
t cifre | {z }
t cifre
1
B
= (0. 10 . .
| {z } B. 000 ) · B + 0. 00 . . . 00 · B1 =
2 B
t + 1 cifre | {z }
t + 1 cifre
B
= (0. 10 . . . 00 )B · B 1
| {z 2}
t + 1 cifre
da cui
|x − fl (x)|
≤ε
|x|
errore relativo Dunque, l’errore relativo che si commette arrotondando un numero con
un numero macchina è minore o uguale alla precisione di macchina.
Questo vale ovviamente se la caratteristica di x è p, con L ≤ p ≤ U .
pagina 4 di 49
Stefano De Marchi 20 novembre 2009
. . B − 1B − 1})B · B U = (1 − (0. 00
(0. |B − 1B − 1 .{z . . 01})B ) · B U =
| .{z
t cifre t cifre
−t U
= (1 − B ) · B
1.2 Cancellazione
La somma di due numeri x e y viene eseguita dal calcolatore come segue:
E infine ((1+x)-1)/x
(0.1200/0.1234) · 10−2 = 0.97245 .
L’errore relativo commesso è |1 − 0.97245| = 0.027553 ≈ 3%. Il fatto che t
sia comunemente molto più grande, non esclude l’insorgere di questo tipo
di errori, detti di cancellazione (poiché alcune cifre sono state cancellate cancellazione
durante gli arrotondamenti).
pagina 5 di 49
Stefano De Marchi 20 novembre 2009
ans =
2
mentre 10.2 viene visualizzato in Matlab
R
come
>> 10.2
ans =
10.2000
È una notazione a virgola fissa, con quattro cifre decimali. Mentre il numero
0.001 viene visualizzato come
>> 0.001
ans =
1.0000e-03
pagina 6 di 49
Stefano De Marchi 20 novembre 2009
ans =
1.2346
In ogni caso, tutti i numeri vengono sempre rappresentati internamente come
floating point a (circa) 16 cifre decimali. Per rendersene conto, basta dare
il comando format
>> format long e
Si ha, ad esempio,
>> 1.23456
ans =
1.234560000000000e+00
È possibile immettere numeri in virgola mobile, come ad esempio e
>> 1.2e-5
ans =
1.200000000000000e-05
I numeri complessi vengono rappresentati nella forma a + bi, i
>> 3+5i
ans =
3.000000000000000e+00 + 5.000000000000000e+00i
Qualora il risultato di un’operazione sia un numero complesso, questo viene
calcolato automaticamente, come ad esempio
>> sqrt(-1)
ans =
0 + 1.000000000000000e+00i
pagina 7 di 49
Stefano De Marchi 20 novembre 2009
o
>> log(-1)
ans =
0 + 3.141592653589793e+00
Il risultato di operazione “impossibili” (come 0/0) è NaN (“Not a Number”).
pi Il numero π = 3.14159 . . . è approssimato dal comando pi.
ans =
1.224646799147353e-16
oppure
(1/49)*49
ans =
9.999999999999999e-01
pagina 8 di 49
Stefano De Marchi 20 novembre 2009
e = 2.2204e-016 k = 52
1.6 Esercizi
1. Trovare la media aritmetica di a = 1.7 · 10308 e b = 1.6 · 10308
2. Trovare una strategia per calcolare la norma euclidea del vettore [v1 , v2 ] =
[3 · 10307 , 4 · 10307 ].
n
3. Calcolare il coefficiente binomiale con n = 181 e m = 180. Sugg.:
m
usare esponenziale e logaritmi.
pagina 9 di 49
Stefano De Marchi 20 novembre 2009
pagina 10 di 49
Capitolo 2
11
Stefano De Marchi 20 novembre 2009
>> A = 1
A =
size e poi
>> size(A)
ans =
1 1
• Il comando
>> 1:4
ans =
1 2 3 4
che è un’abbreviazione di
>> [1,2,3,4]
ans =
1 2 3 4
>> 1:2:5
ans =
1 3 5
pagina 12 di 49
Stefano De Marchi 20 novembre 2009
>> 1:0.5:3
ans =
>> linspace(1,3,5)
ans =
>> v(end)
>> A = [1,2,3,4;5,6,7,8;9,10,11,12;13,14,15,16]
A =
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
oppure
>> A = [1,2,3,4
5,6,7,8
9,10,11,12
13,14,15,16]
pagina 13 di 49
Stefano De Marchi 20 novembre 2009
A =
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
>> A(3,2)
ans =
10
>> A(3,[1,2,3,4])
ans =
9 10 11 12
>> A(3,1:4)
ans =
9 10 11 12
>> A(3,:)
ans =
9 10 11 12
>> A(3,1:2)
ans =
9 10
>> A(3,[2,1,3,4])
ans =
10 9 11 12
pagina 14 di 49
Stefano De Marchi 20 novembre 2009
>> A(1,end)
ans =
>> A(1:2,2:3)
ans =
2 3
6 7
>> A(:,2)
ans =
2
6
10
14
>> diag(A)
ans =
1
6
11
16
>> diag(A,1)
ans =
2
7
12
>> diag(A,-1)
pagina 15 di 49
Stefano De Marchi 20 novembre 2009
ans =
5
10
15
>> reshape(A,2,8)
ans =
1 9 2 10 3 11 4 12
5 13 6 14 7 15 8 16
>> reshape(A,8,2)
ans =
1 3
5 7
9 11
13 15
2 4
6 8
10 12
14 16
>> A(:)
ans =
1
5
9
13
2
6
10
14
3
7
pagina 16 di 49
Stefano De Marchi 20 novembre 2009
11
15
4
8
12
16
>> repmat([1,2;3,4],2,2)
ans =
1 2 1 2
3 4 3 4
1 2 1 2
3 4 3 4
>> diag([1,2,3,4])
ans =
1 0 0 0
0 2 0 0
0 0 3 0
0 0 0 4
>> diag([1,2,3],1)
ans =
0 1 0 0
0 0 2 0
0 0 0 3
0 0 0 0
• Matrici di 0 e 1.
La costruzione di matrici con elementi nulli avviene mediante il co-
mando zeros zeros
>> A=zeros(2,3)
pagina 17 di 49
Stefano De Marchi 20 novembre 2009
A =
0 0 0
0 0 0
>> A=ones(3,2)
A =
1 1
1 1
1 1
• Matrice identità.
eye La costruzione di matrici identità avviene mediante il comando eye
>> eye(3)
ans =
1 0 0
0 1 0
0 0 1
>> rand(2,3)
ans =
pagina 18 di 49
Stefano De Marchi 20 novembre 2009
– Matrice di Toeplitz
c1 r2 r3 . . . rn
..
c2
c1 r2 . rn−1
.. .. .. ..
. c2 . . .
.. ..
.. ..
. . . . r2
cn cn−1 . . . c2 c1
>> toeplitz([0,1,2,3],[0,-1,-2,-3])
ans =
0 -1 -2 -3
1 0 -1 -2
2 1 0 -1
3 2 1 0
– Matrice di Vandermonde
n−1
. . . c21
c1 c1 1
cn−1 . . . c2 c2 1
2 2
.. . .. . . ..
.
. .
cn−1
n . . . c2n cn 1
ans =
1 1 1 1
8 4 2 1
27 9 3 1
64 16 4 1
– Altre matrici in
http://www.maths.manchester.ac.uk/ higham/mctoolbox/
pagina 19 di 49
Stefano De Marchi 20 novembre 2009
>> A.’
ans =
1 5 9 13
2 6 10 14
3 7 11 15
4 8 12 16
>> [1+i,2-i;3,4+i]
ans =
>> [1+i,2-i;3,4+i]’
ans =
>> triu(A)
ans =
1 2 3 4
0 6 7 8
0 0 11 12
0 0 0 16
tril
>> tril(A)
ans =
1 0 0 0
5 6 0 0
9 10 11 0
13 14 15 16
pagina 20 di 49
Stefano De Marchi 20 novembre 2009
elementi (per colonna): [10, 20, 30, 40, 50, 60, 70]
indici di colonna: [1, 1, 2, 3, 3, 4, 5]
indici di riga: [1, 2, 2, 3, 4, 4, 5]
>> A=[10,0,0,0,0;20,30,0,0,0;0,0,40,0,0;0,0,50,60,0;0,0,0,0,70]
A =
10 0 0 0 0
20 30 0 0 0
0 0 40 0 0
0 0 50 60 0
0 0 0 0 70
>> B = sparse(A)
B =
pagina 21 di 49
Stefano De Marchi 20 novembre 2009
(1,1) 10
(2,1) 20
(2,2) 30
(3,3) 40
(4,3) 50
(4,4) 60
(5,5) 70
>> B(2,1)
ans =
20
>> B(2,:)
ans =
(1,1) 20
(1,2) 30
ans =
(1,1) 1
(3,1) 100
(1,2) 10
(2,2) 2
(4,2) 200
(2,3) 20
(3,3) 3
(3,4) 30
(4,4) 4
full
pagina 22 di 49
Stefano De Marchi 20 novembre 2009
>> full(A)
ans =
1 10 0 0
0 2 20 0
100 0 3 30
0 200 0 4
• Prodotto matrice-vettore.
Analogamente, l’operatore di prodotto * tra una matrice e un vet-
tore (colonna) è il classico prodotto matrice-vettore e l’operatore di
prodotto * tra un vettore riga e un vettore colonna è il prodotto scalare.
>> A=[1,2;3,4]
A =
1 2
3 4
>> B=[5,6;7,8]
B =
pagina 23 di 49
Stefano De Marchi 20 novembre 2009
5 6
7 8
>> A*B
ans =
19 22
43 50
>> v=[5;6]
v =
5
6
>> A*v
ans =
17
39
>> w=[1,2]
w =
1 2
>> w*v
ans =
17
>> v*A
??? Error using ==> mtimes
Inner matrix dimensions must agree.
• Elevamento a potenza.
pagina 24 di 49
Stefano De Marchi 20 novembre 2009
>> A*A
ans =
7 10
15 22
>> A^2
ans =
7 10
15 22
>> v^2
??? Error using ==> mpower
Matrix must be square.
• Operazioni puntuali.
In Matlab
R
esistono anche operatori puntuali. Date due matrici,
è possibile calcolare la matrice i cui elementi sono il prodotto degli
elementi corrispondenti delle due matrici .*
>> A.*B
ans =
5 12
21 32
>> A.^2
ans =
1 4
9 16
pagina 25 di 49
Stefano De Marchi 20 novembre 2009
>> w’.*v
ans =
5
12
>> v’./w
ans =
5 3
>> w.*v
??? Error using ==> times
Matrix dimensions must agree.
>> exp(A)
ans =
2.7183 7.3891
20.0855 54.5982
>> A>2
ans =
0 0
1 1
v =
10 11 12 13 14 15 16 17 18 19
pagina 26 di 49
Stefano De Marchi 20 novembre 2009
e supponiamo di voler sapere quali sono gli elementi del vettore maggiori o
uguali a 15. È sufficiente il seguente comando
>> find(v>=15)
ans =
6 7 8 9 10
>> index=find(v>=15)
index =
6 7 8 9 10
>> v(index)
ans =
15 16 17 18 19
>> v(index)=v(index)-15
v =
10 11 12 13 14 0 1 2 3 4
>> A=[10,11;12,13]
A =
10 11
12 13
>> index=find(A<13)
index =
1
2
3
pagina 27 di 49
Stefano De Marchi 20 novembre 2009
Il risultato del comando find non è una matrice, come ci si potrebbe as-
pettare, ma un vettore colonna. Non c’è però alcun problema ad eseguire
operazioni solo sugli elementi specificati
>> A(index)=0
A =
0 0
0 13
Per costruire, per esempio, una matrice che abbia elementi pari ad uno solo
nelle posizioni specificate, è necessario prima inizializzarla con le dimensioni
opportune
>> B=zeros(2)
B =
0 0
0 0
e poi assegnare i valori
>> B(index)=1
B =
1 1
1 0
2.3 Esercizi
1. Dati due vettori a, b di lunghezza n. Costruire una matrice tridiag-
onale simmetrica in formato sparso, che chiameremo T , usando sia il
comando diag che spdiags.
2. Sulla matrice precedente si facciamo le seguenti operazioni
T 1 = T 4 − 3T 2 − ones(5);
T2 = T1 ∗ T;
Della matrice T 2 determinare i primi 5 elementi più grandi di 5.
3. A partire dalla matrice identica I, si costruisca una matrice di per-
mutazione P, ottenuta scambiando la prima colonna con la seconda
e la seconda con la quinta. Verificare che P 2 = P , ovvero che P è
involutoria.
pagina 28 di 49
Capitolo 3
Algebra lineare
29
Stefano De Marchi 20 novembre 2009
Adesso, alla terza riga sottraiamo la prima moltiplicata per due. Si ottiene
1 2 1 x1 1
0 −1 0 x2 = 1
0 1 −2 x3 1
pagina 30 di 49
Stefano De Marchi 20 novembre 2009
Infatti, la prima riga di (3.1) è equivalente alla somma delle altre due!
Un’altra soluzione di interesse è x = [1, 0, 0]T (o anche x = [0, 0, 1]T )
che massimizza il numero di elementi pari a zero.
È facile rendersi conto che non ammette soluzioni (il sistema è sin-
golare), in quanto le prime due righe richiedono che una stessa com-
binazione lineare di x1 , x2 e x3 assuma simultaneamente due diversi
valori, 1 e 2. Una “soluzione” (chiamata soluzione ai minimi quadrati )
è quella che minimizza la norma euclidea del residuo minimi quadrati
1 1 2 1 x1
r(x1 , x2 , x3 ) = 2 − 1 2 1 x2
0 0 1 0 x3
pagina 31 di 49
Stefano De Marchi 20 novembre 2009
Infine, può succedere che la soluzione ai minimi quadrati non sia unica:
consideriamo il sistema lineare (singolare)
1 0 x1 1
= (3.5)
0 0 x2 1
r(x1 , x2 ) = (1 − x1 )2 + 1
kr(a1 , a2 )k22 = (y1 − (a1 x1 + a2 ))2 +(y2 − (a1 x2 + a2 ))2 +. . .+(yn − (a1 xn + a2 ))2
pagina 32 di 49
Stefano De Marchi 20 novembre 2009
>> x=A\b
>> X=A\B
X = A−1 B ⇐⇒ AX = B
e dunque
>> X=A\B
X = AB −1 ⇐⇒ XB = A
>> A/B
>> A=[1,2,1;1,3,1;0,1,1;1,1,1]
A =
1 2 1
1 3 1
0 1 1
1 1 1
>> b=[1;2;0;1]
b =
1
2
0
pagina 33 di 49
Stefano De Marchi 20 novembre 2009
>> A\b
ans =
0.8333
0.5000
-0.5000
>> (A’*A)\(A’*b)
ans =
0.8333
0.5000
-0.5000
>> A=[1,1,1;0,1,0]
A =
1 1 1
0 1 0
>> b=[1;0]
b =
1
0
>> A\b
ans =
1
0
0
pagina 34 di 49
Stefano De Marchi 20 novembre 2009
3.2.1 SVD
La decomposizione SVD (Singular Value Decomposition) fattorizza una ma-
trice A ∈ Rn×m (anche rettangolare) nel prodotto
>> A=[1,2,1;1,3,1;0,1,1;1,1,1]
A =
1 2 1
1 3 1
0 1 1
1 1 1
>> [U,S,V]=svd(A)
U =
S =
4.5732 0 0
0 0.7952 0
0 0 0.6736
0 0 0
V =
pagina 35 di 49
Stefano De Marchi 20 novembre 2009
b =
1
2
0
1
>> d=U’*b
d =
-2.3223
-0.2329
-0.6213
0.4082
>> s=diag(S)
s =
4.5732
0.7952
0.6736
length
>> y=d(1:length(s))./s
y =
-0.5078
-0.2929
-0.9224
>> x=V*y
x =
0.8333
0.5000
-0.5000
pagina 36 di 49
Stefano De Marchi 20 novembre 2009
>> A=[1,2,1;1,2,1;0,1,0]
A =
1 2 1
1 2 1
0 1 0
>> b=[1;2;0]
b =
1
2
0
>> [U,S,V]=svd(A)
U =
S =
3.5616 0 0
0 0.5616 0
0 0 0
V =
>> d=U’*b
pagina 37 di 49
Stefano De Marchi 20 novembre 2009
d =
-2.0618
-0.4991
0.7071
>> s=diag(S)
s =
3.5616
0.5616
0
>> y=zeros(size(d))
y =
0
0
0
>> index=find(s~=0)
index =
1
2
>> y(index)=d(index)./s(index)
y =
-0.5789
-0.8888
0
>> x=V*y
x =
0.7500
-0.0000
pagina 38 di 49
Stefano De Marchi 20 novembre 2009
0.7500
>> A=hilb(20);
>> b=A*ones(20,1);
>> x=A\b
Warning: Matrix is close to singular or badly scaled.
Results may be inaccurate. RCOND = 1.155429e-19.
x =
1.0000
1.0001
0.9955
1.0635
0.5635
2.4236
0.2518
-9.1734
36.9718
-53.5696
43.8449
-37.5198
72.3107
-51.0217
-57.6111
100.4214
pagina 39 di 49
Stefano De Marchi 20 novembre 2009
5.1570
-86.7209
62.3377
-12.7251
Otteniamo un risultato molto lontano da quello aspettato [1, 1, . . . , 1]T , per
altro annunciato dal messaggio di warning di Matlab
R
. Esiste un numero
numero di che predice l’accuratezza della soluzione
di
un sistema lineare, il numero
condizionamento di condizionamento, definito da kAk2
A−1
2 e che si può calcolare con il
cond comando cond
>> cond(A)
ans =
1.8458e+18
Più è grande il numero di condizionamento, meno è accurata la soluzione
del sistema lineare. Non esiste una soglia per dire se un numero di con-
dizionamento è grande o piccolo: ma 1018 è certamente grande e l’errore tra
la soluzione esatta e la soluzione che si ottiene è all’incirca proporzionale al
numero di condizionamento.
Per misurare la distanza tra due vettori si calcola, ad esempio, la norma
norm euclidea della differenza: norm
>> norm(x-ones(20,1))
ans =
201.1761
3.4 Esercizi
1. Si costruisca la matrice tridiagonale T con i comandi
pagina 40 di 49
Stefano De Marchi 20 novembre 2009
pagina 41 di 49
Stefano De Marchi 20 novembre 2009
pagina 42 di 49
Capitolo 4
Polinomi
x =
-10 0 10
>> 3*x.^2+4*x-1
ans =
259 -1 339
oppure, preferibilmente, usare il comando polyval polyval
>> polyval([3,4,-1],x)
ans =
259 -1 339
43
Stefano De Marchi 20 novembre 2009
>> x=linspace(0,2*pi,6);
>> y=sin(x)
y =
a =
>> polyval(a,x)
ans =
>> xbar=1;
>> polyval(a,xbar)
ans =
0.8340
pagina 44 di 49
Stefano De Marchi 20 novembre 2009
>> sin(xbar)
ans =
0.8415
>> x=linspace(-5,5,11);
x =
-5 -4 -3 -2 -1 0 1 2 3 4 5
>> y=1./(1+x.^2);
>> a=polyfit(x,y,length(x)-1);
>> xbar=-4.5;
>> polyval(a,xbar)
ans =
1.5787
>> 1./(1+xbar.^2)
ans =
0.0471
>> x=cos([0:9]*pi/9)’
pagina 45 di 49
Stefano De Marchi 20 novembre 2009
x =
1.0000
0.9397
0.7660
0.5000
0.1736
-0.1736
-0.5000
-0.7660
-0.9397
-1.0000
>> spline(x,y,xbar)
ans =
0.0484
p = polyfit(x,y,n);
[p,s,mu] = polyfit(x,y,n);
Vediamoli in dettaglio.
pagina 46 di 49
Stefano De Marchi 20 novembre 2009
1. p=polyfit(x,y,n);
Restituisce nel vettore p i coefficienti del polinomio di grado n ≤
length(x) che approssima, nel senso dei minimi quadrati i dati
memorizzati in y.
2. [p,s,mu]=polyfit(x,y,n);
In questo caso si determinano i coefficienti del polinomio approssi-
mante non in x ma in
x − µ1
x̂ =
µ2
• Il comando
y=polyval(p,x);
y = p1 xn + p2 xn−1 + . . . + pn+1 .
s=spline(x,y,xx)
pagina 47 di 49
Stefano De Marchi 20 novembre 2009
4.6 Esercizi
1. Si consideri la funzione di Runge g(x) = (1 + x2 )−1 , x ∈ [−5, 5]. Si
determinin i polinomio d’interpolazione di gradi da 4 a 12 usando sia
punti equispaziati che di Chebyshev-Lobatto. Cosa si osserva?
pagina 48 di 49
Stefano De Marchi 20 novembre 2009
pagina 49 di 49