Sei sulla pagina 1di 18

AMBIENTE DI PROGRAMMAZIONE

MATLAB

Scrittura di matrici

Matlab (MATrix LABoratory) `e un ambiente di programmazione nato nell’ambito dell’Analisi Numerica 4 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 effettuata 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 grafica in Matlab, il trattamento dei dati e dei file, tutti quegli aspetti che richiedono l’interazione con il sistema operativo adottato o “pacchetti” (toolboxes) di specifici argomenti o applicazioni. Per tali aspetti si pu`o considerare la guida all’utente di Matlab o l’help 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, l’utente pu`o creare matrici e vettori ed eseguire calcoli con essi. Ad esempio le matrici possono essere introdotte esplicitamente mediante l’istruzione 6

5

a=[1

2

3;

4

6;

7

8

9];

che assegna alla variabile a, array 3 × 3, in precisione doppia, la matrice

A =

1

4

7

2

5

8

3

6

9

Se l’istruzione finisce con il simbolo “;”, allora il risultato dell’istruzione non viene visualizzato. Ad esempio, se si scrive l’istruzione

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 all’ambiente 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

4

5

6

oppure

7

8

9];

a=[1

2

3;

4

5

6;

7

8

9];

6

allora il sistema risponde con

a=

1

4

7

2

5

8

3

6

9

Se si vuole indicare un elemento dell’array a, si utilizza, come in linguaggio Fortran, la notazione tra parentesi tonde. Ad esempio, l’elemento a(1,2) indica l’elemento della prima riga e seconda colonna dell’array a. Le successive due istruzioni Matlab sono esempi in cui si modifica o si usa all’interno di un’espressione aritmetica un elemento dell’array:

a(1,1)=10

a(1,2)=a(1,1)+5

L’array a memorizza ora la matrice

 

A =

10

15

3

4 5

7 8

 

6

9

Il

dimensionamento in Matlab `e automatico: Ad esempio se si pone

 

b=[1

2

3;

4

5

6];

e

successivamente si scrive l’istruzione

 

b=[1

0;

0

1];

 

allora il sistema riconosce che l’array b ha cambiato dimensione da 2 × 3 a 2 × 2. Se si scrive la seguente istruzione Matlab

e successivamente

c=[1

2;

3

4];

c(4,3)=10;

allora Matlab rende l’array c grande abbastanza in modo che l’istruzione abbia senso; l’array c ora `e un array 4 × 3 e memorizza la matrice

C =

1

3

0

0

2

4

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 l’array a, 5 × 4

300

a=[1

10

100

1000;

2

20

200

2000;

3

30

3000;

4

40

400

4000;

5

50

500

5000];

allora, l’istruzione

x=a(1:4,3);

fornisce come risultato l’array x, colonna, che ha nei primi quatto elementi la terza colonna di a, i.e.,

L’istruzione Matlab

x=

100

200

300

400

y=a(:,3);

fornisce come risultato l’array y, colonna, uguale alla terza colonna di a, i.e.,

L’istruzione Matlab

y=

100

200

300

400

500

c1=a(1:3,:);

fornisce come risultato l’array due dimensionale c1, che contiene le prime tre righe di a, i.e.,

L’istruzione Matlab

c1=

1 10

100

1000

2 20

200

2000

3 30

300

3000

c2=a(:,[2

4]);

fornisce come risultato l’array 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

mentre l’istruzione Matlab

c3=a([2

4],:);

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

cos`ı come l’istruzione Matlab

c3=

2

4

20

40

c4=a([1:3

200

400

2000

4000

5],2:4);

fornisce come risultato l’array 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

