Proiezione ortogonale di un vettore su un sottospazio

Da lezione precedente ("Completamento ortogonale") si evince che, relativamente ad un prodotto scalare definito positivo, \(V = S \oplus S^{\perp}\) per tanto si può indicare un qualsiasi vettore \(v\) tale che

\(v = s \oplus s^{\perp}\)

con \(v \in V, s \in S\) (sottospazio di \(V\)) e \(s^{\perp} \in S^{\perp}\).

Il vettore \(s\) è proiezione ortogonale del vettore v sul sottospazio \(S\) e si indica con \(P_S\). L'appplicazione che ad ogni vettore associa le rispettiva proiezioni sul sottospazio \(S\) è detta applicazione proiezione ortogonale o proiettore e si dimostra che per ogni \(v\):

\(P_S(v) = \langle v,u_1 \rangle u_1 + \langle v,u_2 \rangle u_2 + .. + \langle v,u_r \rangle u_r\)

dove \(\{u_1,u_2,..,u_r\}\) è una base ortonormale di \(S\).

Dimostrazione Questo perchè \(s\) (ossia \(P_S(v)\)) può essere espresso come combinazione lineare di una base di \(S\) (facendone parte) che può esprimere come scalari \(a_i\) della combinazione il prodotto scalare \(<s, u_i>\). Perchè si può esprimere lo scalare come il prodotto scalare tra \(s\) e il vettore della base? Da \(v = s+s^{\perp}\) deriva che \(v-s = s^{\perp}\), dunque \(v-s \in S^{\perp}\) è parte del complemento ortogonale, quindi ortogonale ad ogni vettore di una base di \(S\) per definizione, ossia \(<v-s,u_i>=0\) che dalla linearita del prodotto scalare conduce a \(<v, u_i> - <s,u_i>=0\); sostituendo \(s\) con la combinazione lineare \(..a_iu_i..\) si sostituisce quanto sopra con \(<v,u_i> - <..a_iu_i..., u_i>\) e sempre basandosi sulla linearità del prodotto scalare in forza della simmetria, sfruttando l'ortonormalita della base si arriva a \(<v, u_1> - a_i = 0\) e quindi \(<v, u_1> = a_i\).

Proprietà

  • \(P_S\) è un'applicazione lineare, e in quanto \(P_S: V \to V\) (perchè \(S\) è sottospazio di \(V\)) allora è un endomorfismo
  • se \(v \in S^{\perp}\) allora \(P_S(v) = 0\)
  • se \(v \in S\) allora \(P_S(v)=v\)
  • \(P_S\) è idempotente (applicarla due volte è come applicarla una volta sola): \(P_S \circ P_S = P_S\)
  • \(Ker(P_S) = S^{\perp}\) e \(Im(P_S) = S\)

Inoltre, se \(V=\mathbb{R}^n\) e se \(\langle , \rangle\) è prodotto scalare canonico:

  • la matrice associata a \(P_S\) è \(AA^T\) dove \(A\) è la matrice le cui colonne sono i vettori della base ortonormale di \(S\)
  • \(P_S\) è un endomorfismo diagonalizzabile (vedi sezione "Diagonalizzabilità")
  • Gli unici autovalori dell'endomorfismo \(P_S\) sono \(\lambda_0 = 0\) e \(\lambda_1 = 1\) con rispettive molt. algebriche e geometriche \(n-r\) e \(r\)
  • Il polinomio carattersitico riferito a \(P_S\) è \(p(\lambda) =(-1)^n\lambda^{n-r}(\lambda-1)^r\)

Calcolo della proiezione ortogonale di un vettore su un sottospazio

Sia \(V\) un sottospazio vettoriale su \(\mathbb{R}\) dotato di un prodotto scalare \(\langle , \rangle\) definito positivo, \(S\) sottospazio di \(V\) e \(S^{\perp}\) il complemento ortogonale, la formula per determinare la proiezione di un vettore \(v\) sul sottospazio \(s\) è:

\(P_S(v) = <v,u_1>u_1 + <v,u_2>u_2 + .. + <v,u_r>u_r\)

dove \(\{..u_i..\}\) è la base ortonormale si \(S\). I passaggi sono:

  • individuare una base di \(S\)
  • ortogonalizzare la base tramite Ortogonalizzazione di Gram-Schmidt (vedi sezione "Ortogonalizzazione di Gram-Shmidt")
  • rendere tale base ortonormale dividendo le componenti per la relativa norma (vedi sezione "Norma indotta da un prodotto scalare")
  • applicare la formula di sopra con \(\{..u_i..\}\) la base calcolata

Soluzione veloce

