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\).
Inoltre, se \(V=\mathbb{R}^n\) e se \(\langle , \rangle\) è prodotto scalare canonico:
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:
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)\):
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()
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.
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.
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.