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
Utilisateur anonyme - 17 nov. 2020 à 21:10
Utilisateur anonyme - 17 nov. 2020 à 21:10
A voir également:
- Dichotomie programme python
- Programme demarrage windows 10 - Guide
- Citizen code python avis - Accueil - Outils
- Ce programme est écrit en python ✓ - Forum Python
- Programme (x86) ✓ - Forum Windows
9 réponses
Utilisateur anonyme
17 nov. 2020 à 21:10
17 nov. 2020 à 21:10
Sais tu ce que veux dire indentation?
Et à quel point c'est primordial en Python?
Et à quel point c'est primordial en Python?
Utilisateur anonyme
15 nov. 2020 à 19:01
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
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
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
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.
Utilisateur anonyme
15 nov. 2020 à 21:17
15 nov. 2020 à 21:17
Je ne comprends pas ce que tu veux faire là
N'y a t il pas un problème d'indentation.
D'autre part, à quoi sert cette seconde boucle après la première?
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
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
15 nov. 2020 à 21:42
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Utilisateur anonyme
15 nov. 2020 à 22:43
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
Ç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?
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?
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
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...
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...
Utilisateur anonyme
Modifié le 16 nov. 2020 à 16:47
Modifié le 16 nov. 2020 à 16:47
Oui c’est clair et juste.
Enfin presque
En vrai, c’est si f(c) est du signe de f(xG) etc...
Mais ce code
Ne fais pas ça. Il fait
Dans le message numéro 3, j’ai évoqué un problème, ce problème est une partie de la solution
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
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
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....
Pour le moment j'avoue que je bloque un peu et je ne vois pas exactement ce que je dois modifier....
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
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 ?