Méthode de Newton-Gregory (différences descendantes)

Objectifs d'apprentissage

À la fin de cette leçon, vous serez en mesure de :

  • Calculer les différences finies descendantes Δnf\Delta^n f
  • Construire une table de différences
  • Appliquer la formule de Newton-Gregory pour l'interpolation
  • Estimer l'erreur d'interpolation à partir des différences
  • Passer efficacement d'un polynôme de degré nn à n+1n+1

Prérequis

  • Polynômes de Lagrange
  • Notion de pas constant (intervalles équidistants)

Motivation

Limitations de la méthode de Lagrange

La formule de Lagrange présente un inconvénient majeur : si on ajoute un nouveau point de données, il faut tout recalculer depuis le début. La méthode de Newton-Gregory résout ce problème en construisant le polynôme de manière incrémentale.

Avantages de Newton-Gregory

  • Passage facile du degré nn au degré n+1n+1
  • Structure récursive permettant d'estimer l'erreur
  • Particulièrement adaptée aux données à pas constant

Différences finies descendantes

Définition

Pour une fonction ff tabulée aux points équidistants x0,x1,x2,x_0, x_1, x_2, \ldots avec un pas hh, les différences descendantes sont définies récursivement :

Différence d'ordre 0 (valeur de la fonction) :

Δ0fi=fi\Delta^0 f_i = f_i

Différence d'ordre 1 :

Δfi=fi+1fi\Delta f_i = f_{i+1} - f_i

Différence d'ordre 2 :

Δ2fi=Δfi+1Δfi=fi+22fi+1+fi\Delta^2 f_i = \Delta f_{i+1} - \Delta f_i = f_{i+2} - 2f_{i+1} + f_i

Différence d'ordre n :

Δnfi=Δn1fi+1Δn1fi\Delta^n f_i = \Delta^{n-1} f_{i+1} - \Delta^{n-1} f_i

Construction de la table de différences

Exemple : table de sin(x)

Considérons f(x)=sin(x)f(x) = \sin(x) avec x0=0.1x_0 = 0.1 et h=0.4h = 0.4 :

ixᵢfᵢ = sin(xᵢ)ΔfᵢΔ²fᵢΔ³fᵢΔ⁴fᵢ
00.10.099830.37960-0.07570-0.047970.01951
10.50.479430.30390-0.12367-0.02846
20.90.783330.18023-0.15213
31.30.963560.02810
41.70.99166

Calcul des différences

Différences d'ordre 1 :

  • Δf0=f1f0=0.479430.09983=0.37960\Delta f_0 = f_1 - f_0 = 0.47943 - 0.09983 = 0.37960
  • Δf1=f2f1=0.783330.47943=0.30390\Delta f_1 = f_2 - f_1 = 0.78333 - 0.47943 = 0.30390
  • Δf2=f3f2=0.963560.78333=0.18023\Delta f_2 = f_3 - f_2 = 0.96356 - 0.78333 = 0.18023
  • Δf3=f4f3=0.991660.96356=0.02810\Delta f_3 = f_4 - f_3 = 0.99166 - 0.96356 = 0.02810

Différences d'ordre 2 :

  • Δ2f0=Δf1Δf0=0.303900.37960=0.07570\Delta^2 f_0 = \Delta f_1 - \Delta f_0 = 0.30390 - 0.37960 = -0.07570
  • Δ2f1=Δf2Δf1=0.180230.30390=0.12367\Delta^2 f_1 = \Delta f_2 - \Delta f_1 = 0.18023 - 0.30390 = -0.12367
  • Δ2f2=Δf3Δf2=0.028100.18023=0.15213\Delta^2 f_2 = \Delta f_3 - \Delta f_2 = 0.02810 - 0.18023 = -0.15213

Et ainsi de suite pour les ordres supérieurs.


Formule de Newton-Gregory descendante

Variable réduite

Pour simplifier l'écriture, on introduit la variable réduite ss :

s=xx0hs = \frac{x - x_0}{h}

Cette variable mesure « combien de pas hh » on s'est déplacé depuis x0x_0 :

  • Si s=0s = 0, on est en x=x0x = x_0
  • Si s=1s = 1, on est en x=x1=x0+hx = x_1 = x_0 + h
  • Si s=0.5s = 0.5, on est à mi-chemin entre x0x_0 et x1x_1

Coefficient binomial généralisé

La notation binomiale généralisée étend la formule classique aux valeurs non entières :

(sk)=s(s1)(s2)(sk+1)k!\binom{s}{k} = \frac{s(s-1)(s-2)\cdots(s-k+1)}{k!}

C'est un produit de kk facteurs consécutifs au numérateur, divisé par k!k!.

Exemples de calcul :

  • (s0)=1\binom{s}{0} = 1 (par convention)
  • (s1)=s\binom{s}{1} = s
  • (s2)=s(s1)2\binom{s}{2} = \frac{s(s-1)}{2}
  • (s3)=s(s1)(s2)6\binom{s}{3} = \frac{s(s-1)(s-2)}{6}
⚠️

Attention aux valeurs négatives

Contrairement au coefficient binomial classique (toujours positif pour des entiers), (sk)\binom{s}{k} peut être négatif si ss est compris entre deux entiers. Par exemple, pour s=1.5s = 1.5 :

(1.52)=1.5×0.52=0.375>0\binom{1.5}{2} = \frac{1.5 \times 0.5}{2} = 0.375 > 0
(1.53)=1.5×0.5×(0.5)6=0.0625<0\binom{1.5}{3} = \frac{1.5 \times 0.5 \times (-0.5)}{6} = -0.0625 < 0

La formule

Le polynôme d'interpolation de Newton-Gregory est :

Pn(x)=f0+(s1)Δf0+(s2)Δ2f0++(sn)Δnf0P_n(x) = f_0 + \binom{s}{1}\Delta f_0 + \binom{s}{2}\Delta^2 f_0 + \cdots + \binom{s}{n}\Delta^n f_0

Ou de manière compacte :

Pn(x)=k=0n(sk)Δkf0P_n(x) = \sum_{k=0}^{n} \binom{s}{k} \Delta^k f_0

Lecture : Le polynôme est une somme pondérée des différences Δkf0\Delta^k f_0, où les poids sont les coefficients binomiaux évalués en ss.

💡

Avantage clé : structure incrémentale

Pour passer de PnP_n à Pn+1P_{n+1}, il suffit d'ajouter un seul terme :

Pn+1(x)=Pn(x)+(sn+1)Δn+1f0P_{n+1}(x) = P_n(x) + \binom{s}{n+1}\Delta^{n+1} f_0

C'est la grande force de Newton-Gregory par rapport à Lagrange : on peut raffiner l'interpolation sans tout recalculer.


Exemple : calcul de sin(0.8)

Données

Utilisons la table de sin(x) avec x0=0.1x_0 = 0.1, h=0.4h = 0.4.

Pour x=0.8x = 0.8 :

s=0.80.10.4=0.70.4=1.75s = \frac{0.8 - 0.1}{0.4} = \frac{0.7}{0.4} = 1.75

Polynôme de degré 2

P2(x)=f0+sΔf0+s(s1)2Δ2f0P_2(x) = f_0 + s \cdot \Delta f_0 + \frac{s(s-1)}{2} \cdot \Delta^2 f_0

Avec les valeurs :

  • f0=0.09983f_0 = 0.09983
  • Δf0=0.37960\Delta f_0 = 0.37960
  • Δ2f0=0.07570\Delta^2 f_0 = -0.07570
(1.751)=1.75\binom{1.75}{1} = 1.75
(1.752)=1.75×0.752=1.31252=0.65625\binom{1.75}{2} = \frac{1.75 \times 0.75}{2} = \frac{1.3125}{2} = 0.65625
P2(0.8)=0.09983+1.75×0.37960+0.65625×(0.07570)P_2(0.8) = 0.09983 + 1.75 \times 0.37960 + 0.65625 \times (-0.07570)
P2(0.8)=0.09983+0.664300.04967=0.71446P_2(0.8) = 0.09983 + 0.66430 - 0.04967 = 0.71446

