module_approx.mws

Informatique

Approximation

Le but de ce chapitre est de présenter une réalisation en Maple  des différents algorithmes d'approximation figurant au programme. On pourra se reporter au polycopié correspondant.

I.       Méthode du point fixe

Pour calculer le(s) point(s) fixe(s) d'une fonction f , on utilise une suite récurrente définie par la donnée de x[0]  dans R  et la relation de récurrence

  x[n+1] = f(x[n]) .

On rappelle que si f  est contractante  (càd, k -lipschitzienne avec une constante k< 1), l'écart entre x[n]  et le point fixe xi  (alors unique) de f   est majoré par

  abs(x[n]-xi) < k^n/(1-k) . abs(x[1]-x[0]) .

1.  Écrire une procédure pointFixe  prenant pour arguments f , x[0] , k  et la précision  souhaitée, et retournant une valeur approchée de xi  à la précision demandée.

>   

2.  Lorsque f  est la fonction proc (x) options operator, arrow; sqrt(x) end proc  sur [ 1/2 ,2], donner une estimation de k  et vérifier que la procédure précédente fournit bien une valeur approchée de xi = 1  à 10^(-10)  près.

>    f :=

>   

II.     Méthode de dichotomie

On cherche ici une valeur approchée d'une solution de l'équation " f ( x )=0", où f est une fonction continue sur [ a , b ] avec f ( a ) et f ( b ) de signes contraires.

On définit deux suites ( x[n] ) et ( y[n] ) en posant x[0] = a , y[0] = b  et de proche en proche :

On vérifie alors que les suites ( x[n] ) et ( y[n] ) sont  adjacentes, convergentes vers une solution xi  de l'équation " f ( x )=0", et que l'errreur commise en remplaçant xi  par x[n]  ( resp. y[n] ) est majorée par abs(b-a)/(2^n) .

1.  Écrire une procédure dicho  prenant pour arguments f , a , b  et la précision souhaitée, et retournant une valeur approché de xi  à la précision demandée.

>   

2.  Lorsque f est la fonction proc (x) options operator, arrow; x^2-2 end proc , utiliser la procédure précédente pour calculer une valeur approchée de xi = sqrt(2)  à 10^(-10)  près.

>    f :=

>   

III.   Méthode de Newton

On rappelle que cette méthode permet de calculer de manière approchée la solution xi  d'une équation

f(x) = 0

en itérant la suite définie par le choix de x[0]  (> xi ) et la relation de récurrence

x[n+1] = x[n]-f(x[n])/D(f)(x[n]) ,

L'erreur commise est contrôlée par

  abs(x[n]-xi) <= 2*m[1]/M[2] . (M[2]/(2*m[1])*(x[0]-a))^(2^n) ,

m[1]  ( resp. M[2] ) est un minorant ( resp majorant) de f'  ( resp. f'' ) sur [ a ,+ infinity [ ( a  désignant une valeur < xi  supposée connue).

1.  Écrire une procédure Newton  dont les arguments sont f , a , x[0] , m[1] , M[2] , et la précision de l'approximation cherchée, et retournant une valeur x[n]  convenablement proche de xi .

>   

2.  On applique cette procédure à la fonction proc (x) options operator, arrow; x^2-2 end proc  (donc : xi = sqrt(2) ).

    (a)   Constater que les valeurs suivantes conviennent : a = 1 , x[0] = 2 , m[1] = 2 , M[2] = 2 .

    (b)   Utiliser la procédure Newton  pour calculer une valeur approchée de xi = sqrt(2)  à 10^(-10)  près.

>    f :=

>   

IV.   Algorithme de Héron

L'algorithme de Héron d'Alexandrie permet depuis plus de vingt siècle de calculer des valeurs approchées de la racine carrée d'un reél positif alpha . Il repose sur l'itération de la suite ( x[n] ) définie par la donnée de x[0]  > sqrt(alpha)  (max( alpha ,1) convient) et la relation de récurrence :

  x[n+1] = 1/2 .( x[n]+alpha/x[n] ).

L'erreur est majorée par

  2*sqrt(alpha)*(epsilon[0]/(2*sqrt(alpha)))^(2^n) ,

epsilon[0] = x[0]-alpha .

1.  Écrire une procédure Heron  prenant pour arguments a  (< sqrt(alpha) ), alpha , x[0]  et la précision souhaitée, et retournant une approximation de sqrt(alpha)  de la précision demandée.

>   

