Sei sulla pagina 1di 18

AMBIENTE DI PROGRAMMAZIONE

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 avan-
zati.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.
5 Per una pi`u estesa introduzione allambiente di programmazione Matlab, si vedano i capitoli 1 e 2 di
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
a=[1 2 3; 4 5 6; ...
4 5 6 oppure
7 8 9];
7 8 9];

6
allora il sistema risponde con
a=
1 2 3
4 5 6
7 8 9

Se si vuole indicare un elemento dellarray a, si utilizza, come in linguaggio Fortran, la notazione tra
parentesi tonde. Ad esempio, lelemento a(1,2) indica lelemento della prima riga e seconda colonna
dellarray a.
Le successive due istruzioni Matlab sono esempi in cui si modica o si usa allinterno di unespressione
aritmetica un elemento dellarray:
a(1,1)=10
a(1,2)=a(1,1)+5

Larray a memorizza ora la matrice


10 15 3
A= 4 5 6
7 8 9
Il dimensionamento in Matlab `e automatico: Ad esempio se si pone

b=[1 2 3; 4 5 6];

e successivamente si scrive listruzione


b=[1 0; 0 1];

allora il sistema riconosce che larray b ha cambiato dimensione da 2 3 a 2 2.


Se si scrive la seguente istruzione Matlab

c=[1 2; 3 4];

e successivamente
c(4,3)=10;

allora Matlab rende larray c grande abbastanza in modo che listruzione abbia senso; larray c ora `e un
array 4 3 e memorizza la matrice
1 2 0
3 4 0
C= 0

0 0
0 0 10
I vettori riga o colonna sono memorizzati in array di una riga e pi`
u colonne o di pi`
u righe ed una colonna
rispettivamnte, e possono essere indicizzati mediante una sola componente. Ad esempio le istruzioni

x=[1; 2; 3; 4];
y=[1 2 3 4];

creano gli array x di dimensione 4 1 e y di dimensione 1 4.


La scrittura
x(1)=y(2)+1;

cambia il valore della prima componente di x in 3.

7
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 1000
20 2000
30 3000
40 4000
50 5000

8
mentre listruzione Matlab
c3=a([2 4],:);

fornisce come risultato larray due dimensionale c3, che contiene la seconda e la quarta riga di a, i.e.,

c3=
2 20 200 2000
4 40 400 4000

cos` come listruzione Matlab


c4=a([1:3 5],2:4);

fornisce come risultato larray due dimensionale c4, che contiene gli elementi della seconda e quarta
colonna della prima, della seconda, della terza e della quinta riga riga di a, i.e.,

c4=
10 100 1000
20 200 2000
30 300 3000
50 500 5000

Le seguenti istruzioni creano gli array bidemensionali b, a1 e a2:

b=[1 2 3 4 5 6 7 8 9;
1 2 3 4 5 6 7 8 9;
1 2 3 4 5 6 7 8 9;
1 2 3 4 5 6 7 8 9;
1 2 3 4 5 6 7 8 9];
a1=a;
a2=a;

Allora le istruzione Matlab


a1(:,2)=b(:,1);
a2(:,[2 4 1])=b(:,6:8);

forniscono i risultati
a1=
1 1 100 1000
2 1 200 2000
3 1 300 3000
4 1 400 4000
5 1 500 5000
a2=
8 6 100 7
8 6 100 7
8 6 300 7
8 6 400 7
8 6 500 7

In Matlab `e possibile indicare il trasposto di un vettore o di una matrice con il simbolo .


Ad esempio se si assegnano gli array
x=[1 2 3 4];
a[1 2; 3 4];

9
allora le istruzioni Matlab
y=x;
b=a;

creano due array y e b cos` fatti


