Polinomio minimo

Polinomio monico

E' tale se il coefficente numerico del monomio di grado massimo è 1.

Polinomio minimo

Il polinomio minimo di \(A\) (matrice quadrata) è il polinomio monico di grado minimo che ammette \(A\) come radice, ossia tale che

\(m_A(A) = O_n\)

(dove \(O_n\) è la matrice nulla di ordine \(n\)). Sappiamo che ogni matrice quadrata \(A\) di ordine \(n\) è radice del suo polinomio caratteristico: \(p_A(A) = det(A - \lambda Id_n)\). Il polinomio minimo di \(A\) è uno dei possibili divisori del polinomio caratteristico. Ad esempio se il polinomio caratteristico (vedi sezione "15" per come calcolarlo) è \((\lambda -1)^3(\lambda-2)\) i divisori che si annullano su tutti gli autovalori di \(A\) sono: \((\lambda-1)(\lambda-2), (\lambda-1)^2(\lambda-2)\) e \((\lambda-1)^3(\lambda-2)\)

  • per ciascuno dei polinomi risultanti (i tre sopra), partendo da quelli di grado inferiore, provare a vedere se sostituendo i valori alla matrice \(A\) si ottiene la matrice \(O_n\) (nulla di ordine \(n\))
  • ad esempio (il primo di cui sopra) \(p_1(A) = (A-Id_4)*(A-2Id_4)\)
  • si eseguono le operazioni tra matrici, se il risultato non è la matrice nulla si procede con il divisore di grado superiore
  • quando la sostituzione restituisce la matrice nulla di ordine \(n\) si è trovato il polinomio di grado più basso che ammette \(A\) come radice, quindi (riprendendo l'esempio dove è quello di 3° grado): \(m_A(\lambda) = (\lambda-1)^2(\lambda-2)\).

Funzione riassumibile

def polinomioMinimo(A):
    l = sp.symbols('l')

    dimensione = A.shape[0]

    polinomio_caratteristico = A.charpoly(l)
    grado = polinomio_caratteristico.degree()

    fattori = sp.factor_list(polinomio_caratteristico)[1]

    for i in range(1, grado):
        sub_espressione = 1
        for fattore in fattori:
            esponente = fattore[1]
            polinomio_puro = fattore[0]
            _id = polinomio_puro.coeff_monomial(1) * sp.eye(dimensione)
            sub_espressione *= (A + _id)**(min(esponente, i))

        if sub_espressione == sp.zeros(dimensione):
            polinomio_minimo = 1
            for fattore in fattori:
                termine_noto = fattore[0].coeff_monomial(1)
                polinomio_minimo *= (l + termine_noto)**(min(fattore[1], i))
            return polinomio_minimo

Esempio 1

A = sp.Matrix([[1,1,1,1], [0,1,0,1], [0,0,1,0], [0,0,0,2]])
res= polinomioMinimo(A)
print(res)

(l - 2)*(l - 1)**2

Come da esercizio

Esempio 2

A = sp.Matrix([[2,0,0,0,0], [5,2,0,0,0], [0,0,4,3,0], [0,0,2,5,0], [0,0,0,0,4]])
res= polinomioMinimo(A)
print(res)

(l - 7)*(l - 4)*(l - 2)**2

L'esercizio non fornisce la soluzione da verificare (https://www.youmath.it/esercizi/es-algebra-lineare/esercizi-matrici-vettori/4254-esercizi-risolti-polinomio-minimo.html).

Riferimenti

  • https://www.youmath.it/lezioni/algebra-lineare/matrici-e-vettori/3887-polinomio-minimo.html