Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
MATLAB
Scrittura di matrici
Matlab (MATrix LABoratory) `e un ambiente di programmazione nato nellambito dellAnalisi Numerica4
in cui `e possibile esprimere algoritimi relativi a matrici ad alto livello. Per esempio la fattorizzazione
QR di una matrice o il calcolo di autovalori o la risoluzione di un sistema lineare, pu`o essere eettuata
mediante una sola istruzione Matlab. Le sottomatrici o le matrici a blocchi sono trattate con facilit`a.
Lo scopo di questo paragrafo `e di trasmettere un senso del linguaggio Matlab; non si ritiene di trattare
gli aspetti concernenti la graca in Matlab, il trattamento dei dati e dei le, tutti quegli aspetti che
richiedono linterazione con il sistema operativo adottato o pacchetti (toolboxes) di specici argomenti
o applicazioni.
Per tali aspetti si pu`o considerare la guida allutente di Matlab o lhelp in linea (si veda: www.mathworks.it/it/help/matlab/index.html) o i vari manuali di Matlab introduttivi (e.g., www.ciaburro.it/matlab) o avanzati.5
Quando si inizia una sessione di Matlab, ovvero si esegue Matlab, lutente pu`o creare matrici e vettori
ed eseguire calcoli con essi. Ad esempio le matrici possono essere introdotte esplicitamente mediante
listruzione6
a=[1 2 3; 4 5 6; 7 8 9];
che assegna alla variabile a, array 3 3, in precisione doppia, la matrice
1 2 3
A= 4 5 6
7 8 9
Se listruzione nisce con il simbolo ;, allora il risultato dellistruzione non viene visualizzato. Ad
esempio, se si scrive listruzione
a=[1 2 3; 4 5 6; 7 8 9]
4 Si
veda http://it.mathworks.com/company/newsletters/articles/the-origins-of-matlab.html.
una pi`
u estesa introduzione allambiente di programmazione Matlab, si vedano i capitoli 1 e 2 di
5 Per
Mazzia A.: Laboratorio di Calcolo Numerico, Applicazioni con Matlab e Octave, Pearson Italia, Milano, 2014.
6 Alternativamente
si pu`
o scrivere
a=[1 2 3
4 5 6
7 8 9];
a=[1 2 3; 4 5 6; ...
7 8 9];
oppure
15 3
5 6
8 9
10
A= 4
7
1
3
C=
0
0
0
0
0
10
Gli scalari sono considerati delle matrici 1 1. Possono essere introdotti, ad esempio, con le due seguenti
istruzioni
s=1;
s=[1];
In linguaggio Matlab `e possibile lavorare su blocchi di array (sottomatrici) mediante una particolare
indicizzazione degli elementi.
Si considerino i seguenti esempi: se si ha larray a, 5 4
a=[1 10 100 1000; 2 20 200 2000; 3 30 300 3000; 4 40 400 4000; 5 50 500 5000];
allora, listruzione
x=a(1:4,3);
fornisce come risultato larray x, colonna, che ha nei primi quatto elementi la terza colonna di a, i.e.,
x=
100
200
300
400
Listruzione Matlab
y=a(:,3);
fornisce come risultato larray y, colonna, uguale alla terza colonna di a, i.e.,
y=
100
200
300
400
500
Listruzione Matlab
c1=a(1:3,:);
fornisce come risultato larray due dimensionale c1, che contiene le prime tre righe di a, i.e.,
c1=
1 10 100 1000
2 20 200 2000
3 30 300 3000
Listruzione Matlab
c2=a(:,[2 4]);
fornisce come risultato larray due dimensionale c2, che contiene la seconda e la quarta colonna di a, i.e.,
c2=
10
20
30
40
50
8
1000
2000
3000
4000
5000
100
200
300
500
1000
2000
3000
5000
3
4
4
4
4
4
5
5
5
5
5
6
6
6
6
6
7
7
7
7
7
8
8
8
8
8 9;
9;
9;
9;
9];
1
1
1
1
1
100
200
300
400
500
1000
2000
3000
4000
5000
8
8
8
8
8
6
6
6
6
6
100
100
300
400
500
7
7
7
7
7
a2=
Linguaggio di programmazione
Da quanto visto nel paragrafo precedente, si nota che in Matlab non `e possibile indicizzare le componenti
o gli elementi di vettori o di matrici in array la cui indicizzazione non parta dalla componente 1 o
dallelemento (1, 1).
Questo risulta evidente in quanto Matlab `e un linguaggio interpretativo ed ogni singola istruzione
risulta tradotta (in linguaggio macchina) ed eseguita. Dunque non sono previste istruzioni dichiarative
di tipo e di dimensione.
Matlab considera le variabili numeriche in precisione doppia (numeri reali memorizzati su 64 bit)7 e sono
riconosciuti come tipi di variabili il tipo reale in precisione doppia, il tipo complesso (come coppia di reali
in precisione doppia) e il tipo carattere; le variabili di tipo carattere (stringhe) sono denite tra apici.
Matlab `e dunque un linguaggio di programmazione in cui, ad esempio, le istruzioni di assegnazione e
di elaborazione aritmetica assegnano pi`
u valori alla variabile (alle variabili) a sinistra del segno uguale
come, ad esempio tutte le istruzioni Matlab di assegnazione di array viste nel paragrafo precedente.
In Matlab `e possibile non assegnare (esplicitamente) un valore ad una variabile; in questo caso Matlab
ne assegna il valore alla variabile ans (answer). Ad esempio, listruzione Matlab
3+2;
assegna alla variabile ans il valore 5, i.e.,
ans=
5
In Matlab vi sono delle costanti predenite. Ad esempio pi ha il valore in precisione doppia di , eps `e
2.22... 1016 che `e il valore della precisione di macchina su 64 bit, i
e j hanno espressione in Matlab 0
+ 1.0000i e sono lespressione in Matlab dellunit`a immaginaria i = 1.
Se si assegna un valore ad una costante predenita, ad esempio pi=5, allora pi `e ora una variabile il cui
valore `e 5.
La scrittura in Matlab dei numeri in notazione esponenziale segue le stesse regole del linguaggio Fortran
(e.g., il numero 104 si scrive indistintamente 1.e-4, 1.d-4).
Listruzione in Matlab pu`o essere eseguita
direttamente dalla linea di comando, scrivendo listruzione accanto a >>, prompt dei comandi
Matlab, e premendo il tasto Invio;
7 Se si vogliono modicare i tipi delle variabili in uso si usano le istruzioni (funzioni) di modica di tipo; si veda help
datatypes.
10
tan(x)
asin(x) acos(x)
cosh(x) tanh(x) exp(x)
abs(x)
sqrt(x) sign(x)
floor(x) ceil(x) fix(x)
Se largomento di una funzione elementare `e un array, allora il risultato `e un array delle dimensioni
dellargomento i cui valori sono i valori della funzione elementare applicate agli elementi dellarray. Ad
esempio le istruzioni
x=[4; 9; 16];
y=sqrt(x)
forniscono
y=
2
3
4
11
12
Il ciclo. Il costrutto Fortran di do in Matlab si scrive come costrutto di for nel modo seguente:
for i=i1:i2:13
istruzione/i
end
Con i si `e indicata la variabile contatore, con i1 e i3 si sono denotati lindice iniziale e nale rispettivamente e con i2 si `e indicato il passo del ciclo. Se i2=1 allora tale indice si pu`o omettere.
Ad esempio se si vuole assegnare ad un array x di n componenti, i valori 1, 2,...,n alle componenti x(1),
x(2),...,x(n), il ciclo
for i=1:n
x(i)=i;
end
costruisce tale array riga. In modo equivalente larray x pu`o essere ottenuto dallistruzione
x=1:n;
che indica che ad x sono assegnati tutti i valori da 1 a n, con passo 1.9
Utilizzando lindicizzazione degli array in Matlab, il prodotto matrice per vettore
for i=1:m
y(i)=0;
for j=1:n
y(i)=y(i)+a(i,j)*x(j);
end
end
si pu`o scrivere
for i=1:m
y(i)=y(i)+a(i,1:n)*x(1:n);
end
Il costrutto di while in Matlab si scrive
while espressione logica
istruzione/i
end
Le istruzione/i sono eseguite ntanto che lespressione logica `e vera.
Listruzione break. Listruzione break in Matlab equivale allistruzione exit in Fortran 90.
Si riportano ora gli operatori aritmetici, relazionali e logici in linguaggio Matlab.
Operatori aritmetici. Gli operatori aritmetici in Matlab sono i seguenti:
+
*
^
/
\
9 Listruzione
addizione
sottrazione
moltiplicazione
elevamento a potenza
divisione (a destra)
divisione a sinistra
trasposizione
13
Gli operatori di addizione e sottrazione +, - quando gli operandi sono array, sono operatori componente
a componente. Se supponiamo che a e b siano due array di uguali dimensioni, allora listruzione
c=a+b;
fornisce un array c di dimensioni come quelle di a (o di b) i cui elementi sono la somma dei rispettivi
elementi di a e b.
Se a e b sono due array n n, la scrittura c=a+b `e equivalente al ciclo
for i=1:n
for j=1:n
c(i,j)=a(i,j)+b(i,j)
end
end
Se supponiamo che s sia uno scalare e a un array, listruzione Matlab
b=s+a;
fornisce un array b di dimensioni come quelle di a i cui elementi sono dati dalla somma dei rispettivi
elementi di a pi`
u s.
Se a e b sono due array m n, la scrittura b=s+a `e equivalente al ciclo10
for i=1:m
for j=1:n
b(i,j)=a(i,j)+s
end
end
Loperatore di moltiplicazione * quando gli operandi sono array, `e il prodotto riga per colonna.
Se supponiamo che x e y siano due array colonna di uguale dimensione, allora listruzione
s=x*y;
fornisce il risultato del prodotto scalare tra i vettori memorizzati negli array x e y.
Se x e y sono due array colonna anche di diversa dimensione, listruzione
a=x*y;
fornisce larray a, con numero di righe uguale alla dimensione di x e numero di colonne uguale a quella
di y e contenente la diade di elementi aij = xi yj .
Se a `e un array di dimensioni mn e x `e un array colonna di n componenti, listruzione
y=a*x;
fornisce larray colonna y di dimensione m, risultato del prodotto matrice per vettore.
In generale, se a e b sono due array con dimensioni compatibili (il numero di colonne di a `e uguale al
numero di righe di b), allora, listruzione c=a*b fornisce il risultato del prodotto matrice per matrice.
Le istruzioni Matlab sopra, in modo equivalente si scrivono con il ciclo for:11
10 Si
ricorda che le operazioni globali con array c=a+b e b=s+a sono presenti anche in Fortran 90.
y del ciclo annidato di for del calcolo matrice per vettore risulta essere un array riga.
11 Larray
14
s=0
for i=1:n
s=s+x(i)*y(j);
end
for i=1:m
y(i)=0;
for j=1:n
y(i)=y(i)+a(i,j)*x(j);
end
end
for i=1:m
for j=1:n
a(i,j)=x(i)*y(j);
end
end
for i=1:m
for j=1:n
c(i,j)=0;
for k=1:p
c(i,j)=c(i,j)+a(i,k)+b(k,j);
end
end
Si osserva che se x e y sono due array di uguale dimensione, ad esempio colonna, allora il prodotto z=x*y
non `e corretto cos` come il prodotto c=a*b se a e b sono due array a due dimensioni, entrambi di m righe
ed n colonne. Se si vuole costruire un array colonna z o un array c di dimensioni mn mediante una riga
di Matlab equivalente ai cicli for
for i=1:n
z(i)=x(i)*y(j);
end
for i=1:m
for j=1:n
c(i,j)=a(i,j)*b(i,j);
end
end
allora si deve considerare loperatore * come componente a componente. Ci`o `e possibile facendo precedere
loperatore da un punto .
I cicli sopra sono equivalenti alle istruzioni Matlab
z=x.*y;
c=a.*b;
Se supponiamo che s sia uno scalare e a un array, listruzione Matlab
b=s*a;
fornisce un array b di dimensioni come quelle di a i cui elementi sono dati dal prodotto dei rispettivi
elementi di a per s.
Se a e b sono due array m n, la scrittura b=s+a `e equivalente al ciclo12
for i=1:m
for j=1:n
b(i,j)=a(i,j)*s;
end
end
Loperatore di divisione (destra o sinistra) quando opera tra scalari `e ovviamente la moltiplicazione per
il reciproco; i.e., c=a/b equivale a c=a*(1/b) e non c`e necessit`a di avere due operatori di divisione.
Quando a e b sono due array listruzione a\b oppure a/b equivale alla risoluzione del sistema lineare o al
calcolo della soluzione del problema ai minimi quadrati.
Ad esempio, supponiamo che a memorizzi una matrice A quadrata di ordine n e b memorizzi un vettore
(colonna) b di n componenti, allora listruzione
x=a\b
calcola la soluzione del sistema lineare Ax = b con il metodo di eliminazione di Gauss con pivoting
parziale implementato nelle routine della libreria numerica LAPACK.13
12 Si
15
Se m < n, x `e invece la soluzione di minima norma euclidea del sistema sottodeterminato Ax = b.14
Se si vuole costruire un array colonna z o un array c di dimensioni mn mediante una riga di Matlab
equivalente ai cicli for
for i=1:n
z(i)=x(i)/y(j);
end
for i=1:m
for j=1:n
c(i,j)=a(i,j)/b(i,j);
end
end
allora si deve considerare loperatore di divisione (destra o sinistra) come componente a componente. Ci`o
`e possibile facendo precedere loperatore da un punto .
I cicli sopra sono equivalenti alle istruzioni Matlab
z=x./y;
c=a./b;
Se supponiamo che s sia uno scalare e a un array, listruzione Matlab
b=s\a;
equivale a b=a/s e fornisce un array b di dimensioni come quelle di a i cui elementi sono dati dalla
divisione dei rispettivi elementi di a per s. In modo equivalente, se a e b sono due array m n la scrittura
sopra si ottiene con il ciclo
for i=1:m
for j=1:n
b(i,j)=a(i,j)/s;
end
end
Se invece si vuole considerare un array b i cui elementi sono ottenuti dalla divisione di s per il corrispettivo
elemento di a, equivalentemente al ciclo
for i=1:m
for j=1:n
b(i,j)=s/a(i,j);
end
end
si ha listruzione di una riga b=s./a
Anche loperatore di elevamento a potenza pu`o operare tra array. Ad esempio, la scrittura b=a^2 dove a
`e un array quadrato equivale al prodotto matrice per matrice a*a.
14 Quando
la matrice A non `
e quadrata loperatore di divisione equivale alla moltiplicazione per la pseudoinversa di A.
16
Se si vuole invece elevare ogni singolo elemento al quadrato allora listruzione Matlab `e b=a.^2
Operatori relazionali e logici. Gli operatori relazionali in Matlab sono i seguenti:
minore
minore uguale
uguale
maggiore
maggiore uguale
diverso
<
<=
==
>
>=
=
Gli operatori logici in Matlab sono i seguenti:
&
|
&
and
or
not
Si ricorda che il risultato di unespressione relazionale o di unespressione logica `e una variabile logica.
Quando unespressione relazionale ha come operandi degli scalari, la variabile logica, risultato dellespressione, ha come risultato lo scalare 1 o 0 a secondo che il valore della variabile sia, rispettivamente, vero
o falso.
Quando unespressione relazionale ha come operandi degli array della stessa dimensione, la variabile
logica, risultato dellespressione, `e una matrice di 0 e 1 in corrispondenza del valore delle relazioni tra gli
elementi. Ad esempio, le istruzioni Matlab
a=[1 2 3; 4 5 6; 7 8 9];
b=[1 2 3; -1 5.1 6; -2 0 9];
a==b
fornisce
ans=
1 1 1
0 0 1
0 0 1
max(x)
median(x)
sort(x)
all(x)
Le funzioni max(x) e min(x) calcolano il massimo ed il minimo di un array x riga o colonna. Per avere,
ad esempio, un elemento massimo di un array a di due dimensioni, listruzione Matlab `e max(max(a)).
Le funzioni sum(x) e prod(x) calcolano, rispettivamente la somma e il prodotto delle componenti di un
array x riga o colonna, mentre sort ne ordina le componenti in modo cresecente. Le funzioni median(x),
mean(x) e std(x) sono funzioni che calcolano, rispettivamente, lelemento mediano, la media e la deviazione standard di un array x,15 mentre le funzioni any(x) e all(x) applicate ad un array x, (riga o
colonna) restituiscono 1, rispettivamente, se almeno una componente di x `e diversa da zero e se tutte le
componenti di x sono diverse da zero.
Funzioni di matrici. Tra le funzioni di matrici dintinguiamo quelle che creano matrici particolari da
quelle funzioni di matrici che utilizzano le routine di BLAS e di LAPACK.
Tra le funzioni di matrici del primo tipo elenchiamo16
eye(n)
zeros(n)
ones(n)
rand(n)
pascal(n)
hilb(n)
magic(n)
toeplitz(c,r)
zeros(m,n)
ones(m,n)
rand(m,n)
matrice identit`
a di ordine n
matrice nulla n n e m n
matrice di elementi unitari n n e m n
matrice di elementi casuali n n e m n
matrice di Pascal di ordine n
matrice di Hilbert di ordine n
quadrato magico di ordine n
matrice di Toeplitz di ordine n
triu(a)
creano, rispettivamente, una matrice diagonale, di ordine n, con elementi diagonali quelli di A, una matrice
strettamente triangolare inferiore con elementi della parte strettamente triangolare inferiore quelli di A e
una matrice strettamente triangolare superiore con elementi della parte strettamente triangolare superiore
quelli di A.
Inoltre, se a `e un array che memorizza una matrice A di ordine n, le funzioni elementari di matrici
expm, logm e sqrtm calcolano una matrice F (memorizzata in un array f) tale che
f=expm(a);
f=logm(a);
f=sqrtm(a);
=
=
=
F = eA
A = eF
F2 = A
Per quanto riguarda le funzioni di matrici che utilizzano le routine di BLAS e di LAPACK si hanno le
funzioni che calcolano le norme.
Mediante le routine di BLAS si hanno le seguenti funzioni per
15 Si
u
s=t
(xi m)2 /(n 1)
con
m=(
xi )/n (media)
i=1
i=1
16 Per la generazione di numeri casuali al calcolatore le routine utilizzate sono versioni successive della ben nota routine
URAND descritta nel cap. 10, p. 240 in
Forsythe G.E., Malcolm M.A., Moler C.B.: Computer Methods for Mathematical Computations, PrenticeHall Inc.,
Englewood Clis, NJ, 1977.
Dati due vettori c e r di n componenti, la matrice di Toeplitz A, di ordine n, ha elementi aij = cij+1 per i j e
aij = rij+1 per j > i.
18
t = x2
t = x1
t = x
t = min1in |xi |
t = A1
t = A
t = AF
=
=
=
Le funzioni di matrici che utilizzano la libreria LAPACK permettono il calcolo delle fattorizzazioni di
una matrice, e.g., LR e QR, il calcolo degli autovalori di una matrice quadrata e i valori singolari di una
matrice generica.
Le istruzioni in linguaggio Matlab:
[l1 r1]=lu(a);
[l2 r2 p]=lu(a);
eseguono la fattorizzazione A = LR con pivoting parziale richiamando la routine della libreria numerica
LAPACK.
Nella prima istruzione in l1 vengono memorizzati gli elementi di (Ln1 Pn1 L2 P2 L1 P1 )1 mentre in
r1 gli elementi di R.
Nella seconda istruzione l2 contiene gli elementi di (Ln1 Pn1 L2 P2 L1 P1 )1 nella parte tringolare
inferiore; p memorizza la matrice delle permutazioni P = Pn1 P2 P1 tale che l1 = p*l2. Larray r2
contiene la matrice triangolare superiore R.
Si veda lesempio seguente:
a=[1 1 2 4; 2 -1 3 1; 3 1 -1 2; 1 -1 -1 1];
[l1 r1]=lu(a);
l1
l1=
0.3333
0.6667
1.0000
0.3333
-0.4000
1.0000
0
0.8000
1.0000
0
0
-0.9474
0
0
0
1.0000
r1
r1=
3.0000
1.0000 -1.0000
0 -1.6667
3.6667
0
0
3.8000
0
0
0
2.0000
-0.3333
3.2000
3.6316
[l2 r2 p]=lu(a);
l2
l2=
1.0000
0
0.6667
1.0000
0.3333 -0.4000
0.3333
0.8000
19
0
0
1.0000
-0.9474
0
0
0
1.0000
r2
r2=
3.0000
0
0
0
1.0000
-1.6667
0
0
-1.0000
3.6667
3.8000
0
0
0
1
0
0
1
0
0
1
0
0
0
2.0000
-0.3333
3.2000
3.6316
p
p=
0
0
0
1
0
1
1
-1
1
-1
1
-1
1
-1
0
0
1
1
-1
1
-1
1
-1
1
0
0
0
1
1
-1
1
-1
1
-1
0
0
0
0
1
1
-1
1
-1
1
0
0
0
0
0
1
1
-1
1
-1
0
0
0
0
0
0
1
1
-1
1
0
0
0
0
0
0
0
1
1
-1
0
0
0
0
0
0
0
0
1
1
1
-1
1
-1
1
-1
1
-1
1
1];
0
1
1
-1
1
-1
1
-1
1
-1
0
0
1
1
-1
1
-1
1
-1
1
0
0
0
1
1
-1
1
-1
1
-1
0
1
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
1
1
-1
1
-1
1
0
0
0
0
0
1
1
-1
1
-1
0
0
0
0
0
0
1
1
-1
1
0
0
0
0
0
0
0
1
1
-1
0
0
0
0
0
0
0
0
1
1
r
r=
1
0
0
0
0
0
0
0
0
0
17 Si
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
1
0
0
20
0
0
0
0
0
0
0
0
1
0
1
-2
4
-8
16
-32
64
-128
256
-510
0
0
0
0
0
0
0
0
0
1
Le routine del LAPACK che calcolano la soluzione di un sistema lineare con il metodo di eliminazione di
Gauss con pivoting parziale sono usate anche dalla funzione di matrice inv(a), per il calcolo dellinversa
della matrice A di ordine n. Infatti, il calcolo della matrice inversa si ottiene risolvendo n sistemi lineari
con A come matrice dei coecienti e i vettori della base canonica come termini noti.
La routine di LAPACK per il calcolo della fattorizzazione di Choleski di una matrice simmetrica e denita
positiva `e usata per il calcolo del fattore di Choleski mediante la funzione di matrice chol. Data la matrice
simmetrica e denita positiva A e memorizzata nellarray a, listruzione r=chol(a) memorizza nellarray
r la matrice triangolare superiore LT della fattorizzazione A = LLT .
Le istruzioni in linguaggio Matlab:
[q1 r1]=qr(a);
[q2 r2 p]=qr(a);
eseguono la fattorizzazione A = QR, rispettivamente senza e con scambi di colonne richiamando la routine
di LAPACK.
Nel secondo caso i valori diagonali di r2 sono in ordine decrescente e larray p memorizza la matrice di
permutazione necessaria per lo scambio di colonne.18
La fattorizzazione QR con scambio di colonne `e utilizzata per il calcolo del rango (numerico) di una
matrice mediante listruzione rank(a).
La funzione di matrice
eig(a)
fornisce gli autovalori della matrice A calcolati con lalgortimo QR iterativo richiamando la routine del
LAPACK. Ovvero, listruzione l=eig(a) fornisce un array colonna l contenente gli autovalori di A;
listruzione [X D]=eig(a) fornisce due matrici X e D rispettivamente, contenenti gli autovettori di A
nelle colonne di X e gli autovalori di A negli elementi diagonali della matrice diagonale D.
Si osserva che se k `e il numero di iterazioni necessarie per la convergenza del metodo QR iterativo,
supponendo A simmetrica, il metodo calcola
D = QTk QT2 QT1 AQ1 Q2 Qk
allora la matrice le cui colonne sono gli autovettori `e data da Q1 Q2 Qk .
Il calcolo degli autovalori mediante il LAPACK permette anche il calcolo del determinante di una matrice
quadrata memorizzata nellarray a. La funzione di matrici det(a) esegue tale calcolo.
La funzione di matrice
svd(a)
fornisce i valori singolari della matrice A, m n con m n richiamando la routine del LAPACK.
Ovvero, listruzione s=svd(a) fornisce un array colonna s contenente i valori singolari di A; listruzione
[u s v]=eig(a) fornisce le matrici U , e V T (memorizzate, rispettivamente negli array u, s e v) della
decomposizione ai valori singolari
A = U V T
La decomposizione ai valori singolari U V T `e utilizzata per il calcolo della norma spettrale di una
matrice e per il calcolo del numero di condizione di una matrice mediante le funzioni di matrici norm(a)
o norm(a,2) e cond(a).
Inne se x `e un array di n elementi e memorizzato nellarray x, riga o colonna, le funzioni fft(x) e
ifft(x) restitutiscono, rispettivamente, il vettore trasformata di Fourier e trasformata inversa di Fourier
di x.
21
di componenti, il primo contenente i valori delle ascisse ed il secondo quelli delle ordinate dei punti di
graca (x(i),y(i)). La funzione plot unisce i punti del piano19 (x(1),y(1)) con (x(2),y(2)),
(x(2),y(2)) con (x(3),y(3)), (x(3),y(3)) con (x(4),y(4)) e cos` via.
Il graco di y = x2 tra 2 e 2, si visualizza con le istruzioni
x=-2:0.1:2;
y=x.^2;
plot(x,y,-r);
Il terzo argomento tra apici della funzione plot concerne il tipo di linea con cui visualizzare il graco
(- indica linea continua) e il colore della linea (r indica il colore rosso).20
Il graco della funzione di Runge pu`
o essere visualizzato in Matlab nel modo seguente:
x=-1:0.01:1;
y=1./(1+25*x.^2);
plot(x,y,-r);
Supponiamo ora di voler calcolare i coecienti del polinomio di interpolazione di grado n passante per
n+1 punti assegnati (t(i),f(i)), i=1,...,n+1, dove t(i) sono punti equidistanti nellintervallo [1, 1]
e f(i) assumono i valori della funzione di Runge in corrispondenza dei punti t(i).
La funzione in Matlab che calcola i coecienti di tale polinomio `e polyfit. Allora, le istruzioni sono le
seguenti:21
n=input( grado del polinomio = );
for j=1:n+1
t(j)=-1+2*(j-1)/n;
end
f=1./(1+25*x.^2);
alfa=polyfit(t,f,n);
Per visualizzare22 il polinomio di interpolazione appena calcolato si usa la funzione polyval che ha come
argomenti larray alfa contenente i coecienti del polinomio ed larray z contenente i punti in cui si
vuole gracare tale polinomio. Dunque, le istruzioni sono
z=-1:0.01:1;
p=polyval(alfa,z);
plot(z,p,:b);
Sottoprogrammi in Matlab
Abbiamo visto che le istruzioni di un programma (principale) in linguaggio Matlab sono scritte ed eseguite
direttamente dalla linea dei comandi oppure sono memorizzate in un le, detto script file, che ha un nome
e lestensione .m. Lesecuzione dello script le, che avviene digitando dalla linea dei comandi il nome del
le stesso, permette lesecuzione delle istruzioni.
Tra le istruzioni Matlab vi sono le chiamate alle funzioni. In Matlab `e possibile costruire delle funzioni
da parte dellutente. Queste funzioni saranno scritte in un function file che deve essere salvato con un
nome e lestensione .m. Il nome del le deve essere lo stesso di quello della funzione e non deve essere
uguale al nome di una variabile o di ogni altra funzione o di una parola chiave.
Si vede nel seguito, lesempio di una funzione per il calcolo delle radici x1 e x2 di unequazione di secondo
grado ax2 + bx + c = 0.
19 Ovvero
22
Si suppone che il function le, contenente le istruzioni di seguito elencate abbia nome grado2.m.
function [x1,x2] = grado2(a,b,c)
% risoluzione di unequazione di secondo grado
x1=(-b-sign(b)*sqrt(b^2-4*a*c))/(2*a);
x2=c/(a*x1);
end
Le istruzioni che eseguono il calcolo dellequazione di secondo grado mediante la funzione grado2 sono le
seguenti. Tali istruzioni si scrivono o dalla linea dei comandi o in uno script le.
a=input( a= );
b=input( b= );
b=input( c= );
[x,y]=grado2(a,b,c);
disp(x),disp(y);
Si osserva che una funzione ha nella prima riga la parola chiave function e lultima istruzione `e sempre
la parola chiave end.
Nellesempio, le variabili a, b e c sono gli argomenti di ingresso e x1 e x2 sono i due argomenti di uscita.
Ogni cambiamento dei valori delle variabili a, b o c nella function non sono sentiti a livello del programma principale.23 Listruzione help grado2 visualizza il commento risoluzione di unequazione
di secondo grado.
23 Se si vogliono modicare i parametri di ingresso, bisogna che questi, allinterno della function e a livello di programma
principale siano dichiarati globali mediante la parola chiave global.
23