\(A\) (matrice quadrata) è diagonalizzabile se e solo se esiste una matrice invertibile \(P\) tale che \(D = P^{-1}AP\) (dove \(D\) è una matrice diagonale risultante), ossia \(PD = AP\) (matrice invertibile matrice diagonale = matrice in oggetto matrice invertibile). \(P\) è la matrice diagonalizzante di \(A\). \(A\) è diagonalizzabile se
Se \(A\) è diagonalizzabile si può trovare \(D\) (matrice diagonale a cui è simile) e \(P\) (matrice diagonalizzante):
def matriceDiagonale(A):
ordine_matrice = A.shape[0]
Avals = autovaloriMolteplicita(A)
somma_molt_algebriche = sum(Avals["molteplicitaAlgebriche"])
"""1) la somma delle molt algebriche deve essere pari all'ordine della matrice"""
diagonalizzabile = [somma_molt_algebriche is ordine_matrice]
"""2) le molteplicita algebriche devono corrispondere alle rispettive geometriche"""
for i, moltA in enumerate(Avals["molteplicitaAlgebriche"]):
diagonalizzabile.append(moltA is Avals["molteplicitaGeometriche"][i])
if all(diagonalizzabile):
"""Diagonalizzabile: ricerca matrice diagonalizzante P e diagonale D"""
"""Matrice diagonale"""
valori_diagonali = []
for i, autovalore in enumerate(Avals["autovalori"]):
risp_molt_algebrica = Avals["molteplicitaAlgebriche"][i]
for j in range(risp_molt_algebrica):
valori_diagonali.append(autovalore)
D = sp.eye(len(valori_diagonali))
for i in range(len(valori_diagonali)):
D[i, i] = valori_diagonali[i]
"""Matrice diagonalizzante"""
P = sp.zeros(0)
i = 0
for base in Avals["basiAutospazi"]:
for v in range(base.shape[0]):
P = P.col_insert(i, base.row(v).T)
i+=1
D_check = (P**-1)*A*P
print(D_check)
return {
"diagonalizzabile": True,
"matriceDiagonale": D,
"matriceDiagonaleCheck": D_check,
"matriceDiagonalizzante": P
}
return {
"diagonalizzabile": False
}
A = sp.Matrix([[1,2,1], [0,2,0], [1,-2,1]])
result = matriceDiagonale(A)
pprint.pprint(result)
{'diagnoaliabile': True, 'matriceDiagonale': Matrix([ [2, 0, 0], [0, 2, 0], [0, 0, 0]]), 'matriceDiagonaleCheck': Matrix([ [2, 0, 0], [0, 2, 0], [0, 0, 0]]), 'matriceDiagonalizzante': Matrix([ [ 1, 0, 1], [1/2, -1/2, 0], [ 0, 1, -1]])}
Il risultato differisce dall'esercizio a causa di una scelta diversa dei parmetri liberi nella costruzione delle basi degli autospazi, tuttavia matriceDiagonaleCheck
conferma il corretto risultato.