\(S\) e un sottospazio di \(V\) su cui è definito un prodotto scalare qualsiasi \(\langle , \rangle\). Il sottospazio ortogonale di \(S\) in \(V\) è
\(S^{\perp}:=\{{\textbf v}v \in V t.c. \langle {\textbf v}, {\textbf s}v, s \rangle = 0, \forall {\textbf s}s \in S \}\)
Il complemento ortogonale di un sottospazio \(S\) è l'insime dei vettori di \(V\) che sono ortogonali a tutti i vettori di \(S\).
def baseComplementoOrtogonale(forma_bilineare, definizione, base_V, generatori_S=None, equazioni_cartesiane=None, incognite_equazioni_cartesiane=None,
parametri_liberi_equazioni_cartesiane=None, parametri_liberi=None):
"""Base sosttospazio S"""
if generatori_S is not None:
base_S = estrapolaLinearmenteIndipendenti(generatori_S)
elif equazioni_cartesiane is not None and incognite_equazioni_cartesiane is not None:
base_S = baseDaSpazioSoluzioniSistema(equazioni_cartesiane, incognite_equazioni_cartesiane, parametri_liberi_equazioni_cartesiane)
else:
raise Exception("Nessuna definizione del sottospazio S fornita")
"""Vettore coordinate"""
v = sp.zeros(1, len(forma_bilineare[0]))
for i in range(len(forma_bilineare[0])):
v += forma_bilineare[0][i] * base_V.row(i)
"""Sistema lineare omogeneo"""
sistema = []
for i in range(base_S.shape[0]):
_def = definizione
for j in range(len(forma_bilineare[1])):
_def = _def.subs(forma_bilineare[0][j], v[0, j])
_def = _def.subs(forma_bilineare[1][j], base_S[i,j])
sistema.append(_def)
base_sol = baseDaSpazioSoluzioniSistema(sistema, list(forma_bilineare[0]), parametri_liberi)
"""moltiplicazione base soluzioni su vettori base"""
base_S_ort = sp.zeros(0)
for row in range(base_sol.shape[0]):
vettore_base_S_ort = sp.zeros(1, base_V.shape[1])
for col in range(base_sol.shape[1]):
vettore_base_S_ort += base_sol.row(row).col(col) * base_V.row(col)
base_S_ort = base_S_ort.row_insert(row, vettore_base_S_ort)
return base_S_ort
x1,x2,x3,y1,y2,y3 = sp.symbols("x1 x2 x3 y1 y2 y3")
generatori_S = sp.Matrix([[1,2,3],[2,2,2]])
base_V = sp.Matrix([[1,-1,0],[0,1,1],[0,0,1]])
forma_bilineare = [(x1,x2,x3),(y1,y2,y3)]
definizione = x1*y1+x2*y2+x3*y3
result = baseComplementoOrtogonale(forma_bilineare, definizione, base_V, generatori_S=generatori_S)
pprint.pprint(result)
Matrix([[1, -2, 1]])
Come da esercizio.
x1,x2,x3,y1,y2,y3 = sp.symbols("x1 x2 x3 y1 y2 y3")
x,y,z = sp.symbols("x y z")
equazioni_cartesiane = [
x-y-z,
y-z
]
base_V = sp.Matrix([[1,0,0],[0,1,0],[0,0,1]])
forma_bilineare = [(x1,x2,x3),(y1,y2,y3)]
definizione = x1*y1+x2*y2+x3*y3
result = baseComplementoOrtogonale(forma_bilineare, definizione, base_V, equazioni_cartesiane=equazioni_cartesiane, incognite_equazioni_cartesiane=[x,y,z],
parametri_liberi_equazioni_cartesiane=[z], parametri_liberi=[x1, x2])
pprint.pprint(result)
Matrix([ [1, 0, -2], [0, 1, -1]])
Come da esercizio.
x1,x2,x3,y1,y2,y3 = sp.symbols("x1 x2 x3 y1 y2 y3")
"""Errore nella consegna dell'esercizio: l'ultimo valore del terzo vettore del generatore è +6, non -6"""
generatori_S = sp.Matrix([[1,0,0],[0,-1,3],[-1,-2,6]])
base_V = sp.Matrix([[1,0,0],[0,1,0],[0,0,1]])
forma_bilineare = [(x1,x2,x3),(y1,y2,y3)]
definizione = x1*y1 + x1*y3 + x2*y2 + x3*y1 + 2*x3*y3
result = baseComplementoOrtogonale(forma_bilineare, definizione, base_V, generatori_S=generatori_S, parametri_liberi=[x3])
pprint.pprint(result)
Matrix([[-1, 3, 1]])
Come da esercizio.
Dati i generatori \(\{1+x, 1+x^2\}\) e la base canonica di \(\mathbb{R}_2[x]\): \(1+x+x^2\), si effettua il passaggio allo spazio vettoriale con la funzione spazioPolinomialeAVettoriale()
:
x,a1,b1,c1,a2,b2,c2 = sp.symbols("x a1 b1 c1 a2 b2 c2")
generatori_polinomiali_S = [1+x, 1+x**2]
base_polinomiale_V = [1, x, x**2]
generatori_S = spazioPolinomialeAVettoriale(generatori_polinomiali_S, 3, x)
base_V = spazioPolinomialeAVettoriale(base_polinomiale_V, 3, x)
def p(_x):
return a1 + b1*_x + c1*_x**2
def q(_y):
return a2 + b2*_y + c2*_y**2
def p_der(_x):
return sp.diff(p(x), x).subs(x, _x)
def q_der(_y):
return sp.diff(q(x), x).subs(x, _y)
forma_bilineare = [(a1,b1,c1),(a2,b2,c2)]
definizione = p(0)*q(0) + p_der(0)*q(1) + p(1)*q_der(0)
base_in_spazio_vettoriale = baseComplementoOrtogonale(forma_bilineare, definizione, base_V, generatori_S=generatori_S, parametri_liberi=[b1])
result = spazioVettorialeAPolinomiale(base_in_spazio_vettoriale, 3, x)
pprint.pprint(result)
x**2 + x - 2
Si riporta il risultato allo spazio polinomiale che equivale a \(\beta_{S^{\perp}} = \{-2 + x + x^2\}\). Come da esercizio.