Problème codage python méthode par dichotomie

Signaler
Messages postés
6
Date d'inscription
dimanche 15 novembre 2020
Statut
Membre
Dernière intervention
17 novembre 2020
-
Messages postés
15103
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 novembre 2020
-
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

Messages postés
15103
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 novembre 2020
614
Sais tu ce que veux dire indentation?

Et à quel point c'est primordial en Python?
Messages postés
15103
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 novembre 2020
614
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

Messages postés
6
Date d'inscription
dimanche 15 novembre 2020
Statut
Membre
Dernière intervention
17 novembre 2020

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.
Messages postés
15103
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 novembre 2020
614
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

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.
Messages postés
6
Date d'inscription
dimanche 15 novembre 2020
Statut
Membre
Dernière intervention
17 novembre 2020



Voila les questions
Messages postés
15103
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 novembre 2020
614
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?
Messages postés
6
Date d'inscription
dimanche 15 novembre 2020
Statut
Membre
Dernière intervention
17 novembre 2020

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...
Messages postés
15103
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 novembre 2020
614
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

Quand j'étais petit, la mer Morte n'était que malade.
George Burns
Messages postés
6
Date d'inscription
dimanche 15 novembre 2020
Statut
Membre
Dernière intervention
17 novembre 2020

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....
Je t'ai parlé d'indentation.
Vérifie
Messages postés
6
Date d'inscription
dimanche 15 novembre 2020
Statut
Membre
Dernière intervention
17 novembre 2020

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 ?