Indic - Solution Dev2
Indic - Solution Dev2
Indic - Solution Dev2
www.uvci.edu.ci
1. Informations générales
Cet exercice illustre l’utilisation pratique de l’interpolation polynomiale et présente quelques limites
rencontrées lors de l’interpolation polynomiale
Interpolation de Lagrange
L’existence et l’unicité se montrent en 2 étapes :
Etape 1 Existence
Remarquer que la famille de polynômes Li ( x ) sont tous de degré n et construire alors le polynôme
n
pn ( x ) =∑ f ( x i ) Li ( x ) et montrer que pn ( x i) =f ( x i ) où les x 0 , x 1 ,… , x nsont les n+1 points donnés
j =0
Etape 2 Unicité
Considérer deux polynômes de Lagrange de degré n solution su problème et montrer que la différence
est le polynôme nul.
L’un des inconvénients majeurs de l’utilisation directe des polynômes de Lagrange est que si l’on veut
passer d’un polynôme de degré n à un polynôme de degré n+1, par exemple par ajout d’un nouveau
point, il faut recommencer entièrement tous les calculs en estimant n+2 polynômes de degré n+1.
Cela est fastidieux. La méthode des différences divisées de Newton comble cette lacune.
Exercice 1
On considère le polynôme
Exercice 2
Nous allons implémenter ces résultats avec Scilab pour faire des tests pratiques
La fonction diffdiv(xpt, ypt) est la fonction qui permet de calculer les différences divisées de
Newton. Le résultat de cette fonction est un vecteur qui contient les n+1 points a 0 , a1 , a2 , … , a n
calculées dans l’exercice précédent. Il faut savoir que xpt est un vecteur ligne (tableau à une
dimension en informatique) qui est tel que le premier élément de ce tableau est x 0 , le deuxième est x 1
et le dernier élément est x n. C’est la même chose pour ypt qui lui contient les valeurs y i=f ( x i) des
points x i. Le tableau donné dans l’exercice peut se traduire aisément par un algorithme itératif (qui se
répété en partant de l’étape précédente). dpt est aussi un tableau à 1 dimension qui contient le même
Ainsi on calcule d’abord les premières différences divisées par la formule suivante
Etape 2.
On part des résultats précédents et on calcule les deuxièmes différences divisées à partir des premières
différences divisées par
i varie de 0 à m −2
Par la suite on stocke f [ x 0 , x 1 , x 2 ] dans dpt(3).
Les nièmes différences divisées sont calculées à partie des (n-1) ièmes différences divisées
i varie de 0 à m −n
Par la suite on stocke f [ x 0 , x 1 , x 2 , … , x n ] dans dpt(n+1).
Evaluation du polynôme par la méthode de Horner. La méthode de Horner est une méthode
astucieuse qui permet d’évaluer la valeur d’un polynôme quelconque en n’importe quel point à partir
des coefficients du polynôme sans avoir à calculer les puissances successives. Dans notre exercice on
va l’utiliser pour alléger nos calculs et nous permettre à partir des différences divisées calculées
précédemment d’évaluer nos polynômes en n’importe quel point.
La fonction phorner prend en entrée le vecteur xpt qui contient les points x 0 , x 1 ,… , x n , le vecteur
dpt qui contient les différences divisées de Newton et y qui est le nombre dont on veut estimer la
valeur. En sortie elle nous donne la valeur estimée p ( y ). Son code consiste à implémenter
l’algorithme suivant qui vous a été donné en énoncé.
Le code suivant est donné à titre indicatif. Il existe d’autres possibilités d’implémentation de
l’algorithme
Pour les premiers tests il suffit d’implémenter le code qui est donné dans l’énoncé et si on ajoute un
code d’affichage des résultats. Afin de réduire le nombre de lignes on utilise le code suivant qui est
identique (réécriture plus élégante) à celui donné dans l’énoncé
// *** Premiers tests
xpt=[1,2,3,4];
phorner(xpt,dpt,3)deff('y=f(x)','y=sin(x)');
dpt=diffdiv(xpt,f(xpt));
for k=1:4
inter= phorner(xpt,dpt,k);
mprintf('y=%3d, sin(y)=%12.8f, p(y)=%12.8f, erreur=%12.8f\n',k,ypt(k),inter,abs(inter-
ypt(k)));
end
Ici il faut calculer les n+1 points x 0 , x 1 ,… , x n . Puisqu’ils sont équirepartis, cela signifie que la
distance entre ces points est la même et qu’ils subdivisent notre intervalle [-1 ; 1] en n sous intervalles.
( b− a )
Les points x i=a+i avec i=0,1, … , n b=1 ,a=−1
n
Une fois ces points calcules on calcule leurs valeurs f ( x i ) =exp ( x i )
Les points x i sont stockés dans le vecteur xpt et leurs valeurs f ( x i ) dans le vecteur ypt
Pour la suite on s’inspire du code précédent des premiers tests pour évaluer la fonction
exp(x) sur l’intervalle [-2 ;2] qui contient 81 points d’évaluation (les p(y)). Le code pour
générer la fonction exp sur [-2 ;2] est contenue déjà dans la fonction phorner dans le
code suivant
vectx = -2:0.05:2;// intervalle d'études de la fonction
yvect = exp(vectx);// la fonction réelle y =f(x) pour x dans [-2; 2]])
for j=1:length(vectx)
//code à inscrire pour calculer l'estimation par polynome de Lagrange de y=f(x) =exp(x)
//les valeurs de x à estimer sont contenues dans le tableau vectx
// A compléter en vous inspirant du code écrit dan Premiers tests
....
end
Pour notre test on a considéré n=4. Pour voir la convergence, vous pouvez modifier la valeur
de n en l’augmentant et en observant à chaque fois le résultat obtenu. Pour cela exécuter le
fichier S2.sce. Les lignes correspondantes à notre fonction dans ce fichier sont les suivantes
//*** Question 3.a
n = 4;
poly_inter = interpol(n);
La courbe pour n= 4 est la suivante
Comme on peut le constater sur l’intervalle [-1 ; 1] les 2 courbes se superposent. La courbe
réelle est la courbe en noire la courbe obtenue par interpolation est la courbe en vert
b) Écrire la procédure einterp(n,f,a,b), avec en entrée n ϵ N , f une fonction définie sur [a, b] avec
a< b, qui trace sur un même graphe, la fonction f , le polynôme d’interpolation de Lagrange de f aux
k ( b − a)
points équidistants a+ avec k ϵ {0,1,2 , ⋯ , n }et les points d’interpolation avec un motif . Il faut
n
bien sûr utiliser diffdiv et phorner.
La fonction einterp est une généralisation de la question précédente. En effet, dans cette question, la
fonction f n’est pas connue contrairement à la question précédente où f est connue. Donc on peut
utiliser le code de interpol que l’on va adapter pour prendre en compte les nouvelles hypothèses. Le
bout de code suivant (donné à titre indicatif) de la fonction donnée à titre indicatif vous donne les
étapes à suivre pour créer les courbes de la fonction réelle et son estimée par interpolation
deff('y = f(x)', fx); //fx est une chaine de caractères entre cote simples qui contient
l'expression de f(x))
x =linspace(a,b);//vecteur ligne contenant les points de l'intervalle [a;b]
y_calc = feval(x, f);//vecteur y=f(x)
//vecteur des points de collocation
dxp = (b -a)/n;
xp = a:dxp:b;
//
//évaluation de la fonction en ces points
yp = feval(xp,f)
//Calcul des différences divisées de newton
dpt = diffdiv(xp, yp);
//évaluation de l’estimée par interpolation des points x de l'intervalle [a;b]]
for j=1:length(x);
//A compléter
...
end
Afin de tester le code , nous avons dans le fichier S2.sce, utiliser la fonction y=sin(x) sur l’intervalle
[ − π ; π ] pour tester notre resultat et evaluer la courbe d’erreur
//*** Question 3.b
n = 4;
a=-%pi ;
b = %pi;
fx = 'y=sin(x) ';
e = einterpol(n, fx, a, b);
Une analyse montre que l’erreur est relativement importante et présente des oscillations qui
indiquent que le point de nombre de collocation est faible. Si on augmente ce nombre (n) , on
diminue l’importance de ces oscillations sauf aux bornes de l’intervalle(phénomène de
Runge).
Exercice 3
a) Le code de la fonction tinterpol est identique à celui de einterpol. La seule différence est la
construction des points x 0 , x 1 ,… , x n de xpt. Pour cela on utilise la formule donnée avec a et
b les bornes de l’intervalle d’etudes n le nombre de points de collocation (le nombre de points
dont connait la valeur de la fonction). Le code suivant dans tinterpol, vous permet de
calculer les points de Tchebychev. Le reste du code est identique à celui de einterpol
....
//calcul des valeurs exactes
x =linspace(a, b);
y_reel = feval(x, f);
Representation graphique
Remarque : La courbe en noir est la courbe réelle ; la courbe en vert est celle obtenue par
estimation polynomial. La courbe er rouge est l’erreur d’interpolation