Polynôme de degré 3

Pour améliorer la précision, ajoutons le terme de degré 3 :

(1.753)=1.75×0.75×(0.25)6=0.3281256=0.0547\binom{1.75}{3} = \frac{1.75 \times 0.75 \times (-0.25)}{6} = \frac{-0.328125}{6} = -0.0547
P3(0.8)=P2(0.8)+(1.753)×Δ3f0P_3(0.8) = P_2(0.8) + \binom{1.75}{3} \times \Delta^3 f_0
P3(0.8)=0.71446+(0.0547)×(0.04797)=0.71446+0.00262=0.71708P_3(0.8) = 0.71446 + (-0.0547) \times (-0.04797) = 0.71446 + 0.00262 = 0.71708

Comparaison

MéthodeValeurErreur
P2(0.8)P_2(0.8)0.714460.00290
P3(0.8)P_3(0.8)0.717080.00028
sin(0.8)\sin(0.8) exact0.71736

Le passage au degré 3 a réduit l'erreur d'un facteur 10.


Estimation de l'erreur

Sans connaître la fonction exacte

Un avantage majeur de Newton-Gregory est qu'on peut estimer l'erreur sans connaître la fonction ff.

L'erreur du polynôme de degré nn est approximativement :

En(x)(sn+1)Δn+1f0E_n(x) \approx \binom{s}{n+1} \Delta^{n+1} f_0

C'est simplement le terme suivant dans le développement !

Exemple

Pour P2(0.8)P_2(0.8), l'erreur estimée est :

E2(0.8)(1.753)×Δ3f0=(0.0547)×(0.04797)=0.00262E_2(0.8) \approx \binom{1.75}{3} \times \Delta^3 f_0 = (-0.0547) \times (-0.04797) = 0.00262

L'erreur réelle était 0.00290, l'estimation est donc raisonnable.

Critère d'arrêt

On peut ajouter des termes au polynôme jusqu'à ce que le terme ajouté (l'erreur estimée) soit inférieur à la tolérance souhaitée.

Exemple complet : estimation d'erreur avec F(x)

Reprenons l'exemple de la leçon précédente (Lagrange). Soit la fonction F(x)F(x) tabulée aux points :

ixᵢF(xᵢ)
001
111
222
335

Les points sont équidistants avec h=1h = 1 et x0=0x_0 = 0. Nous voulons estimer F(1.7)F(1.7).

Étape 1 : Construire la table de différences

iFᵢΔFᵢΔ²FᵢΔ³Fᵢ
01011
1112
223
35

Calcul des différences :

  • ΔF0=F1F0=11=0\Delta F_0 = F_1 - F_0 = 1 - 1 = 0
  • ΔF1=F2F1=21=1\Delta F_1 = F_2 - F_1 = 2 - 1 = 1
  • ΔF2=F3F2=52=3\Delta F_2 = F_3 - F_2 = 5 - 2 = 3
  • Δ2F0=ΔF1ΔF0=10=1\Delta^2 F_0 = \Delta F_1 - \Delta F_0 = 1 - 0 = 1
  • Δ2F1=ΔF2ΔF1=31=2\Delta^2 F_1 = \Delta F_2 - \Delta F_1 = 3 - 1 = 2
  • Δ3F0=Δ2F1Δ2F0=21=1\Delta^3 F_0 = \Delta^2 F_1 - \Delta^2 F_0 = 2 - 1 = 1

Étape 2 : Calculer la variable réduite

s=xx0h=1.701=1.7s = \frac{x - x_0}{h} = \frac{1.7 - 0}{1} = 1.7

Étape 3 : Polynôme de degré 2 et estimation de l'erreur

Calculons d'abord P2(1.7)P_2(1.7) en utilisant les 3 premiers points :

