Interpolation de Lagrange : lagrange interp

### 6.27.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
   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
   Le calcul des αk se fait par récurrence.
   Notations
   On note :
   αk=f[x0..xk]
   Pk le polynôme de lagrange qui interpole f en [x0..xk], donc
   Pk(x)=α0+α1(x−x0)+...+αk(x−x0)(x−x1)...(x−xk−1)
   Qk le polynôme de lagrange qui interpole f en [x1..xk+1], donc
   Qk(x)=β0+β1(x−x1)+...+βk(x−x1)(x−x2)...(x−xk)
   β0=f[x1], β1=f[x1x2], β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([0,1,2],[1,2,-1])`

On obtient :

`1+3*x-2*x```^```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(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`