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
x2a=0 ou encore, en introduisant fxtelle que fx=x2a
.
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.
Sur le dessin ci-contre, on peut représenter
la fonction et sa tangente :
D'où l'on déduit :
f ' xn= yn1yn
xn1xn
avec
yn1=0
Ce qui donne finalement la relation de
récurrence à utiliser dans l'algorithme
d'extraction de la racine carrée :
xn1=xnfxn
f ' xn
Travail demandé :
1) Pour la fonction
fx=x2a
, montrer que :
xn1=1
2xna
xn
2) Écrire l'algorithme correspondant au calcul de
a
, pour
fx
Imposé :
a)
=105
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
yn
yn+1 xnxn+1
tangente
courbe réelle
x
f(x)
LO20 / Algorithmique : extraction approchée d'une racine carrée Eric Bachard Nov2007
Corrigé
Question 1 : Démonstration
yn=fxn=x2a
;
f ' xn=2x
Soit:
xn1=xnxn
2a
2xn
=xnxn
2a
2xn
xn1=1
2xna
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
réel
xn1
<---
1
2xna
xn
Tant que
xn1
2a
Écrire("Racine de a = "
xn1
)
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
1 / 2 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans l'interface ou les textes ? Ou savez-vous comment améliorer l'interface utilisateur de StudyLib ? N'hésitez pas à envoyer vos suggestions. C'est très important pour nous!