P2(x)=F0+(s1)ΔF0+(s2)Δ2F0P_2(x) = F_0 + \binom{s}{1}\Delta F_0 + \binom{s}{2}\Delta^2 F_0

Avec s=1.7s = 1.7 :

  • (1.71)=1.7\binom{1.7}{1} = 1.7
  • (1.72)=1.7×0.72=1.192=0.595\binom{1.7}{2} = \frac{1.7 \times 0.7}{2} = \frac{1.19}{2} = 0.595
P2(1.7)=1+1.7×0+0.595×1=1.595P_2(1.7) = 1 + 1.7 \times 0 + 0.595 \times 1 = 1.595

Estimation de l'erreur de P2P_2 par le terme suivant :

E2(1.7)(1.73)×Δ3F0E_2(1.7) \approx \binom{1.7}{3} \times \Delta^3 F_0
(1.73)=1.7×0.7×(0.3)6=0.3576=0.0595\binom{1.7}{3} = \frac{1.7 \times 0.7 \times (-0.3)}{6} = \frac{-0.357}{6} = -0.0595
E2(1.7)(0.0595)×1=0.0595E_2(1.7) \approx (-0.0595) \times 1 = -0.0595

L'erreur estimée est donc environ 0.060.06 (en valeur absolue).

Étape 4 : Polynôme de degré 3 et son erreur

Pour P3(1.7)P_3(1.7), on ajoute le terme de degré 3 :

P3(1.7)=P2(1.7)+(1.73)×Δ3F0=1.595+(0.0595)×1=1.5355P_3(1.7) = P_2(1.7) + \binom{1.7}{3} \times \Delta^3 F_0 = 1.595 + (-0.0595) \times 1 = 1.5355

Arrondissons : P3(1.7)1.536P_3(1.7) \approx 1.536.

Estimation de l'erreur de P3P_3 : Pour estimer l'erreur de P3P_3, il faudrait calculer le terme suivant :

E3(1.7)(1.74)×Δ4F0E_3(1.7) \approx \binom{1.7}{4} \times \Delta^4 F_0

Or, pour calculer Δ4F0\Delta^4 F_0, il faudrait un 5ème point de données (car Δ4F\Delta^4 F nécessite 5 valeurs). Avec seulement 4 points, nous ne pouvons pas estimer l'erreur de P3P_3.

⚠️

Limite de l'estimation d'erreur

Avec n+1n+1 points, on peut construire PnP_n et estimer son erreur seulement si on dispose d'au moins n+2n+2 points pour calculer Δn+1f0\Delta^{n+1} f_0. Ici, avec 4 points, on peut estimer l'erreur de P2P_2 mais pas celle de P3P_3.

💡

Cohérence avec Lagrange

Dans la leçon précédente (Lagrange), nous avions également obtenu P3(1.7)1.536P_3(1.7) \approx 1.536 avec les mêmes données. C'est rassurant : le polynôme de collocation est unique (théorème de la leçon 4.1), donc les deux méthodes doivent donner le même résultat.

Synthèse : Ce qu'illustre cet exemple :

  • On calcule P2(1.7)=1.595P_2(1.7) = 1.595 avec 3 points
  • L'estimation de l'erreur de P2P_2 est E20.06|E_2| \approx 0.06
  • En passant à P3P_3, on ajoute simplement ce terme d'erreur : P3(1.7)=1.5950.05951.536P_3(1.7) = 1.595 - 0.0595 \approx 1.536

L'important ici est de comprendre le principe :

  1. On calcule Pn(x)P_n(x) avec n+1n+1 points
  2. L'erreur est estimée par (sn+1)Δn+1f0\binom{s}{n+1} \Delta^{n+1} f_0
  3. Si cette erreur est trop grande, on passe à Pn+1P_{n+1} en ajoutant simplement ce terme

Formule d'erreur théorique

Énoncé

Si ff est (n+1)(n+1) fois continûment dérivable, l'erreur exacte est :

