### 6.28.33 Interpolation de Lagrange : lagrange interp

Selon le dernier paramètre on a :

1. lagrange permet d’interpoler une fonction f aux points d’abscisses xk (k=0..n−1) par un polynôme de degré n−1 : c’est le polynôme d’interpolation de Lagrange.
   lagrange renvoie ce polynôme soit sous forme symbolique, soit selon la liste de ses coefficients (le dernier paramètre doit être alors le nom de la variable choisie ou []).
2. lagrange effectue aussi le calcul des différences divisées du polynôme de Lagrange (le dernier paramètre est alors lagrange).

1. Polynôme d’interpolation de Lagrange
   lagrange a 1, 2 ou 3 arguments :
   - deux listes de longueur n (ou une matrice de deux lignes et n colonnes) et eventuellement le nom de la variable var (par défaut x) pour que le polynôme soit sous forme symbolique ou eventuellement une liste vide ([]) pour que le polynôme soit selon la liste de ses coefficients.
     La première liste (ou ligne) correspond à des valeurs d’abscisses xk, et La deuxième liste (ou ligne) correspond à des valeurs d’ordonnées yk pour k allant de 0 à n-1,
   - une liste de longueur n correspondant aux valeurs d’abscisses xk et une fonction f et eventuellement [] ou le nom de la variable var (par défaut x).
     Les valeurs des ordonnées sont alors yk=f(xk) pour k=0..n−1.
     lagrange renvoie une expression polynômiale P(var) de degré n-1 tel que P(xk)=yk (k=0..n−1) ou la liste des coefficients de P (selon les puissances décroissantes) c’est à dire l’écriture liste du polynôme de degré n-1 tel que P(xk)=yk (k=0..n−1).
