Problème codage python méthode par dichotomie
chloe.CNC
Messages postés
6
Statut
Membre
-
Utilisateur anonyme -
Utilisateur anonyme -
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é



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
-
Sais tu ce que veux dire indentation?
Et à quel point c'est primordial en Python?
-
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
-
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. -
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
-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
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 çaimport 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?
-
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... -
Oui c’est clair et juste.
Enfin presquec 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 codefor 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
-
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.... -
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 ?