En(x)=hn+1f(n+1)(ξ)(n+1)!s(s1)(s2)(sn)E_n(x) = \frac{h^{n+1} \cdot f^{(n+1)}(\xi)}{(n+1)!} \cdot s(s-1)(s-2)\cdots(s-n)

ξ\xi est dans l'intervalle contenant xx et les points d'interpolation.

Lien avec les différences

On peut montrer que :

Δn+1f0hn+1f(n+1)(ξ)\Delta^{n+1} f_0 \approx h^{n+1} \cdot f^{(n+1)}(\xi)

Ce qui justifie l'estimation empirique En(sn+1)Δn+1f0E_n \approx \binom{s}{n+1} \Delta^{n+1} f_0.


Forme polynomiale explicite

Développement

La formule de Newton-Gregory peut être développée sous forme polynomiale standard. Pour P3(x)P_3(x) avec les données de sin(x) :

P3(x)=0.00128+1.01723x0.0492x20.1249x3P_3(x) = -0.00128 + 1.01723x - 0.0492x^2 - 0.1249x^3

Cette forme est utile pour l'évaluation efficace du polynôme par la méthode de Horner.


Algorithme Python

Structure de l'implémentation

L'algorithme se décompose en trois fonctions :

  1. table_differences : Construit la table triangulaire des différences Δkfi\Delta^k f_i en appliquant récursivement la définition Δkfi=Δk1fi+1Δk1fi\Delta^k f_i = \Delta^{k-1} f_{i+1} - \Delta^{k-1} f_i.

  2. binomial_s : Calcule le coefficient binomial généralisé (sk)\binom{s}{k} de manière incrémentale, évitant le calcul explicite des factorielles.

  3. newton_gregory : Assemble le polynôme Pn(x)=k=0n(sk)Δkf0P_n(x) = \sum_{k=0}^{n} \binom{s}{k} \Delta^k f_0 et estime l'erreur.

Complexité algorithmique

  • Construction de la table : O(n2)O(n^2) — on calcule n(n+1)2\frac{n(n+1)}{2} différences
  • Évaluation du polynôme : O(n)O(n) — une seule boucle sur les termes
  • Avantage : si on doit évaluer Pn(x)P_n(x) en plusieurs points, la table n'est construite qu'une fois
newton_gregory.pypython
import numpy as np

def table_differences(f_values):
  """
  Construit la table des différences descendantes.

  La table est une structure triangulaire :
      table[k][i] = Δ^k f_i

  Exemple pour 5 valeurs :
      table[0] = [f_0, f_1, f_2, f_3, f_4]      (5 éléments)
      table[1] = [Δf_0, Δf_1, Δf_2, Δf_3]       (4 éléments)
      table[2] = [Δ²f_0, Δ²f_1, Δ²f_2]          (3 éléments)
      table[3] = [Δ³f_0, Δ³f_1]                 (2 éléments)
      table[4] = [Δ⁴f_0]                        (1 élément)

  Paramètres:
      f_values : liste des valeurs [f_0, f_1, ..., f_n]

  Retourne:
      table : liste de listes, table[k][i] = Δ^k f_i
  """
  n = len(f_values)
  # Créer une table triangulaire : n-k éléments à l'ordre k
  table = [[0.0] * (n - k) for k in range(n)]

  # Ordre 0 : les valeurs elles-mêmes (Δ⁰f_i = f_i)
  table[0] = list(f_values)

  # Ordres supérieurs : Δ^k f_i = Δ^(k-1) f_(i+1) - Δ^(k-1) f_i
  for k in range(1, n):
      for i in range(n - k):
          table[k][i] = table[k-1][i+1] - table[k-1][i]

  return table

