Interpolation de surfaces

Objectifs d'apprentissage

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

  • Comprendre le problème d'interpolation pour une fonction de deux variables
  • Appliquer l'approche par interpolation successive (par étapes)
  • Construire un polynôme de collocation en deux variables
  • Comparer les deux approches et leurs résultats

Prérequis

  • Interpolation polynomiale 1D
  • Produit de polynômes
  • Notion de fonction de deux variables

Le problème de l'interpolation 2D

Motivation

Dans de nombreuses applications, les données dépendent de deux variables :

  • Température en fonction de la latitude et de l'altitude
  • Déformation d'une surface en fonction des coordonnées x et y
  • Densité de population sur une carte géographique

Formulation

On dispose de valeurs sur une grille de points :

Objectif : estimer pour un point quelconque dans le domaine.


Approche 1 : Interpolation par étapes

Principe

L'idée est de réduire le problème 2D à une série de problèmes 1D :

Étape 1 : Pour chaque valeur de , interpoler en pour obtenir .

Étape 2 : Interpoler ces résultats en pour obtenir .

Illustration

Pour une grille 3×4 et un point cible :

  1. Interpoler 3 fois en (une fois pour chaque ligne) → 3 valeurs
  2. Interpoler 1 fois en avec ces 3 valeurs → résultat final
💡

Flexibilité

On peut aussi procéder dans l'ordre inverse : d'abord interpoler en pour chaque colonne, puis en . Le résultat est théoriquement identique pour un polynôme de collocation exact.


Exemple complet

Données

Considérons la fonction tabulée sur une grille :

x \ y0.20.30.40.5
1.00.6401.0031.3591.703
1.50.9901.5242.0452.549
2.01.5682.3843.1773.943

Objectif : estimer .

Étape 1 : Interpolation en y

Pour chaque ligne (valeur fixe de ), construisons un polynôme de degré 3 en et évaluons en .

Pour x = 1.0 :

Points :

Table de différences (Newton-Gregory avec ) :

yzΔzΔ²zΔ³z
0.20.6400.363-0.007-0.003
0.31.0030.356-0.010
0.41.3590.344
0.51.703

Pour :

Pour x = 1.5 :

En suivant le même procédé :

Pour x = 2.0 :

Étape 2 : Interpolation en x

Nous avons maintenant 3 valeurs pour :

xf(x, 0.33)
1.01.1108
1.51.6818
2.02.6245

Pour :

Table de différences :

xzΔzΔ²z
1.01.11080.57100.3717
1.51.68180.9427
2.02.6245

Résultat

Valeur exacte :

Erreur : (0.34%)


Approche 2 : Polynôme de collocation 2D

Formulation directe

On cherche un polynôme en deux variables :

qui passe par tous les points de la grille.

Cas bilinéaire (degré 1 en x et y)

Pour 4 points formant un rectangle :

Cas général

Pour une grille , on construit un polynôme de degré en et en .

Le nombre de coefficients est , égal au nombre de points : le système est déterminé.


Lien entre les deux approches

Équivalence théorique

Pour un polynôme de collocation exact, les deux approches donnent le même résultat.

L'approche par étapes peut être vue comme une factorisation du polynôme 2D :

sont les polynômes de Lagrange en et les polynômes interpolés en .

Avantages comparés

ApprocheAvantagesInconvénients
Par étapesSimple, réutilise le code 1DPlusieurs interpolations
DirecteUne seule évaluationSystème plus complexe à résoudre

Visualisation interactive

La visualisation suivante permet d'explorer la surface interpolée en 3D. Vous pouvez faire pivoter la vue et déplacer le point d'évaluation pour observer comment l'interpolation estime les valeurs sur toute la surface :

Surface interpolée 3D

Glissez pour faire tourner la vue • f(x, y) = eˣsin(y) + y - 0.1

1.60
0.33
xyz(1.6, 0.33)
Interpolation1.8407
Valeur exacte1.8350
Erreur0.005656
Points de données Point évalué

Algorithme Python

interpolation_2d.pypython
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

def newton_gregory_1d(x_data, y_data, x_eval):
  """
  Interpolation 1D par Newton-Gregory.
  """
  n = len(x_data)
  h = x_data[1] - x_data[0]

  # Table de différences
  diff = [y_data.copy()]
  for k in range(1, n):
      new_diff = []
      for i in range(n - k):
          new_diff.append(diff[-1][i + 1] - diff[-1][i])
      diff.append(np.array(new_diff))

  # Évaluation
  s = (x_eval - x_data[0]) / h
  result = diff[0][0]
  prod = 1.0

  for k in range(1, n):
      prod *= (s - k + 1) / k
      result += prod * diff[k][0]

  return result

def interpolation_2d_etapes(x_data, y_data, z_grid, x_eval, y_eval):
  """
  Interpolation 2D par la méthode des étapes successives.
  """
  n = len(x_data)

  # Étape 1 : Interpoler en y pour chaque x
  z_at_y = np.zeros(n)
  for i in range(n):
      z_at_y[i] = newton_gregory_1d(y_data, z_grid[i, :], y_eval)

  # Étape 2 : Interpoler en x
  result = newton_gregory_1d(x_data, z_at_y, x_eval)

  return result

def interpolation_2d_lagrange(x_data, y_data, z_grid, x_eval, y_eval):
  """
  Interpolation 2D par polynôme de Lagrange bidimensionnel.
  """
  n, m = len(x_data), len(y_data)
  result = 0.0

  for i in range(n):
      Lx = 1.0
      for k in range(n):
          if k != i:
              Lx *= (x_eval - x_data[k]) / (x_data[i] - x_data[k])

      for j in range(m):
          Ly = 1.0
          for l in range(m):
              if l != j:
                  Ly *= (y_eval - y_data[l]) / (y_data[j] - y_data[l])

          result += z_grid[i, j] * Lx * Ly

  return result

# Données de l'exemple
x_data = np.array([1.0, 1.5, 2.0])
y_data = np.array([0.2, 0.3, 0.4, 0.5])

z_grid = np.array([
  [0.640, 1.003, 1.359, 1.703],
  [0.990, 1.524, 2.045, 2.549],
  [1.568, 2.384, 3.177, 3.943]
])

x_eval, y_eval = 1.6, 0.33

# Calculs
result_etapes = interpolation_2d_etapes(x_data, y_data, z_grid, x_eval, y_eval)
result_lagrange = interpolation_2d_lagrange(x_data, y_data, z_grid, x_eval, y_eval)
exact = np.exp(x_eval) * np.sin(y_eval) + y_eval - 0.1

print(f"Méthode par étapes : f({x_eval}, {y_eval}) = {result_etapes:.4f}")
print(f"Méthode Lagrange 2D : f({x_eval}, {y_eval}) = {result_lagrange:.4f}")
print(f"Valeur exacte : f({x_eval}, {y_eval}) = {exact:.4f}")

# ============================================
# VISUALISATION 3D
# ============================================

# Grille fine pour la surface interpolée
x_fine = np.linspace(x_data[0], x_data[-1], 50)
y_fine = np.linspace(y_data[0], y_data[-1], 50)
X_fine, Y_fine = np.meshgrid(x_fine, y_fine)

# Calculer la surface interpolée
Z_interp = np.zeros_like(X_fine)
for i in range(len(x_fine)):
  for j in range(len(y_fine)):
      Z_interp[j, i] = interpolation_2d_lagrange(
          x_data, y_data, z_grid, x_fine[i], y_fine[j]
      )

# Surface exacte pour comparaison
Z_exact = np.exp(X_fine) * np.sin(Y_fine) + Y_fine - 0.1

# Grille des points de données
X_grid, Y_grid = np.meshgrid(x_data, y_data)

# Création de la figure 3D
fig = plt.figure(figsize=(14, 5))

# Subplot 1 : Surface interpolée avec points de données
ax1 = fig.add_subplot(131, projection='3d')
ax1.plot_surface(X_fine, Y_fine, Z_interp, cmap='viridis', alpha=0.7)
ax1.scatter(X_grid.flatten(), Y_grid.flatten(), z_grid.T.flatten(),
         color='red', s=50, label='Points de données')
ax1.scatter([x_eval], [y_eval], [result_lagrange],
         color='yellow', s=100, marker='*', label='Point évalué')
ax1.set_xlabel('x')
ax1.set_ylabel('y')
ax1.set_zlabel('z')
ax1.set_title('Surface interpolée')
ax1.legend()

# Subplot 2 : Surface exacte
ax2 = fig.add_subplot(132, projection='3d')
ax2.plot_surface(X_fine, Y_fine, Z_exact, cmap='plasma', alpha=0.7)
ax2.scatter(X_grid.flatten(), Y_grid.flatten(), z_grid.T.flatten(),
         color='red', s=50)
ax2.set_xlabel('x')
ax2.set_ylabel('y')
ax2.set_zlabel('z')
ax2.set_title('Surface exacte f(x,y) = eˣsin(y) + y - 0.1')

# Subplot 3 : Erreur d'interpolation
ax3 = fig.add_subplot(133, projection='3d')
Z_error = np.abs(Z_interp - Z_exact)
surf = ax3.plot_surface(X_fine, Y_fine, Z_error, cmap='hot', alpha=0.8)
ax3.set_xlabel('x')
ax3.set_ylabel('y')
ax3.set_zlabel('Erreur')
ax3.set_title(f'Erreur (max = {Z_error.max():.4f})')
fig.colorbar(surf, ax=ax3, shrink=0.5)

plt.tight_layout()
plt.savefig('interpolation_2d_3d.png', dpi=150)
plt.show()

Applications

Géophysique et météorologie

Interpolation de mesures (température, pression, altitude) sur des grilles géographiques.

Traitement d'images

Agrandissement ou réduction d'images par interpolation des pixels.

Éléments finis

Approximation de solutions sur des maillages 2D ou 3D.

Cartographie

Création de modèles numériques de terrain à partir de points de mesure.


Résumé

ConceptDescription
Interpolation par étapesInterpoler d'abord en y, puis en x (ou inversement)
Polynôme 2D direct
ÉquivalenceLes deux méthodes donnent le même résultat
ComplexitéÉtapes : interpolations 1D

Pour aller plus loin

La dernière leçon de ce chapitre abordera le lissage par moindres carrés, une approche différente où le polynôme ne passe pas nécessairement par tous les points mais minimise l'erreur quadratique globale.