Matrice triangolarizzabile

\(A\) (matrice quadrata) è triangolarizzabile se e sole se esiste una matrice invertibile \(P\) dello stesso ordine tale che \(P^{-1}AP = T\), dove \(T\) è matrice triangolare superiore. \(P\) è la matrice triangolarizzante di \(A\). \(A\) è triangolarizzabile se i suoi autovalori appartengono allo stesso campo \(\mathbb{K}\) della matrice (per intenderci se degli autovalori hanno valore radice di -1, ossia l'unità immaginaria, allora non è triangolarizzabile in \(\mathbb{R}\)).

Algoritmo di triangolazione (se \(A\) matrice quadrata di ordine \(n \ge 2\) e triangolarizzabile nel campo \(\mathbb{K}\)):

  • calcolare gli autovalori (vedi sezione "Autovalori ed autovettori")
  • calcolare una base per ogni autospazio relativo agli autovalori e prendere questo insieme di vettori
  • completare l'insieme di vettori raccolto a base sfruttando l'algoritmo di completamento di base (vedi sezione "Completamento a base") ottenento la base \(\beta\)
  • scrivere la matrice di cambiamento di base da \(\beta\) alla base canonica di \(\mathbb{K}\), quindi tale matrice \(M\) avrà i vettori di \(\beta\) come colonne (vedi sezione "Matrice di cambiamento di base")
  • calcolare l'inversa di \(M \to M^{-1}\) e svolgere il prodotto tra matrici \(M^{-1}AM\)
    • se il risultato non è ancora una matrice triangolare superiore si procede prendendo la sottomatrice di \(M^{-1}AM\) di ordine \(n-r\) (\(r\) è il numero degli autovettori di \(A\)) che si ottiene eliminando le prime \(r\) righe e colonne; chiamandola \(A'\).
    • calcolare gli autovalori di \(A'\), prendere i vettori delle basi degli autospazi relativi e completare l'insieme a base di \(\mathbb{K}^{n-r}\) ottenendo la base \(\beta'\)
    • scrivere la matrice di cambiamento di base da \(\beta'\) alla base canonica di \(\mathbb{K}^{n-r}\), quindi con tale matrice \(M'\) si andrà a costruire la matrice a blocchi \(C\) con
      • in alto a sinistra \(Idr\) (matrice identità di ordine \(r\))
      • in alto a destra \(O1\) (matrice rettangolare nulla con \(r\) righe e \(n-r\) colonne)
      • in basso a sinistra \(O2\) (matrice rettangolare nulla con \(n-r\) righe e \(r\) colonne)
      • in basso a destra la matrice di camb. di base \(M'\).
    • svolgere il prodotto \(P=MC\) e prendere l'inversa \(P^{-1}\). Svolgere infine il prodotto \(P^{-1}AP\)
      • se il risultato è una matrice triangolare superiore allora \(P\) è la matrice triangolarizzante e \(P^{-1}AP\) la matrice triangolare simile ad \(A\)
      • altrimenti reiterare l'algoritmo relativo della sottomatrice considerando \(A''\) di ordine \(n-r-m\) (\(m\) è il numero di autovettori di \(A'\)) estratta da \(P^{-1}AP\) eliminandone le prime \(r+m\) righe e \(r+m\) colonne

Se \(A\) è una matrice diagonalizzabile nel campo \(\mathbb{K}\) allora \(A\) è anche triangolarizzabile in \(\mathbb{K}\) e ne risulta che

  • la matrice triangolare superiore simile ad \(A\) è una matrice diagonale i cui elementi della diagonale sono gli autovalori di \(A\) ripetuti con la loro molteplicità
  • la matrice triangolarizzante coincide con la matrice diagonalizzante (ossia ha come colonne gli autovettori di \(A\)).

Funzione riassumibile

def matriceTriangolare(A):

    def dimensioneSottratta(basiAutospazi):
        r = 0
        for base in basiAutospazi:
            r += base.shape[0]
        return r

    Avals = autovaloriMolteplicita(A)
    if sp.I in Avals["autovalori"] or -sp.I in Avals["autovalori"]:
        return {
            "triangolarizzabile": False
        }

    """Completamento: integra gli autovettori con la base canonica"""
    beta = completamentoABase(Avals["basiAutospazi"], A.shape[1])
    r = dimensioneSottratta(Avals["basiAutospazi"])

    """Matrice cambiamento base M da beta a base canonica"""
    M = matriceCambiamentoBase(beta, sp.eye(A.shape[1]))
    T = M**-1*A*M
    if isUpperTriangular(T):
        return {
            "triangolarizzabile": True,
            "matriceTriangolare": T,
            "matriceTriangolarizzante": M
        }
    else:

        def iterazoneMatriceBlocchi(T, M, r):
            A1 = T.copy()
            for i in range(r):
                A1.col_del(0)
                A1.row_del(0)

            dim = A1.shape[1]

            A1vals = autovaloriMolteplicita(A1)
            if sp.I in Avals["autovalori"] or -sp.I in Avals["autovalori"]:
                return {
                    "triangolarizzabile": False
                }

            """Completamento: integra gli autovettori con la base canonica"""
            beta1 = completamentoABase(A1vals["basiAutospazi"], A1.shape[1])
            r1 = dimensioneSottratta(A1vals["basiAutospazi"])

            """Matrice cambiamento base M da beta a base canonica"""
            M1 = matriceCambiamentoBase(beta1, sp.eye(dim))

            """C matrice a blocchi"""
            C = sp.Matrix([[sp.eye(dim-1), sp.zeros(dim-1,dim)], [sp.zeros(dim,dim-1), M1]])
            P1 = M*C
            T1 = P1**-1*A*P1

            if isUpperTriangular(T1):
                return {
                    "triangolarizzabile": True,
                    "matriceTriangolare": T1,
                    "matriceTriangolarizzante": P1
                }
            else:
                return iterazoneMatriceBlocchi(T1, M1, r1)

        return iterazoneMatriceBlocchi(T, M, r)

Esempio 1

A = sp.Matrix([[6,1,-3], [-2,9,-7], [-2,1,9]])
result = matriceTriangolare(A)
print(result)

{'matriceTriangolare': Matrix([ [8, -8, -1], [0, 8, -1], [0, 0, 8]]), 'matriceTriangolarizzante': Matrix([ [1, 1, 1], [2, 0, 0], [0, 2, 0]]), 'triangolarizzabile': True}

Come da esercizio

Esempio 2

A = sp.Matrix([[1,0,0], [1,0,1], [1,-1,2]])
result = matriceTriangolare(A)
pprint.pprint(result)

{'matriceTriangolare': Matrix([ [1, 0, 0], [0, 1, 1], [0, 0, 1]]), 'matriceTriangolarizzante': Matrix([ [1, 0, 1], [1, 1, 0], [0, 1, 0]]), 'triangolarizzabile': True}

Esempio 3

    A = sp.Matrix([[1,2,0], [-1,-1,0], [2,3,1]])
    result = matriceTriangolare(A)
    pprint.pprint(result)

{'triangolarizzabile': False}

Riferimenti

  • https://www.youmath.it/lezioni/algebra-lineare/matrici-e-vettori/3882-matrice-triangolabile.html