2. Différences divisées du polynôme de Lagrange
   lagrange a comme argument deux listes de longueur n (ou une matrice de deux lignes et n colonnes) et comme dernier argument l’option lagrange de la commande lagrange.
   lagrange renvoie la liste des différences divisées :
   [α0...αn−1].
   Définition de α0,..,αn−1
   Si P(xk)=yk=f(xk) (k=0..n−1) i.e. si P interpole f en [x0,..,xn−1], on a :
   P(x)=α0+α1(x−x0)+...+αn−1(x−x0)(x−x1)...(x−xn−2)
   On a alors :
   α0=P(x0)=f(x0)
   α1=f(x1)−f(x0)/x1−x0=f[x0,x1]
   P(x2)=α0+α1(x−x0)+α2(x−x0)(x−x1)
   donc
   α2=P(x2)−α0/(x2−x0)(x2−x1)−α1/x2−x1
   P(x3)=α0+α1(x−x0)+α2(x−x0)(x−x1)+α(x−x0)(x−x1)(x−x2)
   donc
   α3=P(x3)−α0−α1(x−x0)−α2(x−x0)(x−x1/(x−x0)(x−x1)(x−x2)=
   P(x3)−α0/(x3−x0)(x3−x1)(x3−x2)−α1/(x3−x1)(x3−x2)−α2/x3−x2
   Notations
   On note :
   f[x0,x1]=α1= f(x1)−f(x0)/x1−x0
   αk=f[x0,..,xk]
   Le calcul des αk se fait par récurrence.
   Si Pk est le polynôme de lagrange qui interpole f en [x0,..,xk], on a:
   Pk(x)=α0+α1(x−x0)+...+αk(x−x0)(x−x1)...(x−xk−1)
   Si Qk est le polynôme de lagrange qui interpole f en [x1,..,xk+1], on a :
   Qk(x)=β0+β1(x−x1)+...+βk(x−x1)(x−x2)...(x−xk)
   β0=f[x1], β1=f[x1,x2], βk=f[x1,..,xk+1].
   Propriétés
   On a :
   Pk+1(x)=(xk+1−x)Pk(x)+(x−x0)Qk(x)/xk+1−x0
   et
   αk+1 est le lcoeff de Pk+1 (lcoeff(P) est le coefficient du terme de plus haut degré (dominant=leading)) donc
   αk+1=(lcoeff(Qk)-lcoeff(Pk))/(xk+1−x0)
   αk+1=(βk−αk)/(xk+1−x0) ce qui donne l’algorithme calculant les différences divisées.

On tape :

lagrange([[1,3],[0,1]])

Ou on tape :

lagrange([1,3],[0,1])

On obtient :

(x-1)/2

en effet pour x=1 on a x−1/2=0 et pour x=3 on a x−1/2=1.
On tape :

lagrange([1,3],[0,1],y)

On obtient :

(y-1)/2

On tape :

lagrange([1,3],[0,1],[])

On obtient :

[1/2,-1/2]

qui est l’écriture liste du polynôme x/2-1/2
On tape :

lagrange([1,3],[0,1],lagrange)

On obtient :

[0,1/2]

en effet : P(x)=(x−1)/2=0+1/2(x−1)
On tape :

lagrange([1,2,3,4],[15,24,33,54],x)

On obtient :

(2*(x-3)*(x-2)+9)*(x-1)+15

On tape :

lagrange([1,2,3,4],[15,24,33,54],[])

On obtient :

[2,-12,31,-6]

qui est la liste a3,a2,a1,a0 des coefficients ak de xk du polynôme (2*(x-3)*(x-2)+9)*(x-1)+15=2*x`^`3-12*x`^`2+31*x-6
On tape (lorsque l’écriture des polynômes est selon les puissances décroissantes) :

normal((2*(x-3)*(x-2)+9)*(x-1)+15)

On obtient :

2*x`^`3-12*x`^`2+31*x-6

On tape :

lagrange([1,2,3,4],[15,24,33,54],lagrange)

On obtient :

[15,9,0,2]

en effet, on a P(x)=2*x3−12*x2+31*x−6 donc :
P(1)=15, (P(2)−P(1))/(2−1)=9, (P(3)−15)/2−9=(33−15)/2−9=0
(P(4)−15)/((4−1)*(3−1)*(2−1))−9/((3−1)*(2−1))=(54−15)/6−9/2=2
On tape :

lagrange([0,1,2],[1,2,-1])

On obtient :

1+3*x-2*x`^`2

On tape :

lagrange([0,1,2],[1,2,-1],y)

On obtient :

(-2*(y-1)+1)*y+1

soit après simplification :

(1+3*y-2*y`^`2

On tape :

lagrange([0,1,2],[1,2,-1],[])

On obtient :

[-2,3,1]

qui est l’écriture liste du polynôme -2*x`^`2+3x+1
On tape :

lagrange([0,1,2],[1,2,-1],lagrange)

On obtient :

[1,1,-2]

en effet : P(0)=1, P(1)=2, P(2)=−1 et
P(x)=1+1*(x−0)−2*(x−0)*(x−1)=−2x2+3x+1
P(x)=1+x(1+(x−1)*(−2))=1+x−2x(x−1)=−2x2+3x+1
On tape :

f(x):=exp(x)-1
lagrange([-1,0,1],[f(-1),f(0),f(1)])

ou

lagrange([-1,0,1],[1/e-1,0,e-1])

ou

lagrange([-1,0,1],f)

On obtient après simplification et linéarisation du numérateur :

(-x+x`^`2+(x+x`^`2)*exp(2)-2*x`^`2*exp(1))/(2*exp(1))

On tape :

lagrange([0,1,2],[1,exp(1),exp(2)],[])

On obtient :

[(1-2*exp(1)+exp(1)`^`2)/2,(-3+4*exp(1)-exp(1)`^`2)/2,1]

On tape :

lagrange([0,1,2],[1,exp(1),exp(2)],lagrange)

ou

lagrange([0,1,2],exp,lagrange)

On obtient :

[1,exp(1)-1,(exp(1)-1)`^`2/2]

On a en effet :
P(x)=1+x((exp(1)−1)+(x−1)(exp(1)−1)2/2)
On a bien P(0)=1, P(1)=e−1, P(2)=1+2(e−1+e2/2−e+1/2)=1−2+1+e2=e2
Si on applique l’algorithme :
f[x0]=α0=1, f[x1]=β0=e, f[x2]=γ0=e2,
f[x0x1]=α1=(β0−α0)/(1−0)=e−1,
f[x1x2]=β1=(γ0−β0)/(1−0)=e2−e,
f[x1x2x3]=α2=(β1−α1)/(2−0)=(e2−2e+1)/2
Attention
lagrange([1,2],[3,4],y) ne renvoie pas une fonction mais une expression. mais on peut définir une fonction en mettant :
f(x):=lagrange([1,2],[3,4],x) ou
f(y):=lagrange([1,2],[3,4],y) et alors
f(4) renvoie 6 car f(x)=x+2)
Bien voir la différence entre :
g(x):=lagrange([1,2],[3,4]) et
f(x):=lagrange([1,2],[3,4],x).
g(x):=lagrange([1,2],[3,4]) ne definit pas une fonction, par exemple, g(2)=x-1+3 alors que f(2)=4.
Ceci dit, la définition of f n’est pas efficace car le polynôme sera recalculé depuis le début à chaque appel de f (quand on définit une fonction le membre de droite n’est pas évalué, l’évaluation est faite seulement quand on appelle f).
Pour être efficace il faut utiliser unapply:
f:=unapply(lagrange([1,2],[3,4]),x) ou
f:=unapply(lagrange([1,2],[3,4],y),y).
Exercice Soient f(x) = 1/x, x0=2 x1 = 2.5 et x2 =4. On demande de calculer le polynôme L d’interpolation de Lagrange et sa valeur en x=3 et x=4.5.
On tape :
f(x):=1/x
L:=unapply(normal(lagrange([2,2.5,4],[f(2),f(2.5),f(4)])),x)
On obtient :
x->0.05*x`^`2-0.425*x+1.15
On tape :
L(3),L(4.5)
On obtient :
0.325,0.25