Dichotomie (python débutant) — Les-mathematiques.net The most powerful custom community solution in the world

Dichotomie (python débutant)

Bonjour,
j'enseigne au collège depuis de nombreuses années, je n'ai donc jamais utilisé Python, ni Scilab... Je m'étais inscrit à une formation mais celle-ci a été supprimée par manque de candidats... bref je risque de paraître bête et de poser des questions stupides, désolé.. mais j'aimerais apprendre un peu les bases. Pour cela, je viens de me procurer un livre "Python et les 40 problèmes mathématiques" et je m'exerce.
Déjà, première question, dans ce bouquin on dit de télécharger Pyzo et d'ailleurs tous les exercices sont corrigés avec pyzo, est-ce vraiment la même chose que Python ?
Ensuite je suis en train de travailler sur la méthode de dichotomie pour approximer la racine carrée de 2, je tape exactement ce qui est proposé et qui me semble correct et il apparaît toujours des messages d'erreur.. (en voici un par exemple) je ne comprends pas pourquoi...
Merci !96530

Réponses

  • Il manque un caractère : à la fin de la ligne.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Ah oui effectivement ":" mais toute à l'heure un autre message était apparu malgré ça.. je vais réessayer.
    Par contre, question sûrement bête, mais je dois tout recommencer le programme quand un message d'erreur apparaît ? je ne vois pas comment supprimer une ligne pour revenir en arrière...
  • Autre message d'erreur :(...96532
  • Je ne connais pas python, mais c'est bizarre que le else soit indenté différemment du if avec lequel il fonctionne. Et comme c'est "line 9" ...

    Cordialement.
  • Bonjour
    Est ce que tu peux faire un copier coller de ton programme pour que je le lance et corriger + facilement l'erreur?
     
  • L'erreur vient surement de là mais je ne vois pas comment l'indenter autrement.... :( ou dois-je taper sur entrée plusieurs fois? merci
  • def f(x):
        return x**2-2
        a=1
        b=2
        while b-a>10**(-4):
            m=(a+b)/2
            if f(m)==0:
                a=b
                else:
    

    [Pour afficher du code python, IL FAUT utiliser le bouton "Code" (5ème par la droite au dessus de la fenêtre d'édition. AD]
  • Pour ne pas tout retaper, tu colles ton script dans un fichier.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Si je comprends bien il faut taper le programme entièrement dans un fichier à gauche puis faire un copier/coller à droite "logger" pour lancer le programme. Je viens de procéder ainsi et cette fois l'erreur apparaît ligne 3...96534
  • Bon pour l'instant la déclaration de f est correcte.

    Mais la boucle qui commence par while n'est pas terminé donc c'est normal qu'il y a un message d'erreur.
    D'ailleurs il n'y a rien après ton else..;;;
     
  • Je ne vois vraiment pas comment corriger ce programme et pourquoi il me dit qu'il y a une erreur ligne 3... :(
  • Peut-être lire un texte sur le fonctionnement du langage python, pour comprendre ce qu'on te dit ... Tu sembles écrire sans t'occuper de la syntaxe du langage, tu ne peux qu'avoir toujours des erreurs ...

    Cordialement.
  • Rebonjour
    Je ne connais pas python sauf que j'ai commencé à le regarder il y a 2 jours pour aider quelqu'un. Alors j'aide comme je peux.
    Ce que je viens de comprendre c'est que l'indentation est importante avec python
    d'où le risque de beaucoup de message d'erreurs en débutant.
    Voilà ton programme que j'ai un peu arrangé et il tourne
    def f(x):
     return x**2-2
    
    a=1
    b=2
    k=0
    
    while b-a>10**(-2):
          k=k+1 
          m=(a+b)/2
          if f(m)==0:
             a=b
          else:
              if  f(a)*f(m) < 0:
                   b=m
              else:
                   a=m
    
    print(a)
    print(b)
    print(k)
    

    [Pour afficher du code python, IL FAUT utiliser le bouton "Code" (5ème par la droite au dessus de la fenêtre d'édition. AD]
     
  • Attention dans mon copier collé l'indentation a disparue ...

    [Pour afficher du code python, IL FAUT utiliser le bouton "Code" (5ème par la droite au dessus de la fenêtre d'édition. AD]
     
  • Le bouton "code formaté" de la fenêtre d'édition, ça sert à ne pas perdre l'indentation en route !
  • def f(x):
          return x**2-2
    
    a=1
    b=2
    k=0
    
    while b-a>10**(-2):
          k=k+1 
          m=(a+b)/2
          if f(m)==0:
             a=b
          else:
              if  f(a)*f(m) < 0:
                   b=m
              else:
                   a=m
    
    print(a)
    print(b)
    print(k)
    

    [Pour afficher du code python, IL FAUT utiliser le bouton "Code" (5ème par la droite au dessus de la fenêtre d'édition. AD]
     
  • Le bouton "code formaté", ce n'est pas pour les chiens !
  • def f(x):
        return x**2-2
    
    a=1
    b=2
    k=0
    
    while b-a>10**(-2):
          k=k+1 
          m=(a+b)/2
          if f(m)==0:
             a=b
          else:
              if  f(a)*f(m) < 0:
                   b=m
              else:
                   a=m
    
    print(a)
    print(b)
    print(k)
    

    [Pour afficher du code python, IL FAUT utiliser le bouton "Code" (5ème par la droite au dessus de la fenêtre d'édition. AD]
     
  • Euh... Tu vas continuer longtemps comme ça ?
  • Bonjour,

    Ce n'est quand même pas compliqué de cliquer sur le bouton "code formaté".
    A moins que bd2017 refuse de suivre les conseils.
    def f(x):
        return x**2-2
    
    a=1
    b=2
    k=0
    
    while b-a>10**(-2):
        k=k+1
        m=(a+b)/2
        if f(m)==0:
            a=b
        else:
            if f(a)*f(m) < 0:
                b=m
            else:
                a=m
    
    print(a)
    print(b)
    print(k)
    
    Qui répond:
    1.4140625
    1.421875
    7
    
    Cordialement,

    Rescassol
  • Non c'est pas difficile mais j'ai cru que @Gabuzomeu parlait de l'éditeur de pyzo. Et puis il pourrait faire preuve de politesse.
    D'autre part c'est pas la peine de se fatiguer. En effet la même question est posée sur un autre forum....
     
  • On peut vérifier, quand on compte les étapes, que trois chiffres significatifs de mieux demandent 10 étapes supplémentaires de dichotomie - rien de plus normal.
  • Merci beaucoup bd2017!
  • Ce qui est étrange c'est que cela fonctionne sur http://pythontutor.com/visualize.html#mode=edit mais sur Pyzo j'obtiens toujours un message d'erreur ligne 3 , je ne comprends pas pourquoi...96564
  • Bonjour,

    Je précise que le code que j'ai donné plus haut est écrit dans Pyzo (et non pizo) et qu'il ne génère pas d'erreur.

    Cordialement,

    Rescassol
  • Moi exactement la même chose sur Pyzo et ça affiche une erreur... bref, pas grave.
    J'aimerais maintenant effectuer le même genre d'algorithme permettant de donner également une valeur approchée de la racine carrée de 2 à $10^{-100}$ près à l'aide de la méthode des sécantes, puis la méthode de Newton. J'y réfléchis de mon côté et je reviendrai certainement vers vous si je bloque. Merci.
  • Quelle erreur, au juste ?
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Bonjour,

    $10^{-100}$ en précision limitée, faut pas rêver !!....

    Sinon, j'utilise Pyzo 3.7.2 et non 3.6, mais ça ne peut pas être ça.
    Tu peux essayer de supprimer ta fonction f et la retaper sans copier/coller.

    Cordialement,

    Rescassol
  • Ok merci je réessayerai.. c'est une erreur à la ligne 3.

    Pour la précision 10^-100 j'aimerais au moins qu'on me donne le rang à partir duquel on a cette précision. J'ai retrouvé mes leçons de capes, ma calculatrice voyage 200 (il y a 13 ans) donnait cette précision.
  • Bonjour,

    La fonction sqrt, aussi bien dans math que dans numpy répond $1.4142135623730951$, pas mieux.
    Puis, $2^{-333}<10^{-100}<2^{-332}$, et comme tu fais de la dichotomie.....

    Cordialement,

    Rescassol
  • Bonsoir,
    alibabadu59 a écrit:
    c'est une erreur à la ligne 3.
    Quand on te demande quelle erreur, on ne te demande pas à quelle ligne !!! :-X

    Cordialement,

    Rescassol
  • Si j'ai répondu ligne 3 c'est que je n'en sais pas plus, je ne suis pas sur mon PC là et je n'ai pas le temps là d'y regarder ..
    D'après vous, l'algorithme que j'aimerais créer (méthode des sécantes et [large]N[/large]ewton) est impossible ?
    En fait j'aimerais illustrer à l'aide de python le fait que la méthode de [large]N[/large]ewton est plus performante que la méthode des sécantes, qui est elle aussi plus performante que la méthode par dichotomie, à l'aide de l'exemple d'approximation de la racine carrée de 2. Que me conseillez-vous comme illustration alors ? Merci d'avance.

    [Isaac Newton (1643-1727) prend toujours une majuscule. AD]
  • Bien sûr que c’est possible.
    Il faut juste que tu écrives un script valide syntaxiquement ou que tu nous dises exactement quel est le message d’erreur. Sans ça, on ne peut pas t’aider.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Voici le message d'erreur sur Pyzo
    "Uncaught Python exception: invalid syntax (<logger>, line 3)
    File "code.py", line 63, in runsource
    File "codeop.py", line 171, in __call__
    File "codeop.py", line 100, in _maybe_compile
    File "codeop.py", line 87, in _maybe_compile
    File "codeop.py", line 136, in __call__"
  • Avec la méthode des sécantes on construit la suite Un+1=(2+2Un)/(2+Un) et on montre que 0<racine(2)-Un<(1/5)^n
    J'ai créé alors cet algorithme mais c'est faux ,on devrait obtenir n=19 et non 144....96570
  • Avec la méthode de Newton on construit la suite Un+1=(Un+2/Un)*1/2,
    et on montre que Un-racine(2)< Vn avec Vn=1/2^(2^n-1). On remarque alors que Vn+1=Vn²/2.

    J'ai créé cet algorithme mais pareil il y a un souci car on devrait normalement obtenir n=6 et non 9...96572
  • Une erreur de syntaxe ligne 3 veut dire que ton script ne respecte la syntaxe de Python à la ligne 3 (et peut-être ailleurs après).
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Bonjour.

    Ne faut-il pas une ligne vide, après la définition d'une fonction ?
  • Dans le code de ce message, il est plausible qu'il suffise d'ajouter une ligne vide après la définition de la fonction, c'est-à-dire remplacer...
    def f(x):
        return x**2-2
        a=1
        b=2
    
    ou mieux...
    def f(x):
        return x**2-2
    a=1
    b=2
    
    par
    def f(x):
        return x**2-2
    
    a=1
    b=2
    
    J'ai déjà eu ce genre de gag en copiant collant du code d'un éditeur de texte dans l'interpréteur Python.
    Edit : grillé par Gérard, d'après qui ce n'est pas un gag, c'est un feature.
  • gerard0 a écrit:
    Ne faut-il pas une ligne vide, après la définition d'une fonction ?

    Pas à ma connaissance (je viens de tester).
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Bonjour,
    j'ai beau tout essayer, même en retapant tout dans un nouveau fichier, toujours un message d'erreur ligne 3 c'est bizarre... enfin bref ce n'est pas grave, ça a l'air de fonctionner avec Python3.6.

    Sinon qu'est-ce que je dois modifier dans mon algorithme (méthode de la sécante) pour que cela fonctionne ? Merci beaucoup.
  • Montre-nous ce fichier en entier (et correctement aligné).
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • alibabadu59 a écrit:
    Si je comprends bien il faut taper le programme entièrement dans un fichier à gauche puis faire un copier/coller à droite "logger" pour lancer le programme.

    Non, après avoir tapé ton programme dans ce que tu appelles "fichier à gauche", il faut l'exécuter (avec F5 je crois, je n'ai pas Pyzo sous la main).

    Dans ce message http://www.les-mathematiques.net/phorum/read.php?15,1938746,1938790#msg-1938790 tu es manifestement dans le shell où tu ne peux exécuter qu'une commande à la fois, c'est pour ça que ça ne marche pas.
Connectez-vous ou Inscrivez-vous pour répondre.
Success message!