Se è nota \(dim(V)\), una volta calcolata la base di \(S\) e quindi \(dim(S)\) si può risalire a \(dim(S^{\perp}) = dim(V)-dim(S)\). Se \(dim(S^{\perp}) =1\) per calcolare \(P_S(v)\):

  • determinare una base di \(S^{\perp}\) formata da un solo vettore
  • ortonormalizzare dividendo ciascuna componente per la norma
  • calcolare \(P_S^{\perp}(v) = \langle v,u_1 \rangle u_1\)
  • calcolare \(P_S(v)\) con la differenza: \(P_S(v) = v - P_S^{\perp}(v)\)

Funzione riassumibile

def proiezioneOrtogonale(forma_bilineare: List[tuple], definizione: sp.Expr, vettore: sp.Matrix, generatori_S : sp.Matrix = None, equazioni_cartesiane : List = None, 
    incognite_equazioni_cartesiane : List = None, parametri_liberi_equazioni_cartesiane : List[sp.Symbol] = None, funzionale=False) -> sp.Matrix:

    """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")

    result = ortogonalizzazioneGramShmidt(forma_bilineare, definizione, sympyMatrixRows(base_S))
    base_ortonormale = result["baseOrtonormale"]

    proiezione_ortogonale = sp.zeros(1, base_ortonormale[0].shape[1])
    for vettore_base in base_ortonormale:
        if funzionale is False:
            _def = prodottoScalareVettori(forma_bilineare, definizione, vettore, vettore_base)
        else:
            def u(_x):
                return list(vettore_base)[0].subs("x", _x)

            _def = prodottoScalareFunzioni(forma_bilineare, definizione, vettore, u)
        proiezione_ortogonale += _def * vettore_base

    return proiezione_ortogonale.expand()

Esempio 1 - Proiezione ortogonale con prodotto scalare euclideo

x1,x2,x3,y1,y2,y3 = sp.symbols("x1 x2 x3 y1 y2 y3")

generatori_S = sp.Matrix([[1,0,0],[3,0,-4]])
vettore = sp.Matrix([[1,-2,3]])

forma_bilineare = [(x1,x2,x3),(y1,y2,y3)]
definizione = x1*y1 + x2*y2 + x3*y3

PS = proiezioneOrtogonale(forma_bilineare, definizione, vettore, generatori_S=generatori_S)
print(PS)

\(\left[\begin{matrix}1 & 0 & 3\end{matrix}\right]\)

Come da esercizio.

Esempio 2 - Proiezione ortogonale con prodotto scalare qualsiasi

x1,y1,z1,t1,x2,y2,z2,t2 = sp.symbols("x1 y1 z1 t1 x2 y2 z2 t2")
x,y,z,t = sp.symbols("x y z t")

equzioni_cartesiane = [
    x-y+2*z,
    t
]

vettore = sp.Matrix([[2,0,-1,4]])

forma_bilineare = [(x1,y1,z1,t1),(x2,y2,z2,t2)]
definizione = 2*x1*x2 + 2*y1*y2 + 12*z1*z2 + t1*t2 + x1*t2 + t1*x2

PS = proiezioneOrtogonale(forma_bilineare, definizione, vettore, 
    equazioni_cartesiane=equzioni_cartesiane, incognite_equazioni_cartesiane=[x,y,z,t])
print(PS)

\(\left[\begin{matrix}\frac{13}{4} & \frac{3}{4} & - \frac{5}{4} & 0\end{matrix}\right]\)

Come da esercizio.

Esempio 3 - Proiezione ortogonale del polinomio su un sottospazio

x,a1,b1,c1,a2,b2,c2 = sp.symbols("x a1 b1 c1 a2 b2 c2")

generatori_S = sp.Matrix([[1+x+x**2]])

def p(_x):
    return 1 + _x + _x**2

def q(_y):
    return 1 + _y + _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)

def vettore(_x):
    return 1+_x

forma_bilineare = [(p,),(q,)]
definizione = 3*p(0)*q(0) + p_der(0)*q(1) + p(1) * q_der(0) + p_der(1) * q_der(1)

PS = proiezioneOrtogonale(forma_bilineare, definizione, vettore, generatori_S=generatori_S, funzionale=True)
print(sp.latex(PS))

\(\left[\begin{matrix}\frac{127 x^{2}}{6} + \frac{127 x}{6} + \frac{127}{6}\end{matrix}\right]\)

Risultato non accertato, a causa di una diversa forma di fattorizzazione della base ortonormale.

Riferimenti

  • https://www.youmath.it/lezioni/algebra-lineare/applicazioni-lineari/3977-proiezione-ortogonale-come-applicazione-lineare.html
  • https://www.youmath.it/lezioni/algebra-lineare/applicazioni-lineari/3978-calcolo-della-proiezione-ortogonale-di-un-vettore-su-un-sottospazio.html