Problème codage python méthode par dichotomie

Fermé
chloe.CNC Messages postés 6 Date d'inscription dimanche 15 novembre 2020 Statut Membre Dernière intervention 17 novembre 2020 - 15 nov. 2020 à 18:10
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 - 17 nov. 2020 à 21:10
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

Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
17 nov. 2020 à 21:10
Sais tu ce que veux dire indentation?

Et à quel point c'est primordial en Python?
1
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
15 nov. 2020 à 19:01
Bonjour

pour pouvoir t'aider il faut qu'on puisse tester ton code.
Pour le poster, il suivre la procédure décrite là https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
A lire attentivement et jusqu'au bout

0
chloe.CNC Messages postés 6 Date d'inscription dimanche 15 novembre 2020 Statut Membre Dernière intervention 17 novembre 2020
15 nov. 2020 à 20:47
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.
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
15 nov. 2020 à 21:17
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

0
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.
0
chloe.CNC Messages postés 6 Date d'inscription dimanche 15 novembre 2020 Statut Membre Dernière intervention 17 novembre 2020
15 nov. 2020 à 21:42


Voila les questions
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
15 nov. 2020 à 22:43
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?
0
chloe.CNC Messages postés 6 Date d'inscription dimanche 15 novembre 2020 Statut Membre Dernière intervention 17 novembre 2020
16 nov. 2020 à 09:41
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...
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
Modifié le 16 nov. 2020 à 16:47
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

0
chloe.CNC Messages postés 6 Date d'inscription dimanche 15 novembre 2020 Statut Membre Dernière intervention 17 novembre 2020
17 nov. 2020 à 10:13
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....
0
Je t'ai parlé d'indentation.
Vérifie
0
chloe.CNC Messages postés 6 Date d'inscription dimanche 15 novembre 2020 Statut Membre Dernière intervention 17 novembre 2020
17 nov. 2020 à 20:58
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 ?
0