def binomial_s(s, k):
  """
  Calcule le coefficient binomial généralisé C(s, k) = s(s-1)...(s-k+1) / k!

  Utilise une formule incrémentale pour éviter les grands nombres :
      C(s, k) = C(s, k-1) * (s - k + 1) / k

  Paramètres:
      s : valeur réelle (variable réduite)
      k : ordre (entier >= 0)

  Retourne:
      C(s, k) : coefficient binomial (peut être négatif si s non entier)
  """
  if k == 0:
      return 1.0

  result = 1.0
  for j in range(k):
      # Multiplie par (s - j) / (j + 1) à chaque étape
      # Cela calcule s/1 * (s-1)/2 * (s-2)/3 * ... * (s-k+1)/k
      result *= (s - j) / (j + 1)

  return result

def newton_gregory(x_points, f_values, x, degre=None):
  """
  Interpolation par la formule de Newton-Gregory descendante.

  Hypothèse : les points x_points sont ÉQUIDISTANTS.

  Paramètres:
      x_points : abscisses équidistantes [x_0, x_1, ..., x_n]
      f_values : ordonnées correspondantes [f_0, f_1, ..., f_n]
      x : point où évaluer le polynôme
      degre : degré du polynôme (par défaut : le maximum permis par les
              données). Choisir un degré inférieur laisse une différence
              supplémentaire disponible pour estimer l'erreur.

  Retourne:
      (valeur, erreur_estimee) :
          - valeur : P_n(x)
          - erreur_estimee : |C(s, n+1) * Δ^(n+1) f_0| (si disponible)
  """
  n = len(x_points) - 1 if degre is None else degre
  h = x_points[1] - x_points[0]  # Pas supposé constant
  x0 = x_points[0]
  s = (x - x0) / h  # Variable réduite

  # Étape 1 : Construire la table de différences
  table = table_differences(f_values)

  # Étape 2 : Calculer P_n(x) = Σ C(s,k) * Δ^k f_0
  result = 0.0
  for k in range(n + 1):
      result += binomial_s(s, k) * table[k][0]

  # Étape 3 : Estimer l'erreur par le terme suivant (si on a assez de données)
  erreur = 0.0
  if len(table) > n + 1 and len(table[n+1]) > 0:
      erreur = abs(binomial_s(s, n + 1) * table[n + 1][0])

  return result, erreur

# === Exemple d'utilisation ===
x_data = np.array([0.1, 0.5, 0.9, 1.3, 1.7])  # Pas h = 0.4
f_data = np.array([0.09983, 0.47943, 0.78333, 0.96356, 0.99166])  # sin(x)

x_eval = 0.8

# Afficher la table de différences
table = table_differences(f_data)
print("Table de différences :")
for k, row in enumerate(table):
  print(f"  Δ^{k} f : {[f'{v:.5f}' for v in row]}")

# Interpolation avec différents degrés
for degre in range(1, 5):
  valeur, err = newton_gregory(x_data, f_data, x_eval, degre)
  exact = np.sin(x_eval)
  print(f"\nDegré {degre}: P_{degre}({x_eval}) = {valeur:.6f}")
  print(f"  Erreur réelle = {abs(exact - valeur):.6f}")
  if err > 0:
      print(f"  Erreur estimée = {err:.6f}")

Comparaison avec Lagrange

AspectLagrangeNewton-Gregory
StructureSomme de polynômes de baseSomme de différences finies
Ajout d'un pointTout recalculerAjouter un seul terme
Estimation d'erreurNécessite f(n+1)Utilise Δn+1f₀
Contrainte sur les donnéesAucunePas constant h
Coût de constructionO(n²)O(n²)

Résumé

  • Les différences finies descendantes Δkf\Delta^k f se calculent récursivement
  • La formule de Newton-Gregory utilise ces différences avec la variable réduite s=(xx0)/hs = (x - x_0)/h
  • Avantage majeur : passer de degré nn à n+1n+1 n'ajoute qu'un seul terme
  • L'erreur peut être estimée par le terme suivant : En(sn+1)Δn+1f0E_n \approx \binom{s}{n+1} \Delta^{n+1} f_0
  • La méthode nécessite des points équidistants

Pour aller plus loin

La prochaine leçon présentera les différences divisées, qui généralisent les différences finies au cas de points non équidistants. Nous étudierons également le phénomène d'instabilité des polynômes de degré élevé.