Partage
  • Partager sur Facebook
  • Partager sur Twitter

Racine carrée avec méthode de Newton

Sujet résolu
8 avril 2010 à 16:20:01

Bonjour,

je dois écrire un programme qui calcule la racine carrée d'un nombre avec la méthode de Newton, à savoir :

Pour calculer la racine carrée de a, on part de x0=(1+a)/2 et on itère grâce à la formule de récurrence : x(n+1)=1/2*(xn+a/xn)
On s'arrête lorsque |(x(n+1)-xn)/xn|<10^-5.

J'ai réussi à faire un code qui calcul la racine carrée en s'arrêtant au bout de 10 itérations, mais ça n'aboutit pas dans le cas ci-dessus. Voici ce que j'ai tenté :

public static void main(String[] args) {
        int i;
        double a;
        double x;
        double x1;
        double x2;
        double x0;
        double abs;
        System.out.println("Entrez un entier :");
        a = Lire.d();
        i = 1;
        x0 = (1 + a) / 2;
        while (i < 500) {
            x = (1 / 2) * (x0 + a / x0);
            x1 = x;
            x2 = (1 / 2) * (x1 + a / x1);
            if ((x2 - x1) / x1 > 0) {
                abs = (x2 - x1) / x1;
            } else {
                abs = -(x2 - x1) / x1;
            }
            if (abs < 0.00001) {
                System.out.println("La racine carrée de " + a + " est " + x2);
                i = 500;
            } else {
                i = i + 1;
            }
        }
    }
}


Je ne sais plus quoi faire, merci pour votre aide !
PS : i<500 a été pris arbitrairement mais suffisamment grand pour que ce soit inférieur à 10^-5 !
a=Lire.d() permet juste de lire la valeur entrée par l'utilisateur.
  • Partager sur Facebook
  • Partager sur Twitter
8 avril 2010 à 16:25:25

Alors déjà pourquoi tu fais pas la boucle sur le abs ?
while(abs>0.00001)
ensuite dans ta formule tu calcule en utilisant x0 qui est appelé par x mais tu changes jamais la valeur de x0, c'est la que se situe l'erreur
  • Partager sur Facebook
  • Partager sur Twitter
8 avril 2010 à 16:37:27

Merci pour votre aide. Mais si je fais la boucle sur le abs, il va me dire que abs n'a pas été initialisé. Et pour xo, je ne vois pas ce qu'il faut mettre alors...
  • Partager sur Facebook
  • Partager sur Twitter
8 avril 2010 à 16:40:57

bah tu initialises abs à 0 par exemple ça pose pas de problèmes vu que dans tous les cas il sera changé !!
Alors pour Xo en gros toi tu fais :
x0 = (1+A)/2 et tu ne changes jamais cette valeur car dans ta boucle tu utilises x = (1 / 2) * (x0 + a / x0)
mais ya pas de x0 = ... (la valeur ne change donc jamais et par conséquent x0 est toujours le même...)
Après je te files pas la soluce mais ya plus grand chose à faire

Simple question, tu programmes avec quoi ? parce qu'un coup de debug et on s'en rend vite compte de ça !
  • Partager sur Facebook
  • Partager sur Twitter
8 avril 2010 à 16:42:32

Avec NetBeans. J'essai tout ça...
Mais il y a quand même un truc que je ne comprends pas. Si je veux faire while(abs...),
il faut que abs soit définit avant le while, donc il faut initialisé x1 et x2 avant, vu qu'ils apparaissant dans l'expression de abs, donc abs ne changera jamais ?
Pas très clair peut être !?
:(:euh::(:euh::(
  • Partager sur Facebook
  • Partager sur Twitter
8 avril 2010 à 17:05:32

Sisi c'est assez clair
bah tu peux le déclarer et l'initialiser en le remplissant de manière à être sur que la boucle ne s'arrête pas
en gros quand tu fais double abs tu rajoute = 20 (par exemple)
après tu fais ta boucle while(abs>0.00001)
  • Partager sur Facebook
  • Partager sur Twitter
8 avril 2010 à 17:07:47

Merci, je crois que ça j'ai compris. Par contre, je ne sais toujours pas quoi faire avec ce x0...
  • Partager sur Facebook
  • Partager sur Twitter
8 avril 2010 à 17:12:56

franchement t'y met pas du tien....



public static void main(String[] args) {
        int i;
        double a;
        double x;
        double x1;
        double x2;
        double x0;
        double abs = 20;
        System.out.println("Entrez un entier :");
        a = Lire.d();
        i = 1;
        x0 = (1 + a) / 2;
        while (abs < 0.0001) {
            x = (1 / 2) * (x0 + a / x0);
            x0 = x;
            x1 = (1 / 2) * (x+ a / x);
            if ((x1 - x) / x > 0) {
                abs = (x1 - x) / x;
            } else {
                abs = -(x1 - x) / x;
            }
         }
            System.out.println("La racine carrée de " + a + " est " + x1);
    }
}
  • Partager sur Facebook
  • Partager sur Twitter
8 avril 2010 à 17:15:30

Si si je t'assure je suis à fond ! Mais je fais de la programmation depuis 11h ce matin alors je sature. Par contre quand j'exécute ton programme il me dit que x1 n'est pas initialisé...
  • Partager sur Facebook
  • Partager sur Twitter
8 avril 2010 à 17:21:33

>_< initialise le ....!!

ps: moi la prog c'est chaque jour à partir de 9h... :-P
  • Partager sur Facebook
  • Partager sur Twitter
8 avril 2010 à 17:24:05

Oui mais moi je débute ! Et j'ai beau initialisé, ça ne marche pas ! Il me met la racine de...est NaN !!

Edit : Ahhh ! J'y suis (presque) arrivé ! En fait pour que ça marche il fallait mettre 1.0/2.0 et non 1/2 !

Edit 2 : en mettant bien sûr while (abs>=0.00001) et non while (abs<0.00001).

Merci pour tout !
  • Partager sur Facebook
  • Partager sur Twitter
8 avril 2010 à 17:28:16

ouais sinon tu peux aussi choisir de caster en double
  • Partager sur Facebook
  • Partager sur Twitter
8 avril 2010 à 17:31:57

(double) devant l'expression pour la convertir automatiquement...
genre tu fais (double) 1/2 c'est équivalent à 1.0/2.0
  • Partager sur Facebook
  • Partager sur Twitter
8 avril 2010 à 17:34:53

Ok ! Merci pour tout encore. J'ai juste rajouté le cas particulier de a=0 et c'est parfait. Merci !
  • Partager sur Facebook
  • Partager sur Twitter
8 avril 2010 à 17:39:03

De rien, ce forum est là pour ça ^^
  • Partager sur Facebook
  • Partager sur Twitter