Problème codage python méthode par dichotomie

Bonjour à tous,

je rencontre un problème, j'ai fais un code sur python afin de réaliser une méthode par dichotomie.
je sais que mon résultats est faux car c'est totalement incohérent.

je vous met mon code en photo.

Si quelqu'un arrive à voir ou je me suis trompée, c'est avec plaisir que je prend la réponse.

Bien cordialement,

Chloé

9 réponses

  1. Sais tu ce que veux dire indentation?

    Et à quel point c'est primordial en Python?
    1. xG,xD = 0.05,0.15
      
      for i in range ((5)):
          c = (xG+xD)/2
      if F1(c)*F1(xG)<0 :
          xG = c
      else:
              xD = c
              c = (xG+xD)/2
      


      j'ai fais ça, est-ce que mon erreur est corrigé ou il a toujours le même problème ?
      1. Avec le else, ca ne permet pas justement de faire en sorte que xD prenne la valeur de c si f(c) n'est pas du même signe de f(xG)?

        Pour le moment j'avoue que je bloque un peu et je ne vois pas exactement ce que je dois modifier....
        1. Je t'ai parlé d'indentation.
          Vérifie
      2. Oui c’est clair et juste.
        Enfin presque
        c et du signe de la borne xG, xG prend la valeur de c dans le prochain calcul de c et si c à le signe de la borne xD il prendra sa valeur dans le prochain calcul.


        En vrai, c’est si f(c) est du signe de f(xG) etc...

        Mais ce code
        for i in range ((5)):
            c = (xG+xD)/2
        if F1(c)*F1(xG)<0 :
            xG = c
        else:
                xD = c


        Ne fais pas ça. Il fait
        • cinq fois le calcul de c, avec les mêmes xG et xC.
        • une fois fini, il dit que si f(c) et f(xg) sont du signe opposé alors xG = c et sinon rien.


        Dans le message numéro 3, j’ai évoqué un problème, ce problème est une partie de la solution

        1. On doit faire une boucle itérative pour que notre c qui est le milieu de notre segment xG et xD se rapproche à maximum de zéro.
          La ils nous ont demandé de faire 5 itérations.
          J'ai fais une boucle for du coup, et si c et du signe de la borne xG, xG prend la valeur de c dans le prochain calcul de c et si c à le signe de la borne xD il prendra sa valeur dans le prochain calcul.
          Et le but est de faire le nombres d'iterrations qu'il faut que c soit égal à zéro ou s'en rapproche le plus possible.
          Et qu'après si on fait F(c) la veut soit très proche de zero.
          Car pour pouvoir faire une méthode par dichotomie il faut que la fonction soit de la forme f(x) =0.
          Grave à ma boucle for en cinq itérations j'ai les deux bornes xG et xD obtenu à la fin de la boucle ainsi que le c.
          Alors peut-être que pour la question suivante j'ai pas compris et il ne fallait pas faire une boucle whil mais seulement continuer les itérations jusqu'à être au plus proche de zéro avec ma boucle for.

          Je sais pas si j'ai su m'exprimer correctement...
          1. Dans ton énoncé, la boucle while n'est pas demandée.
            Tu pourrais t'y pencher après avoir réussi le reste, qu'en penses tu?

            Si j'exécute ça
            import math
            
            def F1(x):
                return a*math.log(R*x)+b-x**-1
            a = 2.46
            b = 0.29
            R = 100
            
            xG,xD = 0.05,0.15
            
            for i in range ((5)):
                c = (xG+xD)/2
            if F1(c)*F1(xG)<0 :
                xG = c
            else:
                    xD = c
                    
            print(xG, xD, F1(xG), F1(xD))


            Ça m'affiche


            En gros, la dichotomie n'a pas été calculée.

            Peux tu me détailler, à partir de 0.05 et 0.15, la dichotomie en 5 itérations?
            1. Je ne comprends pas ce que tu veux faire là

              for i in range ((5)):
                  c = (xG+xD)/2
              if F1(c)*F1(xG)<0 :
                  xG = c
              else:
                      xD = c


              N'y a t il pas un problème d'indentation.

              D'autre part, à quoi sert cette seconde boucle après la première?
              while xD-xG > 1e-10:
                  x1 = (xG+xD)/2
                  if F1(x1)*F1(xG)< 0 : 
                      xG = x1
                  else : 
                      xD = x1

              1. C'était les consignes de mon sujet je dois faire 5 itérations, pour m'approcher de zéro par le méthode de dichotomie, et après j'ai fais une boucle whil pour plus de précision.


              2. Voila les questions
            2. def F1(x):
                  return a*np.log(R*x)+b-x**-1
              a = 2.46
              b = 0.29
              R = 100
              def F1(x):
                  return a*np.log(R*x)+b-x**-1
              a = 2.46
              b = 0.29
              R = 100
              import matplotlib.pyplot as plt
              x = np.linspace(0.1, 2)
              plt.plot(x,F1(x))
              plt.xlabel("x")
              plt.ylabel("F1(x)")
              Text(0, 0.5, 'F1(x)')
              
              Partie 3 : Solution approchée par dichotomie
              
              Pour une approche par dichotomie il faut que la fonction F1(x) soit égale à 0 c'est pour ça qu'on calcul  ????1(????)=????????????????(????????)+????−????∗∗−1=0 
              xG = 0.05
              xD = 0.15
              x = 0.05
              F1(x)
              -15.750782735412113
              F1(x) < 0
              True
              Pour xG = 0,05 on a bien F(xG) < 0
              
              x= 0.15
              F1(x)
              0.28513682804477014
              F1(x)> 0
              True
              Pour xD on a bien F(xG) > 0
              
              x = np.linspace(0.05,0.15)
              plt.plot(x,F1(x))
              plt.plot(x,x)
              [<matplotlib.lines.Line2D at 0x7fb51cfeb2b0>]
              
              xG,xD = 0.05,0.15
              F1(xG),F1(xD)
              (-15.750782735412113, -4.045640671234647)
              On veut réitérer 5 fois cette méthode
              
              for i in range ((5)):
                  c = (xG+xD)/2
              if F1(c)*F1(xG)<0 :
                  xG = c
              else:
                      xD = c
              c
              0.1
              Les deux dernières bornes xG et xD sont donc
              
              xG,xD
              (0.05, 0.1)
              la Distance entre les deux points est :
              
              xD-xG
              0.05
              while xD-xG > 1e-10:
                  x1 = (xG+xD)/2
                  if F1(x1)*F1(xG)< 0 : 
                      xG = x1
                  else : 
                      xD = x1
              x1 = (xG+xD)/2
              xG,xD
              (0.05, 0.05000000009313226)
              xD-xG
              9.313225884932663e-11
              (xD-xG)/2
              4.6566129424663316e-11
              F1(x1)
              -15.750782714494608
              


              Merci, beaucoup pour ta réponse j'espère que j'ai bien transmis le code.