y=
1
2
3
4
b=
1 3
2 4

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
creando un programma/le (utilizzando il men` u a tendina) in cui le istruzioni sono elencate una
sotto laltra oppure, se separate da ; una accanto allaltra.
Il programma contenente le istruzioni viene salvato in un le Matlab che ha un nome e lestensione
.m
Il nome del le non deve essere uguale al nome di una variabile o di ogni altra funzione Matlab o
di una parola chiave.
Il le viene eseguito (ovvero le istruzioni contenute nel le vengono eseguite) direttamente scrivendo
il nome del le sulla linea dei comandi e premendo il tasto Invio.
Se in un le Matlab, scriviamo unistruzione il cui primo simbolo `e %, allora la riga di quella istruzione
non viene processata (tradotta/eseguita); il simbolo % `e il simbolo del commento. Le righe commentate di
un le vengono visualizzate se dalla linea dei comandi si scrive help seguito dal nome del le e si preme
il tasto Invio.
In Matlab esistono allora diverse funzioni predefinite. Ad esempio, vi sono:
1. le funzioni che permettono durante una sessione Matlab, di muoversi tra i direttori (directory) o
di gestire le (e.g., cd, dir o ls, pwd, whos ...);
2. le funzioni per la gestione delle variabili: e.g., funzioni che permettono di salvare le variabili utilizzate
in una sessione di Matlab (save) e richiamarle in una sessione successiva (load); la funzione clear
che azzera il contenuto delle (o della) variabili; la funzione format short o format long che
visualizza il contenuto delle variabili con 4 o 15 cifre rispettivamente, dopo il punto radice.
3. le funzioni matematiche elementari;

4. le funzioni di vettori e matrici. Queste funzioni vengono considerate nel paragrafo successivo.
Le funzioni matematiche elementari in Matlab sono come quelle degli altri linguaggi di programmazione
come il Fortran. Ad esempio, listruzione

y=sqrt(2);

calcola la radice quadrata di 2 e la memorizza nella variabile y. Si riportano le denominazioni delle pi`
u
comuni funzioni elementari dove largomento `e contenuto nella variabile x (e y):

sin(x) cos(x) tan(x) asin(x) acos(x)


atan(x) sinh(x) cosh(x) tanh(x) exp(x)
log(x) log10(x) abs(x) sqrt(x) sign(x)
mod(x,y) round(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

Riportiamo ora la sintassi Matlab per le istruzioni elementari di lettura e scrittura.

11
Istruzione di lettura. Listruzione Matlab

x=input(...);

opera nel seguente modo:


visualizza su schermo il contenuto della sequenza di caratteri tra apici;
aspetta lintroduzione dei dati da tastiera;
memorizza i dati introdotti nella variabile x.
Ad esempio, se si vuole assegnare alla variabile x il valore 3, allarray a gli elementi della matrice
( )
1 2
3 4

e alla variabile carattere c la sequenza di caratteri PROVA, le tre istruzioni

x=input(dato=);
a=input(matrice=);
c=input(stringa=,s);

sono seguite da
dato=3
matrice=[1 2; 3 4]
stringa=PROVA

Istruzione di scrittura. Listruzione Matlab

disp(x);

visualizza sullo schermo il contenuto della variabile x. In Matlab `e comunque possibile visualizzare il
contenuto di una variabile mediante unistruzione dove compare solo il nome della variabile stessa (senza
; alla ne).
Unaltra istruzione di scrittura `e fprintf.8

Si riporta ora la sintassi in linguaggio Matlab dellistruzione di scelta e del costrutto di ciclo.
Istruzione di scelta. Il costrutto di if in Matlab si scrive nel modo seguente:

if espressione logica
istruzione/i
end

Nel caso di scelta dicotomica si ha


if espressione logica
istruzione/i 1
else
istruzione/i 2
end

Si osserva che nellistruzione di scelta, il risultato dellespressione logica `e di tipo logico. In Matlab tale
tipo di variabile non `e presente; risulta essere un valore aritmetico ed in particolare tale valore `e 1 se
lespressione logica `e vera e 0 se `e falsa.
8 Si digiti help fprintf per le speciche dellistruzione.

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 rispettiva-
mente 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:

+ addizione
- sottrazione
* moltiplicazione
^ elevamento a potenza
/ divisione (a destra)
\ divisione a sinistra
trasposizione
9 Listruzione completa di indice del passo `
e x=1:1:n;. Lindice del passo `
e il valore in mezzo.

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.
11 Larray y del ciclo annidato di for del calcolo matrice per vettore risulta essere un array riga.

14
for i=1:m
for i=1:m
for i=1:m for j=1:n
s=0 y(i)=0;
for j=1:n c(i,j)=0;
for i=1:n for j=1:n
a(i,j)=x(i)*y(j); for k=1:p
s=s+x(i)*y(j); y(i)=y(i)+a(i,j)*x(j);
end c(i,j)=c(i,j)+a(i,k)+b(k,j);
end end
end end
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:m
for i=1:n for j=1:n
z(i)=x(i)*y(j); c(i,j)=a(i,j)*b(i,j);
end 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
ricorda che loperazione globale con array b=s*a `e presente anche in Fortran 90.
13 In e una colonna ed equivale a x = A1 b. Listruzione y=b/a fornisce invece un array y, riga,
questo caso, larray x `
ottenuto come bT A1 . Loperatore di divisione equivale alla moltiplicazione per linversa di A.

15
Se supponiamo che a memorizzi una matrice A, m n e b memorizzi un vettore (colonna) b di m
componenti, allora listruzione

x=a\b

calcola larray x mediante il metodo QR, implementato nelle routine della libreria numerica LAPACK;
se m > n, x `e la soluzione del problema dei minimi quadrati

min Ax b22
x

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:m
for i=1:n for j=1:n
z(i)=x(i)/y(j); c(i,j)=a(i,j)/b(i,j);
end 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 dellespres-
sione, 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

Funzioni di vettori e di matrici


Prima di introdurre le funzioni di vettori e di matrici, si ricorda che il linguaggio Matlab prevede due
funzioni che permettono il dimensionamento di un array (funzioni di dimensione).
Se si ha un array a di due dimensioni, la funzione size, se applicata ad a, fornisce due scalari, il primo
contenente il numero di righe mentre il secondo il numero di colonne di a. Si vogliono memorizzare questi
due valori nelle variabili m e n. Listruzione per chiamare la funzione size che restituisce due valori in
uscita `e
[m,n]=size(a);

Listruzione length, quando applicata ad un array x, riga o colonna, restituisce il numero delle componenti
dellarray. Se si memorizza nella variabile n tale valore, listruzione `e

n=length(x);

Funzioni di vettori. Lambiente Matlab prevede funzioni che operano essenzialmente su un vettore
(riga o colonna) ma applicate ad una matrice (m n, m 2) agiscono su ogni colonna producendo un
vettore riga contenente i risultati di ogni colonna. Tra queste funzioni pi`
u comuni, applicate ad un array
x, ci sono

17
max(x) min(x) sum(x) prod(x) sort(x)
median(x) mean(x) std(x) any(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 devi-
azione 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) matrice identit`
a di ordine n
zeros(n) zeros(m,n) matrice nulla n n e m n
ones(n) ones(m,n) matrice di elementi unitari n n e m n
rand(n) rand(m,n) matrice di elementi casuali n n e m n
pascal(n) matrice di Pascal di ordine n
hilb(n) matrice di Hilbert di ordine n
magic(n) quadrato magico di ordine n
toeplitz(c,r) matrice di Toeplitz di ordine n
Se a `e un array che memorizza una matrice A di ordine n, le funzioni di matrici

diag(a) tril(a) 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 = eA
f=logm(a); = A = eF
f=sqrtm(a); = 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 ricorda la formula della deviazione standard di un vettore x di n componenti:
v
u n
u n
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
le norme di un nvettore x (memorizzato in un array x, riga o colonna)

t=norm(x); t=norm(x,2); = t = x2
t=norm(x,1); = t = x1
t=norm(x,inf); = t = x
t=norm(x,-inf); = t = min1in |xi |

le norme di una matrice A, di m righe ed n colonne (memorizzata in un array a)

t=norm(a,1); = t = A1
t=norm(a,inf); = t = A
t=norm(a,fro); = 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.4000 1.0000 0
0.6667 1.0000 0 0
1.0000 0 0 0
0.3333 0.8000 -0.9474 1.0000

r1
r1=
3.0000 1.0000 -1.0000 2.0000
0 -1.6667 3.6667 -0.3333
0 0 3.8000 3.2000
0 0 0 3.6316
[l2 r2 p]=lu(a);
l2
l2=
1.0000 0 0 0
0.6667 1.0000 0 0
0.3333 -0.4000 1.0000 0
0.3333 0.8000 -0.9474 1.0000

19
r2
r2=
3.0000 1.0000 -1.0000 2.0000
0 -1.6667 3.6667 -0.3333
0 0 3.8000 3.2000
0 0 0 3.6316
p
p=
0 0 1 0
0 1 0 0
1 0 0 0
0 0 0 1

Si nota come17 se si considera la matrice A seguente


a=[1 0 0 0 0 0 0 0 0 1
1 1 0 0 0 0 0 0 0 -1
-1 1 1 0 0 0 0 0 0 1
1 -1 1 1 0 0 0 0 0 -1
-1 1 -1 1 1 0 0 0 0 1
1 -1 1 -1 1 1 0 0 0 -1
-1 1 -1 1 -1 1 1 0 0 1
1 -1 1 -1 1 -1 1 1 0 -1
-1 1 -1 1 -1 1 -1 1 1 1
1 -1 1 -1 1 -1 1 -1 1 1];

e si esegue listruzione che richiama la funzione lu

[l r]=lu(a);

si ottengono i seguenti fattori L ed R in accordo con lanalisi allindietro dellerrore per la fattorizzazione
LR:
l
l=
1 0 0 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0 0 0
-1 1 1 0 0 0 0 0 0 0
1 -1 1 1 0 0 0 0 0 0
-1 1 -1 1 1 0 0 0 0 0
1 -1 1 -1 1 1 0 0 0 0
-1 1 -1 1 -1 1 1 0 0 0
1 -1 1 -1 1 -1 1 1 0 0
-1 1 -1 1 -1 1 -1 1 1 0
1 -1 1 -1 1 -1 1 -1 1 1
r
r=
1 0 0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0 0 -2
0 0 1 0 0 0 0 0 0 4
0 0 0 1 0 0 0 0 0 -8
0 0 0 0 1 0 0 0 0 16
0 0 0 0 0 1 0 0 0 -32
0 0 0 0 0 0 1 0 0 64
0 0 0 0 0 0 0 1 0 -128
0 0 0 0 0 0 0 0 1 256
0 0 0 0 0 0 0 0 0 -510

17 Si veda 7.3 del fascicolo Metodi di fattorizzazione per problemi lineari.

20
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.

Grafico di una funzione


Per visualizzare il graco di una curva in Matlab, si usa la funzione plot. Ad esempio se si vuole
visualizzare tra 2 e 2 il graco di y = x2 , allora si costruiscono due array x e y, di uguale numero
18 Se si esegue la fattorizzazione QR con scambi di colonne, allora, mediante le trasformazione di Householder si triango-

larizza la matrice A e si ha QT AP = R (si veda 6.6 e 6.7 del fascicolo Metodi di fattorizzazione per problemi lineari).

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 la funzione plot accende i pixel del segmento congiungente i punti.
20 Si veda help plot per tutte le altre opzioni.
21 Se il valore di n `
e inferiore al numero delle componenti meno 1 di t ed f, allora la funzione polyfit calcola i coecienti
del polinomio di migliore approssimazione in norma Euclidea.
22 La funzione hold on permette che due o pi` u successivi graci di funzioni siano visualizzati sulla stessa gura.

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 pro-
gramma 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

Potrebbero piacerti anche