vendredi 6 août 2021
Une curiosité des polynômes d'interpolation de Lagrange appliqués aux suites, fait apparaître les coefficients du binôme de Pascal.
On appelle polynômes d'interpolation de Lagrange aux abscisses $x_0, x_1, ... ,x_{n-1}$ les polynômes $L_0, L_1, ... , L_{n-1}$ définis pour $p = 0, 1, ... , n-1$ par :
$$L_p\left(X\right) = \prod_{k=0, p\ne p}^{k=n-1} \frac{X - x_k}{x_p - x_k}$$
On a alors pour tout $k\ne p$, $L_p(x_k)=0$ et autrement $L_p(x_p)=1$.
On démontre aisément que la famille $L_0(X), L_1(X), ... , L_{n-1}(X)$ est une base de l'espace vectoriel des polynômes de degré inférieur à $n$. (Il suffit de démontrer que cette famille est libre, $a_0L_0(X) + ... + a_{n-1}L_{n-1}(X)=0 \iff ... $)
Étant donné les quatre premiers termes d'une suite $u_0, u_1, u_2, u_3$, calculons le terme $u_4$ par la méthode d'interpolation de Lagrange. (C'est plutôt une extrapolation).
Nous écrivons : $$P\left(X\right)=\frac{(X-1)(X-2)(X-3)}{(0-1)(0-2)(0-3)}u_0 + \frac{X(X-2)(X-3)}{1(1-2)(1-3)}u_1+\frac{X(X-1)(X-3)}{2(2-1)(2-3)}u_2+\frac{X(X-1)(X-2)}{3(3-1)(3-2)}u_3$$
Et nous estimons $u_4$ à
$$P\left(4\right)=\frac{(4-1)(4-2)(4-3)}{(0-1)(0-2)(0-3)}u_0 + \frac{4(4-2)(4-3)}{1(1-2)(1-3)}u_1+\frac{4(4-1)(4-3)}{2(2-1)(2-3)}u_2+\frac{4(4-1)(4-2)}{3(3-1)(3-2)}u_3$$
Soit $$\mathbf{u_4=-u_0+4u_1-6u_2+4u_3}$$
Avec $u_n=f(n)=n^2 - 1$ on a $f(4)=15$ et $u_4=-f(0)+4f(1)-6f(2)+4f(3)=15$ (évidemment !)
Mais avec $u_n=f(n)=n^3+n+1$ il y a une petite différence, puisque $f(4)=69$ et $u_4=-f(0)+4f(1)-6f(2)+4f(3)=68$.
Cet écart s'accroît en prenant $u_n=f(n)=n^4 - n^3$. $f(4)=168$ et $u_4=192$.
De même avec $f(n)=exp(x)$ on obtient $f(4)=\simeq 54.6$ et $u(4)\simeq 45.9$.
La formule $u_4=-u_0+4u_1-6u_2+4u_3$ s'écrit $u_0-4u_1+6u_2-4u_3+u_4$ et on ne peut s'empêcher de faire le parallèle avec la formule du binôme $(1-x)^4=1-4x+6x^2-4x^3+x^4$. Formellement il suffit de remplacer $x^k$ par $u_k$.
Le code (lagrange.py) :
#!/usr/bin/env python3
from sympy import *
def L(n, p):
N = prod([n - k for k in range(n) if k != p])
D = prod([p - k for k in range(n) if k != p])
return N//D
for n in range(2, 10):
sgn = "" if sign(L(n, 0)) >=0 else "-"
print(f"u{n} = {sgn}u0", end="")
for p in range(1, n):
a = L(n, p) # coefficient de u_p
sgn = " +" if sign(a) >= 0 else " -"
print(f"{sgn} {abs(a)}u{p}", end="")
print()
Commentaires :
La librairie sympy n'est utilisée que pour la fonction prod
Ligne 8 : $L(n, 0)$ est soit égal 1 soit égal à -1.
Ligne 9 : On affiche -u0
lorsque $L(n, 0) \lt 0$ et u0
sinon
Ligne 10 : affichage à partir de p = 1
Ligne 11 : le signe binaire est +
si $a > 0$ et -
sinon
Ligne 12 : transformation du signe de a
en signe binaire + ou - et affichage
Résultat :
u2 = -u0 + 2u1
u3 = u0 - 3u1 + 3u2
u4 = -u0 + 4u1 - 6u2 + 4u3
u5 = u0 - 5u1 + 10u2 - 10u3 + 5u4
u6 = -u0 + 6u1 - 15u2 + 20u3 - 15u4 + 6u5
u7 = u0 - 7u1 + 21u2 - 35u3 + 35u4 - 21u5 + 7u6
u8 = -u0 + 8u1 - 28u2 + 56u3 - 70u4 + 56u5 - 28u6 + 8u7
u9 = u0 - 9u1 + 36u2 - 84u3 + 126u4 - 126u5 + 84u6 - 36u7 + 9u8
Remarque : Les coefficients du binôme apparaissent très nettement, dès qu'on ramène tout dans le même membre.
Soit $u_0,...,u_{n-1}$ n termes d'une suite $(n\in ℕ^+)$.
L'interpolation par les polynômes de Lagrange sera : $P(X)=\sum_{p=0}^{n-1} L_p(X)u_p$ où $$L_p\left(X\right)= \prod_{k=0, k\ne k}^{n-1} \frac{X - k}{p - k}$$
On souhaite approcher $u_{n}$ par $P(n)$.
Les polynômes de Lagrange deviennent : $$L_p\left(n\right)= \prod_{k=0, k\ne p}^{n-1} \frac{n - k}{p - k}$$ ou encore :
$$L_p\left(n\right)=\prod_{k=0}^{p-1}\frac{n-k}{p-k}×\prod_{k=p+1}^{k=n-1}\frac{n-k}{p-k}$$
Pour $p=0$ on a
$$L_0\left(n\right)=\frac{(n-1)...1}{(0-1)...(0-n+1)}=(-1)^{n-1}$$
Et pour $p\gt0$, en explicitant :
$$L_p\left(n\right)=\frac{n×...×(n-p+1)}{p×...×1}×\frac{(n-p-1)×...×1}{(-1)×...×(p-n+1)}$$
La première fraction est littéralement l'expression du coefficient du binôme $$(_p^n)$ (ou $C_n^p$ pour les anciens comme moi).
Dans la deuxième fraction on retrouve en bas les opposés des facteurs du haut, écrits en sens inverse. Comme leur nombre est $n-p-1$, cette fraction vaut $(-1)^{n-p-1}$.
Finalement : $$L_p\left(n\right)=(-1)^{n-p-1}(_p^n)$$ et
$$\mathbf{u_n=(-1)^{n-1}u_0+(-1)^{n-2}(_1^n)u_1+...+(-1)^{n-p-1}(_p^n)u_p+...+nu_{n-1}}$$
Avec la notation $C_n^p$ ça donne :
$$u_n=(-1)^{n-1}u_0+(-1)^{n-2}C_n^1 u_1+...+(-1)^{n-p-1}C_n^p u_p+...+nu_{n-1}$$
La curiosité de l'affaire, pour laquelle j'ai rédigé cet article, et qu'en ramenant tout dans le même membre on retrouve l'expression de $(u-1)^n$ dans laquelle on a substitué au monôme $(-1)^{n-p-1}u^p$ le terme $(-1)^{n-p-1}u_p$.
Remarque : En LaTex il suffit de remplacer toutes les occurences de u^p
par u_p
.