CoCalc Public FilesGramm-Schmidt.sagewsOpen with one click!
Author: Juan Carlos Bustamante
Views : 86
Compute Environment: Ubuntu 18.04 (Deprecated)

Gram - Schmidt : deux exemples

Rappel

Commençons par faire un rappel du procédé de Gramm - Schmidt. On devrait peut être dire des procedés de Gramm -Schmidt, l'un étant un procedé d'orthogonalisation l'autre une procédé d'orthonormalisation. Aussi, prennons la convention de démarrer le procédé avec une famille linéairement indépendante de vecteurs. Ainsi, on peut énoncer :

Procédé de Gram - Schmidt.

Soit V\cal{V} un espace vectoriel et {ui}i=1n\{ \mathbf{u}_i\}_{i=1}^n une famille de vecteurs linéairement indépendants. On procède comme suit :

  • On pose f1=u1\mathbf{f}_1 = \mathbf{u}_1 et W1=Vect(u1)\cal{W}_1 = {\sf Vect}(\mathbf{u}_1)
  • On pose f2=u2projW1u2\mathbf{f}_2 = \mathbf{u}_2 - {\sf proj}_{{\cal W}_1}\mathbf{u_2} et W2=Vect(f1,f2)\cal{W}_2 = {\sf Vect}(\mathbf{f_1},\mathbf{f}_2) (ici on peut noter que W2\cal{W}_2 coïncide avec Vect(u1,u2){\sf Vect}(\mathbf{u_1},\mathbf{u}_2))
  • On pose f3=u3projW2u3\mathbf{f}_3 = \mathbf{u}_3 - {\sf proj}_{{\cal W}_2}\mathbf{u_3} et W3=Vect(f1,f2,f3)\cal{W}_3 = {\sf Vect}(\mathbf{f_1},\mathbf{f}_2, \mathbf{f}_3)
  • \cdots

La famille des vecteurs {fi}i=1n\{\mathbf{f}_i\}_{i=1}^n est une famille orthogonale. Pour le processus d'orthogonalisation on arrête ici.

Si on veut le procédé d'orthonormalisation on doit construire vi=1fifi\mathbf{v}_i = \frac{1}{||\mathbf{f}_i||}\mathbf{f}_i.

Remarque 1

Si on pose W=Vect({ui})\cal{W}={\sf Vect}(\{\mathbf{u}_i\}) nous avons que :

  • Les vecteurs ui\mathbf{u}_i forment une base de W\cal{W},
  • Les vecteurs fi\mathbf{f}_i forment une base orthogonale de W\cal{W},
  • Les vecteurs vi\mathbf{v}_i forment une base orthonormale de W\cal{W}.

Remarque 2

On peut démarrer le procédé avec une famille infinie de vecteurs. On obtient alors :

  • Les vecteurs fi\mathbf{f}_i forment un ensemble orthogonal de vecteurs (pas nécessairement une base, au sens algébrique du terme).
  • Les vecteurs vi\mathbf{v}_i forment un ensemble orthonormal de vecteurs (pas nécessairement une base, au sens algébrique du terme).

La subtilité sera éclaircie quand nous traiterons des espaces de Hilbert.

Remarque 3

La notion de projection se fait au moyen du produit scalaire. Or on a vu que dans un mème ensemble on peut définir différents produits scalaires. Les exemples qui suivent couvrent au moins deux contextes.

Exemple 1.

L'espace vectoriel est V=R3\cal{V} = \mathbb{R}^3 avec le produit scalaire usuel. On commence avec les vecteurs u1=(1,2,2),u2=(1,0,4),u3=(5,2,0)\mathbf{u}_1 = (1,2,-2), \mathbf{u}_2 = (1,0,-4), \mathbf{u}_3 = (5,2,0). On va extraire une base orthogonale, puis une base orthonormale pour l'espace engendré par ces vecteurs. Comme le produit scalaire est le produit usuel, nous allons utiliser les commandes déjà présentes dans SAGEmath pour définir l'opération de projection.

def proj(v,u): return u.dot_product(v)/u.dot_product(u)*u
typeset_mode(True) u1=vector([1,2,-2]) u2= vector([1,0,-4]) u3=vector([5,2,0])
f1 = u1
f2 = u2 - proj(u2, f1) f2
(0,2,2)\displaystyle \left(0,\,-2,\,-2\right)
f3 = u3-proj(u3,f2)-proj(u3,f1) f3
(4,1,1)\displaystyle \left(4,\,-1,\,1\right)
v1 = f1.normalized() v2 = f2.normalized() v3 = f3.normalized() v1 v2 v3
(13,23,23)\displaystyle \left(\frac{1}{3},\,\frac{2}{3},\,-\frac{2}{3}\right)
(0,122,122)\displaystyle \left(0,\,-\frac{1}{2} \, \sqrt{2},\,-\frac{1}{2} \, \sqrt{2}\right)
(232,162,162)\displaystyle \left(\frac{2}{3} \, \sqrt{2},\,-\frac{1}{6} \, \sqrt{2},\,\frac{1}{6} \, \sqrt{2}\right)

Exemple 2.

On reprend l'exemple vu en classe (les polynômes de Legendre). L'espace vectoriel est V=R3[x]\cal{V}=\mathbb{R}_{\leqslant 3}[x], c'est à dire les polynômes de degré au plus 33 à coefficients réels. Le produit scalaire considéré cette fois est pq=11p(t)q(t) dt \langle p | q\rangle = \int_{-1}^1 p(t)\cdot q(t)\ {\rm d}t On commence avec la famille de vecteurs (polynômes) {1,x,x2,x3}\{1,x,x^2,x^3\} Posons ui(x)=xiu_i(x) = x^i pour i{0,1,2,3}i\in \{0,1,2,3\}.

Cete fois on doit définir le produit scalaire à considérer. Une fois ceci fait, l'opération de projection suivra plutôt directement.

def ps(p,q): return integrate(p(x)*q(x),x,-1,1)
def pproj(p,q): return ps(p,q)/ps(q,q)*q
u0(x) = 1 u1(x) = x u2(x) = x^2 u3(x) = x^3
765a8a8d-dbe9-4e20-a507-3d6167af5595 f0(x) = u0(x) f0(x)
1
f1(x) = u1- pproj(u1,f0) f1(x)
x
f2(x) = u2 - pproj(u2,f0)- pproj(u2,f1) f2(x)
x^2 - 1/3
f3(x) = u3 - pproj(u3,f0)- pproj(u3,f1) - pproj(u3,f2) f3(x)
x^3 - 3/5*x

Les polynomes obtenus sont deux à deux orthogonaux. Normalisons-les maintenant.

v1(x) = f1(x)/ps(f1,f1) v1(x)
32x\displaystyle \frac{3}{2} \, x
v2(x) = f2(x)/ps(f2,f2) v2(x)
458x2158\displaystyle \frac{45}{8} \, x^{2} - \frac{15}{8}
v3(x) = f3(x)/ps(f3,f3) v3(x)
1758x31058x\displaystyle \frac{175}{8} \, x^{3} - \frac{105}{8} \, x