Facciamo il cammino inverso di quel che si fa di solito in ambito scolastico, partiamo dal problema e troviamo quel che serve. Che problema dobbiamo risolvere?
Poco fa abbiamo visto la matrice inversa. Molto bella la matrice inversa, come avrete intuito è utile per risolvere delle equazioni matriciali. C’è una bella limitazione però, le matrici quadrate invertibili quando ti metti a scrivere un’equazione non ti capitano mai e poi mai, quindi? Come facciamo a generalizzare in qualche modo il concetto di inversa?
Partiamo dunque dalla tipica equazione matriciale da risolvere:
A sia una matrice non quadrata e dunque non invertibile di dimensione [mxn] mentre x e b siano due vettori di dimensione [nx1].
Cerchiamo una soluzione approssimata per il vettore x, il che si riduce ad un problema di minimi quadrati, si deve minimizzare quanto segue:
Sviluppiamo i quadrati:
Si osservi che:
Quindi:
Si derivi rispetto ad x e si imponga che la derivata sia nulla per ogni termine della sommatoria:
Si ha quindi che:
Eccoci dunque la definizione di pseudoinversa di una matrice:
Prima ovvia domanda, quando esiste la pseudo inversa? Si può dimostrare che la pseudo inversa esiste per ogni matrice (meraviglioso).
La formula di cui sopra vale a patto che la matrice A sia di rango pieno con numero di colonne minore o uguale al numero di righe, ovvero le colonne di A sono linearmente indipendenti.
Analogamente si dimostra che se A è di rango pieno con numero di righe inferiore al numero di colonne (le righe di A sono linearmente indipendenti) la pseudo inversa risulta:
La matrice pseudo inversa ha una lunga serie di interessanti proprietà:
- Nel caso di matrici invertibili la pseudo coincide con l’inversa.
- Nel caso di matrice [nxm] a rango pieno con m<n (colonne linearmente indipendenti) la pseudoinversa è un'inversa sinistra, ovvero vale:
- Nel caso di matrice [nxm] a rango pieno con n<m (righe linearmente indipendenti) la pseudoinversa è un'inversa destra, ovvero vale:
Riporto un’ultima proprietà molto interessante data la scomposizione della matrice di partenza A mediante la SVD (Singular Value Decomposition, decomposizione ai valori singolari):
la sua pseudoinversa può essere scritta come:
Ultima domanda, e se la matrice non è di rango massimo?
Qui casca un po' il palco o meglio si perde un po' di immediatezza nel calcolo della matrice pseudinversa in quanto bisogna passare per la SVD.
Riporto un brevissimo esempio di utilizzo della classe da me creata per il calcolo dela pseudoinversa.
//Declare matrix
Matrix A("[ 2, 0, 0 ; 0, 3, 0 ; 0, 0, 5 ; 0, 0, 1]");
//Print matrix
std::cout << "A:\n";
print(A);
std::cout << "\n";
//Pseudo-Inverse matrix
Matrix B = A.pInv();
//Print Pseudo-Inverse matrix
std::cout << "pInv(A):\n";
print(B,5);
std::cout << "\n";
//Check
if (A.getNumColumns()>=A.getNumRows())
{
//Check A*B
Matrix AB;
AB = A * B;
std::cout << "A * pInv(A):\n";
print(AB);
std::cout << "\n";
}
else
{
//Check B*A
Matrix BA;
BA = B * A;
std::cout << "pInv(A) * A:\n";
print(BA);
std::cout << "\n";
}
L'ouput sarà il seguente:
A:
2.000 0.000 0.000
0.000 3.000 0.000
0.000 0.000 5.000
0.000 0.000 1.000
pInv(A):
0.50000 0.00000 0.00000 0.00000
0.00000 0.33333 0.00000 0.00000
0.00000 0.00000 0.19231 0.03846
pInv(A) * A:
1.000 0.000 0.000
0.000 1.000 0.000
0.000 0.000 1.000