Polynômes de Legendre par Gram-Schmidt

P Reinhardt, LCT, UPMC

Clear["Global`*"]

Le problème

La base des polynômes primitives 1, x, etc n’est pas une base orthogonale. Nous allons l’orthogonaliser systématiquement par la procédure Gram-Schmidt.

(Subscript[a, 1]^('))=(Subscript[a, 1]) ; (Subscript[a, 1]^(''))=(Subscript[a, 1]^('))/|(Subscript[a, 1]^('))| ;   (Subscript[a, n]^('))=(Subscript[a, n])-(∑_(i=1)^(i-1))((Subscript[a, n]).(Subscript[a, i]^('')))(Subscript[a, i]^(''))   et  (Subscript[a, n]^(''))=(Subscript[a, n]^('))/|(Subscript[a, n]^('))| 
avec le produit scalaire (∫_(-1)^1)f(x)g(x)dx

La base des polynômes

npolys=8

X=x^(Range[npolys]-1)

Représentation comme matrice

f[i_,j_]:=0
Vec=Array[f,{npolys,npolys}];
Do[Vec[[i,i]]=Vec[[i,i]]+1,{i,1,npolys}]
Vec//MatrixForm

Le produit scalaire entre deux polynômes primitifs

Stmp[i_,j_]:=Integrate[X[[i]] X[[j]],{x,-1,1}]
S=Array[Stmp,{npolys,npolys}];

S//MatrixForm

ArcCos[2./5]/π*180

La procédure

Do[{
tmp=Table[Vec[[i,ii]],{ii,1,npolys}];
Do[{tmp2=Table[Vec[[j,ii]],{ii,1,npolys}];
tmp=tmp-(tmp2.(S.tmp))tmp2//Simplify;},{j,1,i-1}];
n=1/Sqrt[tmp.S.tmp];
tmp=tmp*n;
Do[Vec[[i,ii]]=tmp[[ii]],{ii,1,npolys}]},{i,1,npolys}]

Normalisation de la solution pour que P[1]=1

Do[{n=Table[Vec[[i,ii]],{ii,1,npolys}].X/.x->1//Simplify;
Do[Vec[[i,iii]]=Vec[[i,iii]]/n,{iii,1,npolys}]},{i,1,npolys}]

Le résultat final

N [Vec.X]//Simplify//TableForm
Vec.S.Transpose[Vec]