IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

calcul de la racine carrée par la méthode de Newton


Sujet :

Algorithmes et structures de données

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 10
    Points : 10
    Points
    10
    Par défaut calcul de la racine carrée par la méthode de Newton
    salut!!!
    je suis en train d'écrire une fonction qui calcule la racine carrée d'un réel positif a par la methode de newton.
    la racine carrée d'un reel>0 est egale à la limite de la suite (Xn) n>0
    X indice(n+1)= 1/2 *( x indice n + a / x indice n)
    X0 est arbitraire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    entrer(a);
    entrer (X0);
    n <-0
     
    tant que ???
    x(n+1)<- 1/2 *( x indice n + a / x indice n)
    n<-n+1
    fin tant que
    et apres on fait une boucle mais quelle est la condition d'arrêt!!!!!
    et quand on retourne la racine carrée de a!!!!!
    merci de me conseiller!!

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Tu peux utiliser la précision pour faire ton calcul.

  3. #3
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Vu que tu sais que ta suite converge (en tout cas en mathématiques, car en représentation flottante ça doit être plus dur à prouver), tu peux comparer l'écart entre Xn et Xn+1 (divisé par Xn pour prendre en compte l'ordre de grandeur). Donc tu t'arrêtes lorsque (|Xn+1 - Xn| / |Xn|) < ε... Il faut maintenant déterminer ton ε

  4. #4
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Octobre 2006
    Messages : 40
    Points : 48
    Points
    48
    Par défaut
    J'allais le dire. Ta suite est convergente donc

    | x(n+1) - x(n) | < epsilon

    Epsilon est une valeur très petite. A toi de voir quelle est le meilleur rapport qualité du résultat, temps de l'algorithme.

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    je ce bout de code ici (Delphi)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    // distance de deux points
    Function Distance(x1, y1, x2, y2 : integer): integer;
    // Calcul de l'hypothénuse a := sqrt(dx*dx+dy*dy)
    // en utilisant la formule de Newton pour le calcul de la racine carrée
    // 12 itérations suffisent :  sqrt(a) -->  Xo = (1+a)/2  et  Xn+1 = (xn+a/xn)/2
    // C'est 3 fois plus rapide que  j := trunc(sqrt(sqr(dx)+sqr(dy)))
    var
      i : Integer;
      a, r0, r1 : Integer;
    begin
      r0 := x2-x1;      
      r1 := y2-y1;
      a := r0*r0 + r1*r1;
      r1 := (1+a) DIV 2;
      FOR i := 1 TO 12 DO
      begin
        r0 := r1;
        IF r0 > 0 then r1 := (r0+(a div r0)) div 2;
      end;
      Result:= r1;
    end;
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    à la vitesse ou l'itération converge 12 itérations c'est déja énorme
    surtout si on choisit inteligemment l'amorce
    Elle est pas belle la vie ?

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    étant donnée qu'un entier est sur 32 Bits

    est-ce qu'il ne serait pas possible de choisir le nombre d'itération
    en fonction de la grosseur du chiffre initial?

    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    si Chiffre initiale < 16777215 (24bits)
        Nombre d'iteration=8
    else si Chiffre initiale < 65535 (16bits)
          Nombre d'iteration=6
      else si Chiffre initiale < 255 (8bits)
          Nombre d'iteration=4
      else
          Nombre d'iteration=12
    où quelque chose du genre?
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  8. #8
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    j'ai trouvé que (à l'aide de mon cpu)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
        Racine de:  | Nombre d'iteration
    =====================================
                8   |    2
               24   |    3
               48   |    4
              120   |    5
              360   |    6
            1 088   |    7
            3 135   |    8
            9 999   |    9
           31 328   |    10
          103 040   |    11
          342 224   |    12
        1 151 328   |    13
        3 920 399   |    14
       13 571 855   |    15
       47 416 995   |    16
      166 642 280   |    17
      590 733 024   |    18
    2 105 524 995   |    19
    donc pour une réponse valide avec 12 iterations
    le nombre doit être inférieur à 1 151 328

    je me demande quand le nombre d'iteration devient
    plus couteux (en cycle CPU) que de faire

    trunc(sqrt(NombreAuCarre))
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  9. #9
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut
    Si on considère la suite
    x(n+1) = 1/2 *( x indice n + a / x indice n)
    elle décroît dès l'indice 2 avec Xn > sqrt(a); Elle converge vers sqrt(a).
    Si maintenant on considère la 2eme suite Yn = a/ Xn,
    elle croit avec Yn < sqrt (a) aussi dès n >=2. Elle converge aussi vers sqrt(a).
    { La suite X peut croître entre X0 et X1 si X0 < sqrt(a) }


    donc en tout cas dès l'index 2 on a.
    Yn= a/Xn < sqrt(a) < Xn

    Pour assurer un nombre d'itérations donnant sqrt(a) <= Xn < sqrt(a) + Epsilon,
    il suffit de satisfaire Xn - a/Xn < Epsilon ( Condition suffisante, pas obligatoirement nécessairement )

  10. #10
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    oui si on choisit une amorce au hasard le nombre d'itérations est plus important
    mais on peut choisir l'amorce de la façon suivante
    10^(nombredechiffresdelapartieentièredunombre/2)
    2 105 524 995 est ainsi parfaitement traité en 7 itérations avec epsilon = 10^-12
    Elle est pas belle la vie ?

Discussions similaires

  1. Calcul de la racine carrée d'un nombre
    Par Anomaly dans le forum Télécharger
    Réponses: 3
    Dernier message: 04/11/2013, 23h16
  2. [Free Pascal] Approximation de la racine carrée par la méthode de Newton
    Par Roland Chastain dans le forum Free Pascal
    Réponses: 2
    Dernier message: 30/05/2013, 00h54
  3. Réponses: 3
    Dernier message: 17/10/2010, 16h27
  4. Calcul d'une intégrale double par la méthode des quadratures
    Par deubelte dans le forum Mathématiques
    Réponses: 5
    Dernier message: 10/05/2009, 12h40
  5. [TP] Calcul de la racine carrée
    Par cloudstrif dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 23/04/2007, 09h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo