Pythonerie ?
Répondre à la discussion
Affichage des résultats 1 à 11 sur 11

Pythonerie ?



  1. #1
    OmbreSocial

    Question Pythonerie ?


    ------

    Bonsoir,
    j'ai fait cette algorithme dans le but de trouver un arrondie de la racine carré.

    Code:
    a=2
    e=10**(-15)
    
    
    def f(x):
        return(x**2-a)
    
    def Err(x):
        return(f(x)/a)
    
    def dicho():
        bg,bd= a,1
        if a>1 :
            bd=a+1  # si on remplace ici a+1 par 1, on a une boucle infini mais seulement pour la valeur a= 9 ?  
            bg=1
    
        elif a==1:
            return (1)
    
        while abs(Err(bd))>e:
            if Err((bd+bg)/2)*f(bg)<0:
                bd=(bd+bg)/2
            else :
                bg=(bd+bg)/2
        return (bd)

    Comme indiqué par le commentaire; en remplaçant a+1 par a et qu'on change la variable globale a=2 en a=9
    on a alors une boucle infini, pourquoi ?

    Merci beaucoup !

    -----
    Dernière modification par OmbreSocial ; 29/01/2014 à 18h38.

  2. #2
    Jack
    Modérateur

    Re : Pythonerie ?

    Avant de se lancer dans l'analyse du problème, es-tu obligé d'utiliser cet algorithme particulièrement inefficace? Il y a mieux tout en restant très simple à implémenter:
    http://fr.wikipedia.org/wiki/M%C3%A9thode_de_H%C3%A9ron

  3. #3
    OmbreSocial

    Re : Pythonerie ?

    Bonsoir,
    Merci pour votre réponse
    Le but du travail aujourd'hui était de comparer les différentes méthodes d'approximations, en partant de la plus basique : dichotomie puis lagrange, de newton , fausse position et enfin celle de Schröder.

    Cependant en codant le premier algorithme je suis tombé sur le problème énoncé, et j'aimerais bien le comprendre.

    Merci Beaucoup
    OS

  4. #4
    Jack
    Modérateur

    Re : Pythonerie ?

    en partant de la plus basique : dichotomie puis lagrange, de newton
    De mon temps, newton et lagrange permettaient de trouver les racines d'une fonction. Enfin bon, on va dire que la fonction rac(x) et on trouvera effectivement la racine carrée.
    Cependant en codant le premier algorithme je suis tombé sur le problème énoncé, et j'aimerais bien le comprendre.
    As-tu essayé de debugger en incluant des print() pour afficher l'évolution de tes variables?
    Ou plus sympa, pyScripter par exemple qui possède un débugger intégré.

    A+

  5. A voir en vidéo sur Futura
  6. #5
    Arzhur

    Re : Pythonerie ?

    Bonjour,

    Ou as-tu eu la "description" de ton algorithme ? Je trouve que la dichotomie est bizarrement implémentée.

  7. #6
    OmbreSocial

    Re : Pythonerie ?

    L'implémentation a été donné par mon prof d'info, docteur, normalien et prof d'SI x)

    Cet algorithme est fonctionnel tel quel,
    et uniquement avec l'expression " a " , il est mathématiquement juste , mais j'ai ce problème quand a = 9
    et je sais pas pourquoi ...

    Cordialement
    OS

  8. #7
    polo974

    Re : Pythonerie ?

    bd=a+1 # si on remplace ici a+1 par 1, on a une boucle infini mais seulement pour la valeur a= 9 ?
    bg=1
    As-tu une idée de ce que pourraient vouloir dire bg et bd?

    Pour moi b, c'est pour borne, et d et g pour gauche et droite (ça dépend ensuite d'où on regarde ...).

    si tu mets les 2 bornes à 1, ça ne peut pas marcher...

    enfin, si tu donnes des entiers en entrée et que tu divises par 2 (sans point) tu travailles en entier, et ça ne marche pas.
    donc quand il faut diviser par 2. (avec le point pour dire qu'on est en flottant), autant multiplier par .5 (pour une fois qu'un flottant est juste...)
    autant aussi ne faire l'opération qu'une seule fois...
    Jusqu'ici tout va bien...

  9. #8
    Arzhur

    Re : Pythonerie ?

    Bonjour,

    il est mathématiquement juste , mais j'ai ce problème quand a = 9
    Avec a=9 la condition pour "bouger les bornes" à une iteration est mauvaise.....donc on peut pas dire cet algorithme soit juste...

  10. #9
    OmbreSocial

    Re : Pythonerie ?

    Bonsoir,

    Pour moi cet algorythme est sensé être infaible :
    bd et bg c'est bien pour borne droite et borne gauche, mais on peut les inverser, c'est juste un nom de variable.

    Je vois pas pourquoi il plante avec a = 9 :

    dans l'ordre :
    a > 1 donc bd =9 et bg=1

    Puis la boucle commence car la condition d'arrêt n'est pas respecté : Err(bd) = f(9)/9 = 72/9>1 > e = 1e-15

    test : Err((bd+bg)/2)*f(bg) = Err((9+1)/2)*f(1)=Err(5)*(1-9)=(25-9)/9*(-8)<0
    donc bd=5


    ....
    Je vois pas le problème !

    Pas besoin des points pour les floats, python gère ce genre de " pythonerie " ^^
    Je crois que les int sont des sous-classes des floats en python
    Avec Caml ça serait autre chose ...

    Sincères salutations.

    OS
    Dernière modification par OmbreSocial ; 01/02/2014 à 18h22.

  11. #10
    Arzhur

    Re : Pythonerie ?

    Bonjour

    Pour moi cet algorythme est sensé être infaible
    Je comprend bien puisque c'est la correction que tu as eu....seulement il ne marche pas pour a=9. Donc c'est limite niveau infaillibilité.

    Je vois pas le problème !
    T'aurais du faire la deuxième itération ...Ca croute quand Err(bd+bg/2)=0

  12. #11
    polo974

    Re : Pythonerie ?

    Citation Envoyé par OmbreSocial Voir le message
    Bonsoir,
    ...
    Pas besoin des points pour les floats, python gère ce genre de " pythonerie " ^^
    Je crois que les int sont des sous-classes des floats en python
    Avec Caml ça serait autre chose ...

    Sincères salutations.

    OS
    Oh la vache, jusqu'à maintenant, j'utilise python 2.x , qui prend des ints, je viens d'essayer python 3, et c'est du flottant, c'est l'horreur!!!
    Bonjour la m... pour convertir les codes...
    sinon, l'algo présenté, il doit donner quoi en résultat? si c'est racine(a) pour tout a positif, c'est raté...
    Jusqu'ici tout va bien...