dall’elemento (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 definite 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, l’istruzione Matlab

3+2;

assegna alla variabile ans il valore 5, i.e.,

ans=

5

In Matlab vi sono delle costanti predefinite. Ad esempio pi ha il valore in precisione doppia di π, eps `e

2.22 · 10 16 che `e il valore della precisione di macchina su 64 bit, i e j hanno espressione in Matlab 0

+ 1.0000i e sono l’espressione in Matlab dell’unit`a immaginaria i = 1.

Se si assegna un valore ad una costante predefinita, 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 10 4 si scrive indistintamente 1.e-4, 1.d-4). L’istruzione in Matlab pu`o essere eseguita

direttamente dalla linea di comando, scrivendo l’istruzione accanto a >>, prompt dei comandi Matlab, e premendo il tasto Invio;

7 Se si vogliono modificare i tipi delle variabili in uso si usano le istruzioni (funzioni) di modifica di tipo; si veda help datatypes.

10

creando un programma/file (utilizzando il men`u a tendina) in cui le istruzioni sono elencate una sotto l’altra oppure, se separate da “;” una accanto all’altra.

Il programma contenente le istruzioni viene salvato in un file Matlab che ha un nome e l’estensione .m

Il

nome del file non deve essere uguale al nome di una variabile o di ogni altra funzione Matlab o

di

una parola chiave.

Il file viene “eseguito” (ovvero le istruzioni contenute nel file vengono eseguite) direttamente scrivendo il nome del file sulla linea dei comandi e premendo il tasto Invio.

Se in un file Matlab, scriviamo un’istruzione 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 file vengono visualizzate se dalla linea dei comandi si scrive help seguito dal nome del file 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

);

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.

di gestire file (e.g., cd, dir o ls, pwd, whos

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, l’istruzione

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 l’argomento `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 l’argomento di una funzione elementare `e un array, allora il risultato `e un array delle dimensioni dell’argomento i cui valori sono i valori della funzione elementare applicate agli elementi dell’array. Ad esempio le istruzioni

forniscono

x=[4;

y=sqrt(x)

9;

y=

2

3

4

16];

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

11

Istruzione di lettura. L’istruzione Matlab

opera nel seguente modo:

x=input(’

’);

visualizza su schermo il contenuto della sequenza di caratteri tra apici;

aspetta l’introduzione dei dati da tastiera;

memorizza i dati introdotti nella variabile x.

Ad esempio, se si vuole assegnare alla variabile x il valore 3, all’array a gli elementi della matrice

(

1

3

2

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. L’istruzione Matlab

disp(x);

visualizza sullo schermo il contenuto della variabile x. In Matlab `e comunque possibile visualizzare il contenuto di una variabile mediante un’istruzione dove compare solo il nome della variabile stessa (senza “;” alla fine). Un’altra istruzione di scrittura `e fprintf. 8

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

Nel caso di scelta dicotomica si ha

if espressione logica istruzione/i end

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

Si osserva che nell’istruzione di scelta, il risultato dell’espressione 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 l’espressione logica `e vera e 0 se `e falsa.

8 Si digiti help fprintf per le specifiche dell’istruzione.

12

Il ciclo. Il costrutto Fortran di do in Matlab si scrive come costrutto di for nel modo seguente:

for

istruzione/i

end

i=i1:i2:13

Con i si `e indicata la variabile contatore, con i1 e i3 si sono denotati l’indice iniziale e finale 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,

x(2),

alle componenti x(1),

,n

,x(n),

il ciclo

for

x(i)=i;

end

i=1:n

costruisce tale array riga. In modo equivalente l’array x pu`o essere ottenuto dall’istruzione

x=1:n;

che indica che ad x sono assegnati tutti i valori da 1 a n, con passo 1. 9 Utilizzando l’indicizzazione degli array in Matlab, il prodotto matrice per vettore

si pu`o scrivere

for

y(i)=0;

for

y(i)=y(i)+a(i,j)*x(j);

end

end

i=1:m

j=1:n

for

y(i)=y(i)+a(i,1:n)*x(1:n);

end

i=1:m

Il costrutto di while in Matlab si scrive

while espressione logica istruzione/i end

Le istruzione/i sono eseguite fintanto che l’espressione logica `e vera.

L’istruzione break. L’istruzione break in Matlab equivale all’istruzione 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 L’istruzione completa di indice del passo `e x=1:1:n;. L’indice 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 l’istruzione

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, l’istruzione 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 ciclo 10

for

for

b(i,j)=a(i,j)+s

end

end

i=1:m

j=1:n

L’operatore 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 l’istruzione

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, l’istruzione

a=x*y’;

fornisce l’array 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 a ij

= x i y j .

Se

a `e un array di dimensioni m×n e x `e un array colonna di n componenti, l’istruzione

y=a*x;

fornisce l’array 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, l’istruzione 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 L’array y del ciclo annidato di for del calcolo matrice per vettore risulta essere un array riga.

14

s=0

for

s=s+x(i)*y(j);

end

i=1:n

for

for

a(i,j)=x(i)*y(j);

end

end

i=1:m

j=1:n

for

y(i)=0;

for

y(i)=y(i)+a(i,j)*x(j);

end

end

i=1:m

j=1:n

for

for

c(i,j)=0;

for

c(i,j)=c(i,j)+a(i,k)+b(k,j);

end

end

i=1:m

j=1:n

k=1:p

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 m×n 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 l’operatore * come componente a componente. Ci`o `e possibile facendo precedere l’operatore 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, l’istruzione 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 ciclo 12

for

for

b(i,j)=a(i,j)*s;

end

end

i=1:m

j=1:n

L’operatore 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 l’istruzione 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 l’istruzione

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 l’operazione “globale” con array b=s*a `e presente anche in Fortran 90. 13 In questo caso, l’array x `e una colonna ed equivale a x = A 1 b. L’istruzione y=b’/a fornisce invece un array y, riga, ottenuto come b T A 1 . L’operatore di divisione equivale alla moltiplicazione per l’inversa di A.

15

Se supponiamo che a memorizzi una matrice A, m × n e b memorizzi un vettore (colonna) b di m componenti, allora l’istruzione

x=a\b

calcola l’array 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 b2

x

2

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 m×n 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 l’operatore di divisione (destra o sinistra) come componente a componente. Ci`o

`e possibile facendo precedere l’operatore 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, l’istruzione 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

for

b(i,j)=a(i,j)/s;

end

end

i=1:m

j=1:n

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

for

b(i,j)=s/a(i,j);

end

end

i=1:m

j=1:n

si ha l’istruzione di una riga b=s./a Anche l’operatore 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 l’operatore di divisione equivale alla moltiplicazione per la pseudoinversa di A.

16

Se si vuole invece elevare ogni singolo elemento al quadrato allora l’istruzione 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 un’espressione relazionale o di un’espressione logica `e una variabile logica. Quando un’espressione relazionale ha come operandi degli scalari, la variabile logica, risultato dell’espres- sione, ha come risultato lo scalare 1 o 0 a secondo che il valore della variabile sia, rispettivamente, vero o falso. Quando un’espressione relazionale ha come operandi degli array della stessa dimensione, la variabile logica, risultato dell’espressione, `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. L’istruzione per chiamare la funzione size che restituisce due valori in uscita `e

[m,n]=size(a);

L’istruzione length, quando applicata ad un array x, riga o colonna, restituisce il numero delle componenti dell’array. Se si memorizza nella variabile n tale valore, l’istruzione `e

n=length(x);

Funzioni di vettori. L’ambiente 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, l’istruzione 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, l’elemento 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 elenchiamo 16

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 = e A

f=logm(a);

=

A = e F

f=sqrtm(a); =

F 2 = 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:

s =

n

i=1

(x i m) 2 /(n 1)

con

m = (

n

i=1

x i )/n

(media)

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, Prentice–Hall Inc., Englewood Cliffs, NJ, 1977.

e

Dati due vettori c e r di n componenti, la matrice di Toeplitz A, di ordine n, ha elementi a ij

= c ij+1

per i

j

a ij = r ij+1 per

j > i.

18

le norme di un n–vettore 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 = min 1in |x i |

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 (L n1 P n1 · · · L 2 P 2 L 1 P 1 ) 1 mentre in r1 gli elementi di R. Nella seconda istruzione l2 contiene gli elementi di (L n1 P n1 · · · L 2 P 2 L 1 P 1 ) 1 nella parte tringolare inferiore; p memorizza la matrice delle permutazioni P = P n1 · · · P 2 P 1 tale che l1 = p*l2. L’array r2 contiene la matrice triangolare superiore R. Si veda l’esempio 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 come 17 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 l’istruzione che richiama la funzione lu

[l

r]=lu(a);

si

ottengono i seguenti fattori L ed R in accordo con l’analisi all’indietro dell’errore 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 dell’inversa della matrice A di ordine n. Infatti, il calcolo della matrice inversa si ottiene risolvendo n sistemi lineari con A come matrice dei coefficienti 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 definita positiva `e usata per il calcolo del fattore di Choleski mediante la funzione di matrice chol. Data la matrice simmetrica e definita positiva A e memorizzata nell’array a, l’istruzione r=chol(a) memorizza nell’array r la matrice triangolare superiore L T della fattorizzazione A = LL T .

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 l’array 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 l’istruzione rank(a).

La funzione di matrice eig(a)

fornisce gli autovalori della matrice A calcolati con l’algortimo QR iterativo richiamando la routine del LAPACK. Ovvero, l’istruzione l=eig(a) fornisce un array colonna l contenente gli autovalori di A; l’istruzione [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 = Q T · · · Q T Q T AQ 1 Q 2 · · · Q k

k

2

1

allora la matrice le cui colonne sono gli autovettori `e data da Q 1 Q 2 · · · Q k .

Il calcolo degli autovalori mediante il LAPACK permette anche il calcolo del determinante di una matrice

quadrata memorizzata nell’array 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, l’istruzione s=svd(a) fornisce un array colonna s contenente i valori singolari di A; l’istruzione [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).

Infine se x `e un array di n elementi e memorizzato nell’array 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

Ad esempio se si vuole

visualizzare tra 2 e 2 il grafico di y = x 2 , allora si costruiscono due array x e y, di uguale numero

Per visualizzare il grafico di una curva in Matlab, si usa la funzione plot.

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 Q T 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

grafica” (x(i),y(i)). La funzione plot “unisce” i punti del piano 19 (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

grafico di y = x 2 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 grafico

(“-” indica linea continua) e il colore della linea (“r” indica il colore rosso). 20

Il grafico 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 coefficienti del polinomio di interpolazione di grado n passante per

dove t(i) sono punti equidistanti nell’intervallo [1, 1]

e f(i) assumono i valori della funzione di Runge in corrispondenza dei punti

La funzione in Matlab che calcola i coefficienti di tale polinomio `e polyfit. Allora, le istruzioni sono le seguenti: 21

del

n+1 punti assegnati (t(i),f(i)), i=1,

,n+1,

grado

t(i).

n=input(’

for

t(j)=-1+2*(j-1)/n;

end

f=1./(1+25*x.^2);

alfa=polyfit(t,f,n);

polinomio

=

’);

j=1:n+1

Per visualizzare 22 il polinomio di interpolazione appena calcolato si usa la funzione polyval che ha come argomenti l’array alfa contenente i coefficienti del polinomio ed l’array z contenente i punti in cui si vuole “graficare” 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 file, detto script file, che ha un nome

e l’estensione .m. L’esecuzione dello script file, che avviene digitando dalla linea dei comandi il nome del

file stesso, permette l’esecuzione delle istruzioni. Tra le istruzioni Matlab vi sono le chiamate alle funzioni. In Matlab `e possibile costruire delle funzioni da parte dell’utente. Queste funzioni saranno scritte in un function file che deve essere salvato con un nome e l’estensione .m. Il nome del file 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, l’esempio di una funzione per il calcolo delle radici x 1 e x 2 di un’equazione di secondo

grado ax 2 + 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 coefficienti del polinomio di migliore approssimazione in norma Euclidea. 22 La funzione hold on permette che due o pi`u successivi grafici di funzioni siano visualizzati sulla stessa figura.

22

Si suppone che il function file, contenente le istruzioni di seguito elencate abbia nome grado2.m.

function

%

x1=(-b-sign(b)*sqrt(b^2-4*a*c))/(2*a);

x2=c/(a*x1);

end

[x1,x2]

di

=

grado2(a,b,c)

di

risoluzione

un’equazione

secondo

grado

Le istruzioni che eseguono il calcolo dell’equazione di secondo grado mediante la funzione grado2 sono le seguenti. Tali istruzioni si scrivono o dalla linea dei comandi o in uno script file.

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 l’ultima istruzione `e sempre la parola chiave end. Nell’esempio, 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 L’istruzione help grado2 visualizza il commento risoluzione di un’equazione di secondo grado.

23 Se si vogliono modificare i parametri di ingresso, bisogna che questi, all’interno della function e a livello di programma principale siano dichiarati globali mediante la parola chiave global.

23