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).
Per il calcolo dei polinomi si fa la stessa cosa mettendoli per colonna basandosi sull’ordine della base canonica .
Per le matrici: si trasformano le matrici in righe (es. diventa ), si ottengono quindi dei vettori che poi si andranno a mettere incolonnati sulla matrice continuando con quanto descritto sopra.
I vettori compongono un sistma di generatori di .
La base risultante dovrebbe essere: .
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.
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
con
Considerando la base canonica di si hanno i vettori: .
La base risultante dovrebbe essere
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 e .