2.  Lorsque alpha = 3  et x[0] = 2 , constater que a = 3/2  convient et utiliser la procédure précédente pour calculer une valeur approchée de sqrt(3)  à 10^(-10)  près.

>   

V.     Calcul approché de e

e  est par définition la limite de la suite ( x[n] ) définie par :

(1) x[n] = Sum(1/k!,k = 0 .. n)  .

Mais si d'autre part y[n] = x[n]+1/(n*n!) , (avec y[0] = 4 ), on montre que ( x[n] ) et ( y[n] ) sont adjacentes et encadrent e  avec une erreur ne dépassant pas 1/(n*n!) .

1.  Écrire une procédure E  prenant un seul argument, la précision demandée, et retournant une approximation de e  avec cette précision.

Dans le souci de ne faire aucun calcul inutile, on évitera de faire appel à la fonction factorielle. On utilisera plutôt un calcul de proche en proche.

>   

2.  Utiliser cette procédure pour obtenir une approximation de e à 10^(-5)  près.

>   

3.  Quel problème présente cette procédure ? Comment pourrait-on le résoudre ?

VI.    Méthode d'Archimède

Rappelons que la méthode d'Archimède pour le calcul de pi  consiste à encadrer ce dernier par deux suites ( p[n] ) et ( q[n] ) définies par c[0] = 1/2 , p[0] = 3*sqrt(3)/2 , les relations de récurrence

  c[n+1] = sqrt((1+c[n])/2)  et p[n+1] = p[n]/c[n+1] ,

et enfin q[n] = p[n]/c[n] .

L'erreur commise ne dépasse pas q[n]-p[n] = p[n]*(1/c[n]-1) , expression qui ne se simplifie pas favorablement et que l'on recalculera à chaque étape.

1.  Écrire une procédure Archimede  prenant comme unique argument la précision demandée, et retournant une valeur approchée de pi  correspondant à cette précision.

>   

2.  Grâce à cette procédure, calculer une valeur approchée de pi  à 10^(-5)  près.

>   

VII.  Formule d'Euler

On peut aussi approximer pi  en utilisant les formules en arctan inventées par Euler au XVIIIème siècle. Par exemple

  pi = 2*sqrt(3)*Sum((-1)^n/((2*n+1)*3^n),n = 0 .. infinity) .

Si l'on arrête la somme à l'indice N , l'erreur commise est majorée par 1/((2*N+1)*3^N) .

1.  Écrire une procédure Euler  prenant comme unique argument la précision cherchée et calculant les termes de la somme précédente jusqu'à ce que l'erreur devienne inférieure à la précision demandée.

Dans un souci d'élégance et d'efficacité, on n'effectuera pas d'élévation à la puissance, mais seulement des multiplications, pour calculer les puissances de 3 de proche en proche, et ceci aussi bien pour le calcul de la somme que pour l'estimation de l'erreur.

>   

2.  Calculer grâce à la procédure précédente une valeur approchée de pi  à 10^(-10)  près.

>   

VIII. Formule des trapèzes

Rappelons qu'une intégrale I = Int(f(x),x = a .. b)  peut être approximée à l'aide des sommes :

  I[n] = h*Sum((f(x[k])+f(x[k+1]))/2,k = 0 .. n-1) , (formule des trapèzes)

avec h = (b-a)/n  et x[k] = a+k*h . L'erreur est majorée par   abs(I-I[n]) <= (b-a)^3*M[2]/(12*n^2)  (où M[2] = abs(abs(`f ), mais on a intérêt à calculer directement I[2^p]  qui contient déjà tous les termes de I[2^(p-1)] .

1.  Écrire une procédure trapeze  prenant cinq arguments : la fonction f , a , b  (avec a < b ), M[2]  et la précision demandée, et effectuant le calcul de proche en proche des I[2^p]  (en tirant parti de la remarque précédente) jusqu'à ce que l'erreur devienne inférieure à la précision souhaitée.

>   

2.  On s'intéresse à la fonction proc (x) options operator, arrow; 4/(1+x^2) end proc , pour laquelle l'intégrale de a = 0  à b = 1  est facile à calculer et vaut 4*(arctan(1)-arctan(0)) = pi .

>    f :=

    (a)   En étudiant `f'''`  à l'aide de Maple , déterminer M[2] = abs(abs(`f .

>   

>   

>   

>    M2 :=

    (b)   Utiliser alors la procédure trapeze  pour obtenir une valeur approchée de I  à 10^(-8)  près.

>