module_polynomes.mws

Informatique

Polynômes

I.     Algorithme de Horner

Il s'agit de calculer la valeur en un point d'un polynôme en ne faisant que  des additions et des multiplications, grâce à l'écriture de P = a[p]*X^p+a[p-1]*X^(p-1) +...+ a[1]*X+a[0]  sous la forme :

P  = (( ... ( a[p]*X+a[p-1] ) X+a[p-2] ) X + ... + a[1] ) X+a[0]

Bien sûr, Maple  sait calculer sur les polynômes, mais on n'utilisera pas cette possibilité dans cet exercice. On représentera un polynôme par la succession de ses coefficients a[p] , ..., a[1] , a[0]  si P = a[p]*X^p+a[p-1]*X^(p-1) + ... + a[1]*X+a[0] .
On va écrire une procédure
horner  prenant comme arguments a[p] , ..., a[1] , a[0]  et retournant P (X). Donc : le nombre d'arguments de horner  va être variable ; on aura à utiliser args  et nargs  ( aide ), et l'en-tête de la procédure sera de la forme horner:=proc() . Attention, a[p]  va être le 1^er  argument (" args[1] "), car c'est par lui que le calcul commence.

1. Version itérative . Ecrire la procédure horner  en effectuant les additions et les multiplications à l'aide d'une boucle for . On pourra gérer une variable P  dans la procédure, qui commencera par valoir 0 puis a[p] , puis a[p]*X , puis a[p]*X+a[p-1]  et ainsi de suite.

>   

2. Version récursive . Pour éviter d'avoir à utiliser une variable, écrire une procédure horner2  sous forme récursive (s'appelant elle-même).

>   

3.   Tester les deux procédures ci-dessus en calculant p. ex. le polynôme X^2+2*X+3 , ce qui doit répondre à la formule horner(1,2,3)  ( resp . horner2(1,2,3) ).

>   

>   

II.    Polynômes interpolateurs de Lagrange

Le k^`ième`  polynôme interpolateur élémentaire de Lagrange associé aux réels x[1] ,..., x[n]  (deux à deux distincts) est défini pour tout entier k entre 1 et n par :  

L[k](X) = Product((X-x[j])/(x[k]-x[j]),j)  ,

où le produit est étendu aux indices `in`(j,[1, n])  tels que j <> k .

1.  On ne fixe pas n , mais on va écrire une procédure L  prenant un nombre n+1   variable d'arguments ( cf. I) dont les n  premiers seront x[1] ,..., x[n]  et le dernier, l'entier k . On pourra supposer que k  est bien compris entre 1 et n  (càd, on n'en programmera pas la vérification, et une erreur se produira si ce n'est pas le cas). Le calcul de L[2]  pour n = 5  en ( x[1] ,..., x[5] ) s'effectuera donc par L(x1,x2,x3,x4,x5,2)  et devra retourner :

  (x-x1)/(x2-x1)*(x-x3)/(x2-x3)*(x-x4)/(x2-x4)*(x-x5)/(x2-x5) .

>   

2.  Lorsque b[1] ,..., b[n]  sont n réels, on vérifie qu'on obtient un polynôme P tel que P(x[1]) = b[1] ,..., P(x[n]) = b[n]  par l'expression :

  P(x) = Sum(b[k]*L[k](x),k = 1 .. n) .

On se propose d'effectuer ce calcul lorsque les b[k]  sont les valeurs f(x[k])  d'une fonction f supposée définie en Maple .

En utilisant une simple instruction de sommation, écrire une procédure P  prenant comme arguments (en nombre variable) les réels x[1] ,..., x[n]  et réalisant le calcul souhaité. On réutilisera bien sûr la fonction L  du 1 . La fonction f (non précisée) sera une variable globale. Tester.

>   

3.  Dans le cas où f(x) = exp(x) , n = 3 , x[1] = 0 , x[2] = 2  et x[3] = 4 , expliciter l'expression de P(x)  et tracer sur un même schéma f(x)  et P(x) .

>   

>