6.28.33 Interpolation de Lagrange : lagrange interp
Selon le dernier paramètre on a :
-
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 []).
- lagrange effectue aussi le calcul des différences divisées du
polynôme de Lagrange (le dernier paramètre est alors lagrange).
-
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).
- 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