LO20 / Algorithmique : extraction approchée d`une racine

publicité
LO20 / Algorithmique : extraction approchée d'une racine carrée Eric Bachard Nov2007
Algorithme de calcul approché d'une racine carrée
Soit le réel a positif, tel que x 2 −a=0 ou encore, en introduisant f  x  telle que f  x =x 2−a .
On suppose que les conditions suivantes sur f sont vérifiées :
1)  un point d'accumulation ( la solution existe)
2) f contractante  |f(x)-f(y)| < |x-y|
3) | f '  x |1 (condition de Lipchitz )
4) On suppose qu'on commence le calcul près de la racine de a.
Alors, il est possible d'utiliser une méthode itérative, dite méthode de Newton, dont la convergence est très rapide (sur linéaire) permettant de calculer la racine carrée de a.
f(x)
Sur le dessin ci­contre, on peut représenter la fonction et sa tangente :
tangente
yn
courbe réelle
D'où l'on déduit :
f '  x n =
y n 1 −y n
avec y n1=0
x n 1 −x n
Ce qui donne finalement la relation de récurrence à utiliser dans l'algorithme d'extraction de la racine carrée : f  x n
x n 1= x n−
f '  x n
yn+1
x
xn
xn+1
Travail demandé :
1
a
1) Pour la fonction f  x =x 2−a , montrer que : x n 1=  x n 
2
x
n
2) Écrire l'algorithme correspondant au calcul de  a , pour f  x  (  réel positif fixé)
Imposé :
a) =10−5
b) il faudra entrer a et x0 (valeur initiale suffisamment proche de  a pour que l'algorithme converge)
3) Écrire et compiler le programme en langage C permettant de saisir a, et calculer  a .
Page 1/2
LO20 / Algorithmique : extraction approchée d'une racine carrée Eric Bachard Nov2007
Corrigé
Question 1 : Démonstration y n= f  x n =x 2−a ; f '  x n =2x
x 2n−a
x
a
1
a
Soit: x n 1= x n−
=x n − n 
⇔ x n1=  x n − 
2 xn
2 2 xn
2
xn
Question 2 : Algorithme
Début Programme extraction Racine Carrée Ecrire (entrer a, x0 )
Lire ( réel a, réel x0 )
réel epsilon <­­­ 10 ­5
réel xn <­­­ x0
Faire 1
a
réel x n 1 <­­­  x n  
2
xn
Tant que  x 2n1−a
Écrire("Racine de a = " x n 1 )
Fin programme
Question 3 : Programme en langage C
/* Programme extraction Racine Carree */
#include <stdio.h>
#include <stdlib.h>
int main( void)
{
double a;
double x0;
double xn;
double xn1;
fprintf(stdout, "Entrer a, x0\n");
fscanf( stdin, "%lf %lf", &a, &x0);
double epsilon = 0.00001;
xn = x0;
do
{
xn1 = 0.5*(xn + a/xn);
fprintf( stdout, "Valeur de xn1 = %lf\n", xn1);
fprintf( stdout, "xn1 * xn1 ­ a = %lf\n", xn1 *xn1 ­ a);
getchar();
xn = xn1;
}
while ((xn1 * xn1 ­ a)>epsilon);
fprintf(stdout, \
"La valeur approchee de racine carree de %lf vaut %.2lf\n",a, xn1);
return EXIT_SUCCESS;
}
Page 2/2
Téléchargement