La segnatura di una matrice SIMMETRICA \(A\) è data dalla terna \((n_+, n_-, n_0)\) dove:
Mediante la segnatura si può stabilire se la matrice è definita/semidefinita positiva/negativa o indefinita:
def segnaturaMatrice(A):
Avals = autovaloriMolteplicita(A)
segnatura = sp.zeros(1, len(Avals["autovalori"]))
for i, autovalore in enumerate(Avals["autovalori"]):
if autovalore > 0:
segnatura[0, 0] += 1
elif autovalore < 0:
segnatura[0, 1] += 1
else:
segnatura[0, 2] += 1
return segnatura
Individuare segnatura di \(A = \begin{bmatrix}1&0&0\\0&8&-4\\0&-4&2\end{bmatrix}\). Dovrà risultare \((2,0,1)\).
A = sp.Matrix([[1,0,0], [0,8,-4],[0,-4,2]])
result = segnaturaMatrice(A)
pprint.pprint(result)
Matrix([[2, 0, 1]])
Come da esercizio. E quindi è semidefinita positiva.
def segnaturaMatriceRegolaCartesio(A):
segnatura = sp.zeros(1, 3)
nulli = 0
l = sp.symbols("l")
polinomio_caratteristico = A.charpoly(l)
termine_noto = polinomio_caratteristico.coeff_monomial(1)
while int(termine_noto) is 0:
polinomio_caratteristico = sp.div(polinomio_caratteristico, l)[0]
termine_noto = polinomio_caratteristico.coeff_monomial(1)
nulli += 1
"""Elabora segnatura"""
grado = polinomio_caratteristico.degree()
cambi_segno = 0
last_segno = None
for i in reversed(range(1, grado+1)):
termine = polinomio_caratteristico.coeff_monomial(l**i)
if last_segno is not None:
if termine < 0 and last_segno is True:
cambi_segno += 1
last_segno = False
elif termine > 0 and last_segno is False:
cambi_segno += 1
last_segno = True
elif termine < 0:
last_segno = False
elif termine > 0:
last_segno = True
"""Cambio segno con termine noto"""
termine = polinomio_caratteristico.coeff_monomial(1)
if termine < 0 and last_segno is True:
cambi_segno += 1
elif termine > 0 and last_segno is False:
cambi_segno += 1
"""Definizione segnatura"""
radici_negative = grado - cambi_segno
segnatura[0,0] = cambi_segno
segnatura[0,1] = radici_negative
segnatura[0,2] = nulli
return segnatura
A = sp.Matrix([[1,0,0,0], [0,-1,3,-1],[0,3,2,4],[0,-1,4,-3]])
result = segnaturaMatriceRegolaCartesio(A)
pprint.pprint(result)
Matrix([[2, 2, 0]])
Come da esercizio.
Usando l'esempio dell'altra funzione
A = sp.Matrix([[1,0,0], [0,8,-4],[0,-4,2]])
result = segnaturaMatriceRegolaCartesio(A)
pprint.pprint(result)
Matrix([[2, 0, 1]])