Laboratorio di MATLAB

 1. Introduzione

Matlab, Mathematica, Maple e Derive sono oggi i più diffusi e potenti ambienti di calcolo simbolico e numerico, utilizzati per la risoluzione di complessi problemi che sorgono nella pratica della matematica, della fisica e dell'ingegneria. Ognuno di questi ambienti di calcolo possiede numerose funzioni e procedure predefinite, che ne facitilano l'uso. Vi è Inoltre la possibilità, utilizzando un linguaggio interno, di scrivere veri e propri programmi per definire nuove funzioni e nuove procedure. Tali linguaggi sono paragonabili agli usuali linguaggi di programmazione, come il C, il Pascal e Java.

Matlab è orientato prevalentemente verso il calcolo numerico, anche se nelle ultime versioni è stato aggiunto un pacchetto per il calcolo simbolico.
Mathematica, Maple e Derive sono invece orientati prevalentemente verso il calcolo simbolico.



Si possono trovare svariate informazioni su Matlab nel sito della MathWorks (all'indirizzo http://www.mathworks.com/). In particolare si possono trovare vari manuali, tra i quali Getting Started - Introduction to MATLAB (all'indirizzo seguente http://www.mathworks.com/access/helpdesk/help/techdoc/matlab.shtml).

 2. Matrici e vettori

MATLAB è l'abbreviazione di MATRIX LABORATORY. La struttura dati di base è la matrice: ogni variabile è definita mediante una matrice di tipo m x n. In particolare:

Il campo degli scalari è quello dei numeri complessi.

Ogni parola formata da lettere e numeri (max. 31 caratteri nella versione 5.3) può essere utilizzata come nome di una variabile, purché il suo primo carattere sia alfabetico. Una variabile si dichiara assegnandole un valore, utilizzando l'operatore di assegnazione =. Ad esempio possiamo definire una variabile nei modi seguenti:

Ogni volta che si scrive un'istruzione e si preme Invio, Matlab la esegue e mostra il risultato dell'esecuzione nella finestra dei comandi.
Ad esempio, se immettiamo il valore 5, Matlab assegna tale valore ad una variabile temporanea ans (abbreviazione di answer = risposta):
» 5
ans
5

Per eseguire un'istruzione senza visualizzarene il risultato, basta terminare l'istruzione con un punto e virgola. Così, ad esempio, l'istruzione
» x = 2;

assegna il valore 2 alla variabile x, ma non mostra il risultato di tale assegnazione.

La variabile temporanea ans viene utilizzata da Matlab quando si immette un'espressione che non viene assegnata ad alcuna variabile. Il contenuto della variabile ans viene modificato di volta in volta, e coincide sempre con il risultato più recente.

Per visualizzare l'elenco delle variabili in memoria si possono usare le seguenti istruzioni:

    1. who: che elenca tutte le variabili in memoria;
    2. whos: che elenca tutte le variabili in memoria mostrandone i dettagli.

Per cancellare il contenuto della finestra dei comandi si usa il comando clc. Tale comando però non modifica i valori assegnati alle variabili che si stanno usando.
Per cancellare una variabile si usa il comando clear seguito dal nome della variabile stessa. Ad esempio: clear x.
Per cancellare tutte le variabili in memoria si usa semplicemente l'istruzione clear.

In Matlab i numeri sono sempre rappresentati in forma decimale, e tutti i calcoli sono eseguiti in precisione doppia. Il comando format permette di specificare l'aspetto dei numeri sullo schermo. Il formato standard di visualizzazione è short, che utilizza solo quattro cirfre decimali (ad esempio sqrt(2) = 1.4142). Invece il comando format long permette di visualizzare 16 cifre decimali (sqrt(2) = 1.41421356237310). Si può poi utilizzare il comando format rat per ottenere l'approssimazione razionale (sqrt(2) = 1393/985). Si tenga presente che quest'ultimo comando modifica solo l'aspetto dei numeri, non le modalità di calcolo. Con il solo comando format si ritorna al formato standard, ossia al formato short.

Matlab possiede alcune costanti predefinite, come pi (per p), exp(1) (per il numero di Nepero e), Inf (per infinito), NaN (Not a Number, per un risultato numerico indefinito), i e j (per l'unità immaginaria).

Riportiamo nella seguente tabella le principali operazioni aritmetiche tra scalari.

Operazioni tra scalari

Somma: 2 + 3, 1 + x, x + y
Differenza: 2 - 3, 1 - x, x - y
Prodotto: 2*3, 4*x, x*y
Divisione: 2/5, 3/x, x/y
Divisione a sinistra: 5\2, x\3, y\x
Potenza: 2^2, x.^3
Radice quadrata: sqrt( x )

Matlab possiede due operatori per la divisione: la divisione a destra / (slash), che corrisponde alla divisione ordinaria, e la divisione a sinistra \ (backslash), che corrisponde alla divisione inversa (x\y equivale ad y/x).


Data una matrice A, l'elemento di posto ( i, j ) è ottenuto semplicemente con il comando A( i, j ); tale elemento può essere modificato assegnando un nuovo valore direttamente ad A( i, j ) (non c'è bisogno di ridefinire tutta la matrice).
La riga i-esima di A è ottenuta con A( i, : ), mentre la colonna j-esima è ottenuta con A( :, j ). In entrambi i casi l'operatore : genera il vettore degli indici di colonna nel primo caso e di riga nel secondo. La sottomatrice di A formata dalle righe i, i + 1, ..., h e dalle colonne j, j + 1, ..., k è ottenuta con A( i:h, j:k ), mentre la sottomatrice formata dalle righe u = [ i1, ..., ih ] e dalle colonne v = [ j1, j2, ..., jk ] è ottenuta con A( u, v ). Con A(:) si ottiene il vettore colonna formato da tutte le colonne della matrice A.

L'operatore : permette di definire vettori con elementi equispaziati. Ad esempio v = [ 3 : 2 : 8 ] (equivalentemente v = 3 : 2 : 8) definisce il vettore v = [ 3, 5, 7 ] degli elementi compresi tra 3 ed 8 distanziati di 2.

Accanto alle usuali operazioni tra matrici (somma, prodotto per uno scalare, prodotto righe per colonne), in Matlab vi è anche un altro tipo di operazioni tra matrici, di grande importanza nelle applicazioni: le operazioni eseguite elemento per elemento. Riportiamo qui di seguito le principali operazioni tra matrici.

Operazioni tra matrici

Somma e differenza: A + B, A - B
Prodotto per uno scalare: l*A
Prodotto: A*B
Potenza di una matrice: A^n
Matrice trasposta: A'
Matrice inversa: inv( A )
Prodotto elemento per elemento: A.*B
Potenza elemento per elemento: A.^n
Divisione elemento per elemento: A./B
Divisione inversa elemento per elemento: A.\B
Determinante: det( A )
Rango: rank( A )
Tipo: size( A ), [ m, n ] = size( A )
Massimo tra le dimensioni della matrice: lenght(A)
Vettore riga dei massimi di ogni colonna: max(A)
Vettore riga dei minimi di ogni colonna: min( A )
Vettore riga delle somme degli elementi delle colonne: sum(A)
Elemento di posto ( i, j ): A( i, j )

In Matlab vi sono alcune matrici particolari predefinite, che riportiamo nella seguente tabella:

Matrici particolari

Matrice vuota: []
Matrice identità: eye( n )
Matrice nulla: zeros( n ), zeros( m, n )
Matrice unitaria uniforme: ones( n ), ones( m, n )
Matrice diagonale: diag( v )
Matrice di Pascal (coefficienti binomiali): pascal( n )
Matrice con elementi scelti casualmente
  nell'intervallo [0,1]: rand, rand( n ), rand( m, n )

Matlab possiede un comodo help di linea, che permette di visualizzare le principali caratteristiche di ogni comando. Basta scrivere help seguito dal nome del comando. Ad esempio:

» help eye

EYE Identity matrix.
EYE(N) is the N-by-N identity matrix.

EYE(M,N) or EYE([M,N]) is an M-by-N matrix with 1's on
the diagonal and zeros elsewhere.

EYE(SIZE(A)) is the same size as A.

See also ONES, ZEROS, RAND, RANDN.

 3. Sistemi lineari quadrati

Per risolvere un sistema lineare A x = b, dove A è una matrice quadrata con determinante non nullo e b è un vettore colonna, si può utilizzare il metodo di Cramer che consiste sostanzialmente nel calcolare il vettore x = A-1 b. Questo metodo tuttavia, al crescere dell'ordine della matrice A, non è efficiente dal punto di vista del calcolo. Un altro difetto del metodo di Cramer è che può essere utilizzato solo quando la matrice A è non singolare.

In Matlab però si può utilizzare anche il metodo della divisione inversa, con il comando x = A \ b, che fornisce la soluzione del sistema A x = b utilizzando il metodo di riduzione di Gauss. Questo metodo è più efficiente dal punto di vista del calcolo e può essere utilizzato anche quando il numero delle equazioni del sistema è diverso dal numero delle incognite. Tuttavia se il sistema è indeterminato (ciò se ammette infinite soluzioni), questo metodo non è in grado di trovarle tutte (in realtà ne trova al più una).

Si può però utilizzare un ulteriore metodo, dato ancora dall'eliminazione di Gauss, consistente nella riduzione per righe della matrice completa del sistema [ A b ]. In Matlab si usa il comando rref( [ A b ] ).

Ø Risolvere il seguente sistema lineare

ì
í
î
x + y + z + w = 1
2 x + 3 y + 4 z + 7 w = 1
3 x + 2 y + 2 z + 4 w = 2
x - 3 y - z + 2 w = 3

Poiché

» A=[ 1 1 1 1 1; 2 3 4 7 1; 3 2 2 4 2; 1 -1 -1 2 3]
A =
1 1 1 1 1
2 3 4 7 1
3 2 2 4 2
1 -1 -1 2 3
» rref(A)
ans =
1 0 0 0 8
0 1 0 0 -25
0 0 1 0 22
0 0 0 1 -4

la soluzione è x = 8, y = - 25, z = 22, w = - 4,

Ø Risolvere il seguente sistema lineare

ì
í
î
x + y + z + w = 1
2 x + 3 y + 4 z + 7 w = 1
3 x + 2 y + 2 z + 4 w = 2

Poiché

» A=[ 1 1 1 1 1; 2 3 4 7 1; 3 2 2 4 2]
A =
1 1 1 1 1
2 3 4 7 1
3 2 2 4 2
» rref(A)
ans =
1 0 0 2 0
0 1 0 -7 3
0 0 1 6 -2

Questa volta la soluzione è x = 2 t, y = 7 t + 3, z = - 6 t - 2, w = t, dove t è un parametro reale arbitrario.

 4. Esercizi

Ø Esercizio Scrivere in Matlab le seguenti matrci

A = é
ê
ê
ë
1

0

1

2

1

1

1

1

0

ù
ú
ú
û
,   
B = é
ê
ê
ë
0

1

1

1

1

2

1

2

1

ù
ú
ú
û
.

  1. Calcolare i prodotti A*B e A.*B.
  2. Dire se tali matrici sono invertibili, ed in caso affermativo calcolarne le matrici inverse.
  3. Calcolare il commutatore di A e B, ossia la matrice [ A, B ] = A B - B A. Dire se le due matrici commutano.
  4. Calcolare le matrici trasposte A' e B'.

Ø Soluzione In Matlab le due matrici si scrivono nella forma seguente:

A = [ 1 0 1; 2 1 1; 1 1 0 ]
B = [ 0 1 1; 1 1 2; 1 2 1 ]

La matrice A non è invertibile, mentre B lo è. Le due matrici non commutano.

Ø Esercizio Mostrare che la seguente matrice A è invertibile, e determinarne la matrice inversa A-1:

A = é
ê
ê
ê
ê
ê
ê
ë
1

2

3

2

4

2

1

2

1

5

2

2

3

4

1

1

4

4

5

6

7

3

5

7

8

ù
ú
ú
ú
ú
ú
ú
û

Ø Esercizio Dire se i seguenti vettori sono linearmente indipendenti:

v1 = [ 1, 2, 3, 2,4 ],
v2 = [ 2, 1, 2, 0, 1 ],
v3 = [ 2, 2, 3, -4, 1 ],
v4 = [ 1, 4, 0, 5, 3 ],
v5 = [ 6, 9, 8, 3, 9 ].

Ø Esercizio Risolvere i seguenti sistemi lineari

ì
í
î
2 x + y + z = 1
x + 2 y + z = 2
x + y + 2 z = 3

ì
í
î
2 x + y + 3 z = 1
x + 3 y + 2 z = 3
x + 2 y + 4 z = 6

Ø Soluzione Si definiscono la matrice A dei coefficienti ed il vettore b dei termini noti:

A = [ 2 1 1; 1 2 1; 1 1 2 ]

b = [ 1; 2; 3]

Infine la soluzione è data da x = inv(A)*b, o da x = A\b, ossia x = [ -1/2, 1/2, 3/2 ]. Il secondo sistema si risolve in modo analogo.


Ø Esercizio Risolvere il sistema lineare di due equazioni in quattro incognite

ì
í
î
x + 3 y + z + t = 1
2 x + 3 y + 2 z + t = 3

Ø Soluzione Dopo aver definito la matrice A = [ 1 3 1 1; 2 3 2 1 ] ed il vettore dei ternini noti b = [ 1; 3 ], si costruisce la matrice ridotta R = rref( [A b] ), che risulta essere

R = é
ê
ë
1

0

1

0

2

0

1

0

1/3

- 1/3

ù
ú
û

e che cossisponde al sistema ridotto di immediata soluzione

ì
í
î
x + z = 2
3 y + t/3 = - 1/3

Ø Esercizio Si considerino le matrici

A = é
ê
ê
ê
ë
1

0

1

2

2

2

1

1

4

0

3

1

2

6

1

ù
ú
ú
ú
û
,   
B = é
ê
ê
ê
ê
ê
ê
ë
1

3

1

3

4

1

1

0

1

1 2 2
2 4 1
ù
ú
ú
ú
ú
ú
ú
û

  1. Si calcoli la matrice prodotto C = A*B.
  2. Si calcoli il rango di A,B e C.


Ø Esercizio Calcolare le potenze n-esime delle seguenti matrici

A = é
ê
ë
1

- 1

- 1

1

ù
ú
û
,  

B =

é
ê
ë
1

1

- 1

1

ù
ú
û
,  
C = é
ê
ë
1

1

1

0

ù
ú
û

Ø Soluzione

An = é
ê
ë
2n-1

- 2n-1

- 2n-1

2n-1

ù
ú,
û
 per ogni n ³ 1.
Cn = é
ê
ë

Fn+1

Fn

Fn

Fn-1

ù
ú
û

dove gli Fn sono i numeri di Fibonacci, ossia i numeri definiti dalla recorrenza lineare Fn+2 = Fn+1 + Fn e dalle condizioni iniziali F-1 = 1, F0 = 0.

Ø Esercizio Una matrice quadrata A può essere vista come la trasformazione lineare di Rn che al vettore x associa il vettore y = A x. Descrivere geometricamente le trasformazioni rappresentate dalle seguenti matrici:

A = é
ê
ë
0

1

-1

0

ù
ú
û
,  

B =

é
ê
ë
0

1

1

0

ù
ú
û
,  
C = é
ê
ë
1/2

1/2

1/2

1/2

ù
ú
û

Ø Esercizio Utilizzare l'help di linea per trovare tutti i tipi di formato numerico presenti in Matlab.

Ø Esercizio Confrontare i vari metodi di soluzione di un sistema lineare. Per ottenere il tempo di calcolo di un'operazione:

t0 = clock;
operazione,
t = etime( clock, t0 )