Partie 1 - Interpolation numérique (8 pts)

@c jean-baptiste.apoung@math.u-psud.fr

ATTENTION:

L' EXERCICES 1 EST À FAIRE ENTIÈREMENT SUR COPIES

LES QUESTIONS 1,2 DE L'EXERICE 2 EST A FAIRE SUR COPIES

In [1]:
%matplotlib inline
%config InlineBackend.figure_format = 'retina'

import numpy as np
import matplotlib.pyplot as plt

Exercice 1 : Question de cours

Question 1 : Calcul du polynôme interpolateur de Lagrange

Montrer que le polynôme interpolateur de Lagrange aux points (-2,-8), (-1, -1), (1, 1), (2, 8) est $P(X) = X^3$.

Question 2 : Motivations pour les algorithmes d'interpolation

Donner un argument qui justifie le passage d'une formule d'interpolation à l'autre comme illustré ci-dessous :

Interpolation de Vandermonde $\Rightarrow$ Interpolation de Lagrange $\Rightarrow$ Interpolation de Néville $\Rightarrow$ Interpolation de Newton.

Exercice 2 : Développement d'un algorithme d'interpolation

Soit donnés $n+1$ points $\bar{x}_{k} = (x_k, y_k)$, $k=0,\ldots, n$ 2 à 2 distincs. On souhaite construire le polynôme interpolateur de Lagrange $P_n$ en ces points.

On désigne par $Q_{\bar{x}_{m},\ldots, \bar{x}_{l}}(x)$ le polynôme interpolateur aux points $\bar{x}_{k} = (x_k, y_k)$, $k=m,\ldots, l$.

On étend la formule lorsqu'il n'y a qu'un seul point par $$Q_{\bar{x}_{k}} (x) = y_k, \quad 0\leq k \leq n$$

Question 1:

Montrer que pour tout $0 \leq k < l \leq n$

$$ Q_{\bar{x}_{m},\ldots, \bar{x}_{l}}(x) = \frac{x - x_l}{x_m - x_l} Q_{\bar{x}_{m},\ldots, \bar{x}_{l-1}}(x) + \frac{x - x_m}{x_l - x_m} P_{\bar{x}_{m+1},\ldots, \bar{x}_{l}}(x) $$

Question 2

En remarquant que $P_n (X) = Q_{\bar{x}_{0},\ldots, \bar{x}_{n}}(X)$. Déduire qu'on peut construire $P_n (X)$ à travers un algorithme récursif.

InterpAitken(xi, yi, x):
  - si longueur de xi est 1 
     retourner yi   ( Attention, retourner yi[0] + 0 * x  si se sont des tableaux numpy) 
  - sinon 
      - calculer p0 = InterpAitken(xig, yig, x)  où xig, yig, sont resp. xi, yi privés du dernier élément
      - calculer p1 = InterpAitken(xid, yid, x)  où xid, yid, sont resp. xi, yi privés du premier élément
      - calculer l0 = (x - xi1)/(xi0 - xi1)      où xi0, xi1 sont resp. le premier et le dernier élément de xi
      - calculer l1 = (x - xi0)/(xi1 - xi0)      
      - retourner l0 * p0 + l1 * p1

Question 3 : Mise en ouvre

Mettre cet algorithme en oeuvre à travers une fonction Python de prototype InterpAitKen(xi, yi, x)

qui prend en arguments

  • xi, yi deux vecteurs de taille n représentant les points d'interpolation
  • x un vecteur de taille N représentant les valeurs où l'on souhaite évaluer le polynôme interpolateur

et qui retourne un vecteur y de taille N

In [2]:
## METTRE LA REPONSE ICI
#def InterpAitKen(xi,yi,x):
    
   

Question 4 : Validation

On pose $a = 1$, $b = 3$, $f(x) = \exp(-3(x-1.2)^2)$

Représenter sur un même graphique en mettant titre et légende,

  • La fontion $f$
  • Et le polynôme d'interpolation de Lagrange en $N$ points uniformément distribués dans $[a,b]$. On prendra $N=4$, et $N = 8$.
In [3]:
## METTRE LA REPONSE ICI

Question 5 : Application

Ici, on pourra utiliser soit l'algorithme défini ci-dessus ou tout autre algorithme d'interpolation

En $1991$ , les records mondiaux en athlétisme pour certaines distances étaient les suivants :

dist (D)   temps (T)  
----------------------------
 100 m     9.93 s
 200 m     19.72 s
 400 m     43.86 s
 800 m     1 min 41.73 s
 1500 m    3 min 29.45 s
 5000 m    13 min 00.40 s
 10000 m   27 min 13.81 s
 30000 m   1 h 29 min 18.8 s 
-----------------------------

Question 5-1 :

Estimer les records du monde cette année là pour

  • $1000 m$, $2000 m$, $25000 m$ et le Marathon ($42195 m$)

    Comparer les valeurs obtenues aux valeurs réelles : 2 min 12.18 s, 4 min 51.39 s, 1 h 13min 55.8s , 2 h 07min 12 s

In [4]:
### ON MET A VOTRE DISPOSITION LES SCRIPTS SUIVANTS

def Tosec(h, mn, s):
    '''Convertir h heures + mn minutes + s secondes en secondes '''
    return h * 3600. + mn * 60. + s
    
def FromSec(s):
    ''' Affiche un Total de s secondes en heures+ minutes +secondes'''
    if(s < 0):
        print("temps négatif : {:f}".format(s))
        return
    # Les secondes
    rs = int(s)%60 +(s - int(s))
    #
    sm = int(s)//60
    # Les minutes
    rm = sm % 60
    #
    sh = sm//60
    # Les heures
    rh = sh % 60
    print("{:d} h  {:2d} min {:4.2f} s".format(int(rh), int(rm), float(rs)))
        

def Records():
    x = np.array([100., 200, 400,800, 1500, 5000,10000, 30000])
    y = np.array([9.93, 19.72, 43.86, Tosec(0,1,41.73), Tosec(0,3,29.45), Tosec(0,13,00.40), Tosec(0,27,13.81),
                  Tosec(1,29,18.8)])
    return x,y
In [5]:
### METTRE LA REPONSE ICI

Question 5-2 :

  • Estimer le record du monde cette année là de la distance parcourue en $1h$

    Comparer cette valeur à celle enregistrée : $ 20944 m$

In [6]:
### METTRE LA REPONSE ICI

Question 6

Reprendre la question 5-1 et 5-2 en remplaçant dans la table des reccords, les valeurs des distances et des temps par les $log$ de ces quantités.

In [7]:
### METTRE ICI LA REPONSE A LA REPRISE DE LA QUESTION 5.1 
In [8]:
### METTRE ICI LA REPONSE A LA REPRISE DE LA QUESTION 5.2 
In [ ]: