Introduzione a Mathematica

Gianluca Gorni
Università di Udine, Dipartimento di Matematica e Informatica

10. Algebra di vettori e matrici

Ultima modifica: 26 novembre 2004

Inizializzazione consigliata:

SetOptions[$FrontEnd, 
        CommonDefaultFormatTypes -> {"Output" -> 
              TraditionalForm}];

Operazioni algebriche con liste, vettori e matrici

Un vettore per Mathematica è semplicemente una lista. Quando due vettori hanno la stessa lunghezza li possiamo sommare:

Clear[a, b, c, x, y, z, u, v];
u = {x, y, z};
v = {a, b, c};
u + v

Se cerco di sommare vettori di dimensioni diverse ho errore:

{1, 2} + {1, 2, 3}

Allo stesso modo possiamo sommare due matrici delle stesse dimensioni:

a = Table[{n, n^2}, {n, 3}];
b = Table[{i - 1, i + 1}, {i, 3}];
{MatrixForm[a], MatrixForm[b], MatrixForm[a + b]}

Somma di matrici generate da Array:

Clear[a, b];
Array[a, {2, 2}] + Array[b, {2, 2}] // MatrixForm

La moltiplicazione di matrici si fa col puntino:

a = {{1, 2}, {3, 4}};
b = {{x, y}, {z, t}};
MatrixForm[a . b]

(non confondere la moltiplicazione fra matrici con il prodotto fra una matrice e un numero scalare).

Se avessimo usato MatrixForm per definire a e b saremmo andata diversamente:

a = MatrixForm[{{1, 2}, {3, 4}}];
b = MatrixForm[{{x, y}, {z, t}}];
a . b

Altro esempio di prodotto di matrici:

Clear[a, b];
MatrixForm[
      matA = Table[(Subscript[a, i, j]), {i, 2}, {j, 2}]]
MatrixForm[
      matB = Table[(Subscript[b, i, j]), {i, 2}, {j, 2}]]
matA . matB // MatrixForm

Matrice per vettore:

Clear[a, u];
Array[a, {2, 2}] . Array[u, 2] // MatrixForm

Mathematica non distingue fra vettori riga e vettori colonna.

Estrazione di elementi, righe o colonne o sottomatrici di una matrice

Come già osservato, l'elemento di una matrice mat all'incrocio con la riga n-esima con la colonna m-esima si estrae con mat[[n,m]]:

mat=(({{1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12}}));
mat[[2, 3]]

La riga n-esima della matrice mat si estrae con mat[[n]]:

mat[[3]]

La colonna n-esima si estrae con mat[[All,n]]:

mat[[All, 2]]

La sottomatrice formata dagli elementi agli incroci delle righe (Subscript[n, 1]), (Subscript[n, 2]), …, (Subscript[n, k]) e le colonne (Subscript[m, 1]), (Subscript[m, 2]), …, (Subscript[m, l]) si estrae con mat[[{(Subscript[n, 1]), (Subscript[n, 2]), …, (Subscript[n, k])}, {(Subscript[m, 1]), 
            (Subscript[m, 2]), …, (Subscript[m, l])}]]:

mat[[{1, 4}, {2, 3}]] // MatrixForm

Trasposizione di matrici

La trasposta di una matrice (Subscript[a, i, j]) è la matrice che al posto (i, j) ha l'elemento (Subscript[a, j, i]). In Mathematica la trasposta di fa con Transpose (non dimenticare la "n" in Transpose!):

Clear[a];
MatrixForm[mat = Table[Subscript[a, n, m], {n, 3}, {m, 2}]]

Clear[a];
MatrixForm[Transpose[mat]]

mat . Transpose[mat]//MatrixForm

Una matrice quadrata è simmetrica se coincide con la trasposta:

f[x_, y_] := x + y;
MatrixForm[mat = Array[f, {4, 4}]]

mat == Transpose[mat]

Determinante, matrici inverse

Il determinante di una matrice quadrata si fa con Det (uno dei pochi comandi di Mathematica che sono abbreviazioni, e non scritti per disteso):

Det[(({{1, 2}, {3, 4}}))]

Il comando per invertire una matrice quadrata è Inverse:

Inverse[({{1, 2}, {3, 4}})]//MatrixForm

Verifichiamo:

mat=(({{1, 2}, {3, 4}}));
inv = 
        Inverse[mat];
mat . inv // 
      MatrixForm

Se la matrice non è invertibile Mathematica dà un messaggio di errore:

Inverse[({{1, 2}, {2, 4}})]

