10 - Base da sistema generatori

Base da sistema di generatori

Per estrarre una base di un sottospazio generato dal sistema di generatori che lo ha generato ci sono diversi metodi tra cui tramite la riduzione gaussiana (https://levelup.gitconnected.com/gaussian-elimination-algorithm-in-python-4e90cb3a0fd9).

  • Si prendono i vettori che costituiscono il sistema e li si dispongono come colonne di una matrice MM di nn (numero di vettori del sistema di generatori) colonne ed mm (dimensione del vettore) righe.
  • Si riduce la matrice nella matrice in scala MM' tramite eliminazione gaussiana (vedi link per Python). Le colonne di MM corrispondenti a quelle di MM' contenenti i pivot indicano i vettori linearmente indipendenti, ossia che costituiscono la base.

Per il calcolo dei polinomi si fa la stessa cosa mettendoli per colonna basandosi sull’ordine della base canonica (1,x,x2)(1, x, x^2).

Per le matrici: si trasformano le matrici in righe (es. [3236]\begin{bmatrix}3&2\\3&6\end{bmatrix} diventa (3,2,3,6)(3,2,3,6)), si ottengono quindi dei vettori che poi si andranno a mettere incolonnati sulla matrice MM continuando con quanto descritto sopra.

Esempio (spazio vettoriale)

I vettori v1=(1,1,2),v2=(3,2,1),v3=(4,4,4),v4=(3,6,1)v_1=(1,1,2),v_2=(3,2,1),v_3=(4,4,4),v_4=(3,6,1) compongono un sistma di generatori di R3\mathbb{R}^3.
La base risultante dovrebbe essere: β={(1,1,2),(3,2,1),(4,4,4)}\beta=\{(1,1,2),(3,2,1),(4,4,4)\}.

Sfrutto la funzione indipendenzaLineare() (scritta nella sezione 4) per capire quali sono linearmente indipendenti:

p1=sp.Matrix([[1,1,2]])
p2=sp.Matrix([[3,2,1]])
p3=sp.Matrix([[4,4,4]])
p4=sp.Matrix([[3,6,1]])
vettori = [p1,p2,p3,p4]
size = len(vettori)
last_linear_indipendent = None
for d in range(size):
    dim = d+1
    for i in reversed(range(size-d)):
        print("da " + str(i) + " a " + str(i+dim))
        _vettori = vettori[i:i+dim]
        print(_vettori)
        if indipendenzaLineare(_vettori) is True:
            last_linear_indipendent = _vettori
print(last_linear_indipendent)

[Matrix([[1, 1, 2]]), Matrix([[3, 2, 1]]), Matrix([[4, 4, 4]])]

Corretto, come nell’esercizio.

Funzione riassumibile

def estrapolaLinearmenteIndipendenti(vettori):
    _, inds = sp.Matrix(vettori).T.rref()
    linear_indip = sp.zeros(0)
    for ix in inds:
        linear_indip = linear_indip.row_insert(ix, vettori.row(ix))
    return linear_indip

Esempio (spazio polinomiale)

S=Span(p1(x),p2(x),p3(x))S=Span(p_1(x),p_2(x),p_3(x))
con
p1(x)=2+x+x2p_1(x) = 2+x+x^2
p2(x)=3x+2x2p_2(x) = 3x+2x^2
p3(x)=6+x2p_3(x)=6+x^2
Considerando la base canonica di R2[x]\mathbb{R^2[x]} C={1,x,x2}C = \{1, x, x^2\} si hanno i vettori: (2,1,1),(0,3,2),(6,0,1)(2,1,1), (0,3,2), (6,0,1).
La base risultante dovrebbe essere β={p1(x),p2(x)}\beta = \{p_1(x), p_2(x)\}

p1=sp.Matrix([[2,1,1]])
p2=sp.Matrix([[0,3,2]])
p3=sp.Matrix([[6,0,1]])
vettori = sp.Matrix([p1,p2,p3])
b = estrapolaLinearmenteIndipendenti(vettori)
print(b)

[Matrix([[2, 1, 1]]), Matrix([[0, 3, 2]])]

Che, correttamente, corrispondono a p1(x)p_1(x) e p2(x)p_2(x).

Riferimenti