Segnatura di una matrice

La segnatura di una matrice SIMMETRICA \(A\) è data dalla terna \((n_+, n_-, n_0)\) dove:

  • \(n_+\) (indice di positività): numero di autovalori positivi contati per la loro molteplicità algebrica (vedi sezione "Molteplicità algebrica e geometrica")
  • \(n_-\) (indice di negatività): numero di autovalori negativi contati per la loro molteplicità algebrica
  • \(n_0\) (indice di nullità): se e quante volte la matrice \(A\) ammette 0 come autovalore.

Mediante la segnatura si può stabilire se la matrice è definita/semidefinita positiva/negativa o indefinita:

  • definita positiva: \((n, 0, 0)\)
  • definita negativa: \((0, n, 0)\)
  • semidefinita positiva: \((a, 0, b)\) con \(a,b \ge 0, a+b = n\)
  • semidefinita positiva ma non definita positiva: \((a, 0, b)\) con \(a \ge 0\) e \(b > 0, a+b = n\) ecc..
  • indefinita se \((a, c, b)\) con \(a > 0\) e \(b > 0\) e \(a+b+c=n\).

Proprietà

  • La segnatura di una matrice diagonale è la terna di termini positivi, negativi, nulli presenti sulla diagonale principale.
  • Le matrici congruenti hanno la stessa segnatura.

Funzione riassumibile

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

Esempio

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.

Funzione riassumibile con regola di Cartesio

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

Esempio

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.

Esempio 2

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]])

Riferimenti

  • https://www.youmath.it/lezioni/algebra-lineare/matrici-e-vettori/2696-segnatura.html