Complemento ortogonale di un sottospazio

\(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\).

Teoremi

  • Il complemento ortogonale è un sottospazio, poiché ponendo \(\langle {\textbf v},{\textbf s} \rangle = 0\) ne consegue che \(\langle {\textbf v}_1+{\textbf v}_2,{\textbf s} \rangle = \langle {\textbf v}_1,{\textbf s} \rangle+\langle {\textbf v}_2,{\textbf s} \rangle=0+0=0\) e \(\langle \alpha*{\textbf v},{\textbf s} \rangle = \alpha*\langle {\textbf v},{\textbf s} \rangle<v,s> = 0\) ne consegue che \(<v_1+v_2,s> = <v_1,s>+<v_2,s>=0+0=0\) e \(<\alpha*v,s> = \alpha*<v,s> = \alpha*0 = 0\), quindi \({\textbf v}_1+{\textbf v}v_1+v_2 \in S^{\perp}\) e \(\alpha*{\textbf v}v \in S^{\perp}\), quindi S è chiuso rispetto a somma dei vettori e prodotto di un vettore per uno scalare (definizione di sottospazio).
  • Un vettore appartiene ad \(S^{\perp}\) se e solo se è ortogonale ai vettori di una base di \(S\). Questo si dimostra dal fatto che qualsiasi prodotto scalare con \({\textbf v}v \in V\) e \({\textbf s}s \in S\) si può porre uguale alla combinazione lineare \(\langle {\textbf v},{\textbf s} \rangle = \langle {\textbf v}<v,s> = <v, ..a_is_i,.. \rangle>\) con i vettori \(s_i\) appartenenti alla base \(\beta\) di \(S\) (per definizione di base). Per la linearità del prodotto scalare \(\langle {\textbf v}<v,..a_ns_n.. \rangle>\) può diventare \(a \langle {\textbf v},s_n \rangle<v,s_n>\) che, essendo \(s_n\) parte della base, sappiamao dare \(0\). Quindi tutta la combinazione lineare risulterà avere componenti = 0, cosa che conferma il completamento.
  • se \(\langle , \rangle\) è un prodotto scalare definito positivo allora il completamento è il sottospazio banale. Ossia se \(S\) (sottospazio) \(= V\) allora \(S^{\perp}=V^{\perp}=\{0\}\)
  • se \(V\) è uno spazio vettoriale in cui è stato definito un prodotto scalare definito positivo ed \(S\) è un sottospazio di \(V\) allora \(V= S \oplus{\textbf s} S^{\perp}\) vale a dire che \(V\) è somma diretta di \(S\) e \(S^{\perp}\). Ne consegue che \(dim(S^{\perp}) = dim(V) - dim(S)\)
  • dall'ultimo teorema deriva che se \(S\) è sottospazio di \(\mathbb{R}^n\) e il prodotto scalare considerato è quello canonico/euclideo (in quanto comporta che il prodotto scalare sia definito positivo) allora ne consegue che \(\mathbb{R}^n = S \oplus S^{\perp}\)

Base per il completamento ortogonale di un sottospazio

  • Calcolare una base di \(S\) tale \(\beta_S = \{{\textbf s}_1,{\textbf s}_2,..,{\textbf s}s_1,s_2,..,s_m\}\) con \(m \le n\)
  • fissare una base di \(V\) tale \(\beta_V = \{{\textbf v}_1,{\textbf v}_2,..,{\textbf v}v_1,v_2,..,v_n\}\) considerando un qualsiasi vettore \({\textbf v}v \in V\) come comb. lineare della base: \({\textbf v}= x_1{\textbf v}_1 + x_2{\textbf v}_2 + .. + x_n{\textbf v}_n\)
  • \({\textbf v}v = x_1v_1 + x_2v_2 + .. + x_nv_n\)
  • \(v \in S^{\perp}\) solo se \({\textbf v}v\) è ortogonale a tutti i vettori della base di \(S\), ossia il prodotto scalare di \({\textbf v}v\) con ciascun vettore della base \(\beta_S\) è uguale a 0: \(\langle {\textbf v}, {\textbf s}v, s_i \rangle = 0\)
  • sviluppando i prodotti scalari si ottiene un sistema lineare nelle incognite \(x_1,x_2,..,x_n\) che sono le coordinate del vettore \({\textbf v}v\) riferite alla base \(\beta_V\)
  • si determina una base delle soluzioni del sistema lineare \(\beta_{sol}\) (vedi sezione "Base dalle soluzioni di un sistema lineare").
  • si moltiplicano ordinatamente le coordinate di ciascun vettore \(\beta_{sol}\) per i vettori di \(\beta_V\) ottenendo una base di \(S^{\perp}\).

Funzione riassumibile - Forma vettoriale

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

Esempio - Prodotto scalare euclideo

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.

Esempio - Sottospazio definito da equazioni cartesiane (con prodotto scalare euclideo)

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.

Esempio - Prodotto scalare qualsiasi

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.

Esempio - Prodotto scalare polinomiale

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.

Riferimenti

  • https://www.youmath.it/lezioni/algebra-lineare/applicazioni-lineari/3975-complemento-ortogonale-di-un-sottospazio-vettoriale.html
  • https://www.youmath.it/lezioni/algebra-lineare/applicazioni-lineari/3976-base-del-complemento-ortogonale.html