Inverse[({{1, 2, 3}, {4, 5, 6}})]

La matrice identità di dimensione n×n si fa con IdentityMatrix[n]:

IdentityMatrix[2] // MatrixForm

IdentityMatrix[5] // MatrixForm

Nucleo di una matrice

Il nucleo di una matrice è l'insieme dei vettori che la matrice manda nel vettore nullo. Il nucleo è un sottospazio vettoriale. Il comando NullSpace dà una base del nucleo di una matrice, scritto come una lista di vettori:

mat=({{1, 2, 3, 4}, {4, 5, 6, 0}});
nucleo = 
      NullSpace[mat]

Verifichiamo che i vettori che ci passa NullSpace siano davvero nel nucleo:

mat . (nucleo[[1]])

mat . nucleo[[2]]

Una verifica congiunta per i due vettori richiede una trasposizione:

mat . Transpose[nucleo]

In effetti NullSpace[mat] dà una matrice le cui righe (non le colonne!) sono una base del nucleo di mat. Per applicare mat alle righe di NullSpace[mat] bisogna trasformare le righe in colonne con Transpose.

Sistemi lineari

Un sistema di equazioni lineari, per esempio  {({{x + y == 1}, {x - 2  y == -2}}), si può risolvere con Solve, come già sappiamo. Un altro modo è di impostare il problema in forma matriciale (({{1, 1}, {1, -2}}))(({{x}, {y}}))==(({{1}, {-2}})) e di usare poi il comando LinearSolve, la cui sintassi è LinearSolve[matrice,termineNoto]:

LinearSolve[({{1, 1}, {1, -2}}),({{1}, {-2}})]//MatrixForm

oppure, in forma ascii,

LinearSolve[{{1, 1}, {1, -2}},{1, -2}]

Notare che in LinearSolve le incognite sono distinte dall'ordine, e non c'è bisogno che abbiano un nome.
Anche quando il sistema ha più di una soluzione, LinearSolve ne dà soltanto una, senza ammonire l'utente:

mat=(({{1, 2, 3}, {4, 5, 6}}));
termineNoto = {1, 
          0};
sol = 
      LinearSolve[mat, termineNoto]

Per capire se ci sono altre soluzioni calcoliamo il nucleo della matrice con NullSpace. In questo caso il nucleo viene di dimensione 1:

nucleo = NullSpace[mat]

La soluzione generale si può scrivere quindi come

soluzioneParametrizzata = sol + t*nucleo[[1]]

al variare del parametro t.
Proviamo a risolvere lo stesso sistema lineare usando Solve, tanto per vedere la differenza:

sistema = (mat . {x, y, z} == {1, 0})

sol2 = Solve[sistema, {x, y, z}]

mat = Table[i + j - 1, {i, 2}, {j, 3}]

LinearSolve[mat, {-1, 3}]

La soluzione data da Solve diventa in forma parametrica con

soluzioneParametrizzata2 = {x, y, z} /. sol2[[1]]

Si vede che questa soluzione coincide con quella trovata prima, a meno di cambiare il nome del parametro da t a z.

Esercizi

Definire un comando MatriceNulla[n_,m_] che dia come output una matrice di n righe e m colonne riempita di zeri.

Definire un test SymmetricMatrixQ[mat_] che dia True se mat è una matrice quadrata simmetrica, e False altrimenti.

Risolvere i sistemi {({{2  x + y - z == -1}, {x - y + 3  z == 2}, {3  x + 2  y - 2  z == 3}}) , (({{1, -1, 4, 0}, {2, 1, -2, 1/3}, {0, 1, 0, -2}, {-1, 0, 0, 7}}))(({{x}, {y}, {z}, {t}}))==(({{0}, {1}, {-1}, {5}})).

Per quali valori del parametro a il sistema (({{1, 2, 1}, {2, 0, -3}, {a, 2, -1}}))(({{x}, {y}, {z}}))==(({{5}, {6}, {9}})) ha una sola soluzione, nessuna o infinite?

Trovare tutte le soluzioni del sistema {({{x + y - z == -1}, {x - 2  y + z == 2}}), usando sia Solve che LinearSolve/NullSpace, e confrontare i risultati.

Data la matrice rettangolare mat = Table[i + j - 1, {i, 2}, {j, 3}] e il vettore v = {-1, 3} risolvere il sistema mat . {x, y, z} == v usando LinearSolve e Solve, e verificare che le due soluzioni sono equivalenti.

Trovare una matrice il cui nucleo sia lo spazio vettoriale generato dai vettori {1, 2, 3} e {2, 3, 4}.