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

Python Discussion :

arrêter l'itération d'une fonction racine


Sujet :

Python

  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 208
    Points : 60
    Points
    60
    Par défaut arrêter l'itération d'une fonction racine
    bonjour,
    comment arrêter l'itération quand la valeur de r est suffisamment proche de la valeur exacte de la racine recherchée.

    étant donné le programme:
    début
    r = 1
    répéter
    r =(r + n / r) / 2
    fin
    le coder convenablement en PYTHON et le faire tourner"; limiter les répétitions";

    ce que j'ai pu faire
    mais je trouve pas comment arretter l'itération ?!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    def racine(n) :
    	r = 1
    	for x in range(10):
    		r = (r + (n/r))/ 2 
    	return r
     
    >>> racine(25.0)
    5.0
    >>> racine(2.0)
    1.414213562373095
    >>> racine(28.0)
    5.291502622129181
    >>> racine(144.0)
    12.0
    merci

  2. #2
    Expert éminent

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Points : 8 442
    Points
    8 442
    Par défaut
    Salut,

    Je ne sait pas si c'est précisément ce que tu cherches, mais en Python, dans les boucles FOR et WHILE, tu peut utiliser le mot clé BREAK afin d'interrompre la boucle (voir ICI)

  3. #3
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 661
    Points : 1 159
    Points
    1 159
    Par défaut
    Bonjour,

    Pour compléter Deusyss, la function "racine" devrait prendre selon moi trois paramètres:
    • la valeur dont on veut la racine
    • le nombre max d'itérations
    • la tolérance

    La tolérance, par exemple tol, te permet de definir à partir de quand stopper le calcul. Si abs(val(k)-val(k-1)) < tol (soit si la valeur actuelle de la racine moins celle trouvée pendant la précédente boucle est inférieur à une certaine tolerance) on stop le calcul meme si on a pas atteint le nombre max d'itérations. Avec break comme l'a dit Deusyss par exemple.

    Tu as à donc definir 2 conditions pour stopper le calul. Je partirais sur une boucle while pour ma part.


    J

  4. #4
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 208
    Points : 60
    Points
    60
    Par défaut
    non je pense pas car dans le cours le prof a dit :
    Il serait sans doute souhaitable que le programme s’arrête au bout d’un certain temps, par exemple après avoir répété un certain nombre de fois les calculs, ou bien quand la valeur de r est suffisamment proche de la valeur exacte de la racine recherchée. (On peut évaluer facilement cette erreur ; plus n - r2 se rapproche de 0 et plus l’erreur est petite.)

    :s

  5. #5
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 208
    Points : 60
    Points
    60
    Par défaut
    Citation Envoyé par Julien N Voir le message
    Bonjour,

    Pour compléter Deusyss, la function "racine" devrait prendre selon moi trois paramètres:
    • la valeur dont on veut la racine
    • le nombre max d'itérations
    • la tolérance

    La tolérance, par exemple tol, te permet de definir à partir de quand stopper le calcul. Si abs(val(k)-val(k-1)) < tol (soit si la valeur actuelle de la racine moins celle trouvée pendant la précédente boucle est inférieur à une certaine tolerance) on stop le calcul meme si on a pas atteint le nombre max d'itérations. Avec break comme l'a dit Deusyss par exemple.

    Tu as à donc definir 2 conditions pour stopper le calul. Je partirais sur une boucle while pour ma part.


    J
    *abs(val(k)-val(k-1)) < tol je n'es pas compris ??!!! tant que la racine carré est proche de la valeur en stop mais comment l'écrire sa !!!

  6. #6
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 208
    Points : 60
    Points
    60
    Par défaut
    def racine(n) :
    r = 1
    for x in range(10):
    r = (r + (n/r))/ 2
    while (n - r ** 2) = 0
    break
    return r

    je vois pas comment écrire que si n - r ** 2 est égal presque a 0 !!! car la veut dire que l'erreur est petite

  7. #7
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 661
    Points : 1 159
    Points
    1 159
    Par défaut
    On est pas non plus oblige de respecter à la letter ce que le prof a dit...

    Mais bon, si tu écris while (n - r ** 2) = 0, tu devrais pouvoir écrire while abs(n - r ** 2) > tol. Le truc, c'est qu'on cherche ici une valeur approchée, pas exacte. On ne cherche pas à savoir si l'erreur est nulle, mais plutôt à savoir si l'erreur est plus faible qu'une certaine tolerance. Autrement dit, est-ce suffisament juste?

    Je mets une valeur absolue, par ce que la difference peut être negative.

    Ju

  8. #8
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 208
    Points : 60
    Points
    60
    Par défaut
    mais tol veut dire tolerance !! et est ce qu'on j'ai le doit de le mettre comme sa dans le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def racine(n) :
         r = 1
         for x in range(10):
                 r = (r + (n/r))/ 2 
                 while abs(n - r ** 2) > tol
                         break
         return r

  9. #9
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 302
    Points : 6 782
    Points
    6 782
    Par défaut
    La tolérance dont parle Julien est une valeur de comparaison.

    Communément appelée "epsilon" [1], elle sert à comparer des float en limitant la comparaison à un nombre de décimales raisonnable.
    Afin d'éviter ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    >>> 0.2 == 1.2 - 1.0
    False
    >>>
    On définit une valeur epsilon qui représente la précision maximale qui nous intéresse:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    >>> epsilon = 0.00001
    et puis on compare
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    >>> 0.2 - (1.2 - 1.0) < epsilon
    True
    Pour info:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    >>> import sys
    >>> sys.float_info.epsilon
    2.220446049250313e-16



    [1] http://docs.python.org/2/faq/design....-so-inaccurate

  10. #10
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 208
    Points : 60
    Points
    60
    Par défaut
    daccord donc pour cette exo faut que quand n-r**2 > epsilon l'itération s'arrette c'es ca !!


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def racine(n,epsilon) :
         epsilon = 0.0000000000001
         r = 1
         for x in range(10):
                 r = (r + (n/r))/ 2 
                 while abs(n - r ** 2) > epsilon  :
                         break
         return r

  11. #11
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 302
    Points : 6 782
    Points
    6 782
    Par défaut
    Non, ce n'est pas "while" mais "if"

    Non, ce n'est pas ">" mais "<"

    Tu les testes tes codes ?

  12. #12
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 208
    Points : 60
    Points
    60
    Par défaut
    bjrs

    je viens de le tester c'est faus ce que j pas compris c'est cette ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if abs(n - r ** 2) > epsilon  :
                         break
         return r
    merci pour les réponses

  13. #13
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 208
    Points : 60
    Points
    60
    Par défaut
    par contre sa marche bien avec

    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
    def racine(n,epsilon) :
         epsilon = 0.0000000000001
         r = 1
         for x in range(10):
                 r = (r + (n/r))/ 2 
                 if abs(n - r ** 2) < epsilon  :
                         break
         return r	
    >>> racine(25.0)
    5.0
    >>> racine(2.0)
    1.414213562373095
    >>> racine(28.0)
    5.291502622129181
    >>> racine(144.0)
    12.0

  14. #14
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 661
    Points : 1 159
    Points
    1 159
    Par défaut
    Salut,

    C'est bien mieux maintenant mais il y a encore deux petites choses à améliorer:
    1. Tu passes epsilon en paramètre, c'est bien, mais il ne faut pas lui donner une valeur par défaut dans la fonction mais directement dans sa "déclaration"
    2. Tu ne laisse pas le choix à l'utilisateur du nombre max d'itération, chez toi 10


    Voici une autre version:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def racine(n, maxiter=10, epsilon=1e-6) :
         r = 1
         for x in range(maxiter):
                 r = (r + (n/r))/ 2 
                 if abs(n - r ** 2) < epsilon  :
                         break
         return r
     
    print racine(2.0)
    >>>1.414213562373095
    Maintenant tu dois savoir qu'une racine carrée n'est possible que pour un nombre strictement positif. Il faudrait rajouter un test en début de ta fonction pour vérifier la validité de l'entrée.

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def racine(n, maxiter=10, epsilon=1e-6) :
         try:
                 n = float(n)
         except:
                 print 'Racine() accepte uniquement un nombre'
                 return None
         assert n > 0
         r = 1
         for x in range(maxiter):
                 r = (r + (n/r))/ 2 
                 if abs(n - r ** 2) < epsilon  :
                         break
         return r
    Bon on peut faire mieux, plus concis comme gestion d'erreur. Je veux juste te montrer que cela existe et que tu pourrais en tenir compte.

    Ju

  15. #15
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 732
    Points : 31 056
    Points
    31 056
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Julien N Voir le message
    La tolérance, par exemple tol, te permet de definir à partir de quand stopper le calcul. Si abs(val(k)-val(k-1)) < tol (soit si la valeur actuelle de la racine moins celle trouvée pendant la précédente boucle est inférieur à une certaine tolerance) on stop le calcul meme si on a pas atteint le nombre max d'itérations.
    Bonjour

    Pour ce genre de problème (limite d'une suite), il y a encore mieux que de choisir une tolérance arbitraire: laisser le processeur lui-même trouver sa propre tolérance. En effet, s'il arrive à une précision telle qu'il ne puisse plus faire la différence entre l'itération et l'itération précédente, alors la tolérance est atteinte et il peut s'arrêter et renvoyer la valeur

    Typiquement
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def racine(n):
        r=1.0
        tol=0
        while r != tol:
            tol=r
            r=(r+n/r) / 2.0     # Celui qui connait les priorités des opérateurs mathématiques (CE1) peut éviter les parenthèses inutiles...
        # while
        return r
    # racine()

    Au moment où il n'arrive plus à faire la différence entre tol (valeur précédente) et r (valeur actuelle), on a trouvé la précision maximale de la racine demandée....

  16. #16
    Expert éminent

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Points : 8 442
    Points
    8 442
    Par défaut
    Bonjour à tous,

    je vois qu'en une journée le sujet à bien avancé. C'est super.

    Je rejoint Julien N sur le fait qu'il vaut mieux prevoir de pouvoir passer un maximum de paramètre à la fonction, et de leur définir des valeurs par défaut. Ainsi en cas d'evolution de ton besoin , tu ne sera pas forcement obligé de retouché le code de ta fonction, mais uniquement ses appels.

    Sve@r, concernant ta solution, ne serait-il pas possible de passer par un formatage des nombres afin de choisir la précision désirée? Par exemple avec un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    while t0 != t1:
            tol=r
            r=(r+n/r) / 2.0
            t0 = "%." + str(precision) + "f"
            t0 = t0%r
     
            t1 = "%." + str(precision) + "f"
            t1 = t1%tol
    avec précision étant le nombre de chiffre désirés après la virgule. Ainsi on combine ton idée de laisser le pross trouver lui meme sa limite, et en meme temps l'utilisateur à un la possibilité, lors de l'appel de al fonction d'indiquer la precision souhaitée.

    Votre avis?

  17. #17
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 732
    Points : 31 056
    Points
    31 056
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par deusyss Voir le message
    Sve@r, concernant ta solution, ne serait-il pas possible de passer par un formatage des nombres afin de choisir la précision désirée?
    Tout est toujours possible. Je voulais juste montrer qu'on a possibilité ne pas (si on le désire) se casser la tête à choisir un epsilon et laisser la machine le trouver pour nous...

  18. #18
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 208
    Points : 60
    Points
    60
    Par défaut
    Citation Envoyé par Julien N Voir le message
    Salut,

    C'est bien mieux maintenant mais il y a encore deux petites choses à améliorer:
    1. Tu passes epsilon en paramètre, c'est bien, mais il ne faut pas lui donner une valeur par défaut dans la fonction mais directement dans sa "déclaration"
    2. Tu ne laisse pas le choix à l'utilisateur du nombre max d'itération, chez toi 10


    Voici une autre version:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def racine(n, maxiter=10, epsilon=1e-6) :
         r = 1
         for x in range(maxiter):
                 r = (r + (n/r))/ 2 
                 if abs(n - r ** 2) < epsilon  :
                         break
         return r
     
    print racine(2.0)
    >>>1.414213562373095
    Maintenant tu dois savoir qu'une racine carrée n'est possible que pour un nombre strictement positif. Il faudrait rajouter un test en début de ta fonction pour vérifier la validité de l'entrée.

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def racine(n, maxiter=10, epsilon=1e-6) :
         try:
                 n = float(n)
         except:
                 print 'Racine() accepte uniquement un nombre'
                 return None
         assert n > 0
         r = 1
         for x in range(maxiter):
                 r = (r + (n/r))/ 2 
                 if abs(n - r ** 2) < epsilon  :
                         break
         return r
    Bon on peut faire mieux, plus concis comme gestion d'erreur. Je veux juste te montrer que cela existe et que tu pourrais en tenir compte.

    Ju


    merci bcp julien sa l'aire très claire

  19. #19
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 208
    Points : 60
    Points
    60
    Par défaut
    merci pour les réponses j'ai bien appris

  20. #20
    Expert éminent

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Points : 8 442
    Points
    8 442
    Par défaut
    Salut,

    Si tu penses que tu as obtenu toutes les reponses à tes questions, merci de marquer le sujet comme resolu (bouton en bas de la discussion).

    Merci

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [AC-2010] arrêter le déroulement d'une fonction
    Par Guy FALESSE dans le forum IHM
    Réponses: 4
    Dernier message: 20/11/2013, 18h27
  2. [Débutant] Tracer d'une fonction racine carrée
    Par ktolajumel dans le forum MATLAB
    Réponses: 5
    Dernier message: 30/06/2013, 17h39
  3. Recherche de la racine mini d'une fonction inconnue - Le retour
    Par plegat dans le forum Algorithmes et structures de données
    Réponses: 13
    Dernier message: 19/11/2007, 22h37
  4. calculer les racines d'une fonction
    Par carole8 dans le forum C
    Réponses: 18
    Dernier message: 06/12/2006, 00h14
  5. Recherche de la racine mini d'une fonction inconnue
    Par plegat dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 31/07/2006, 19h39

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