2011-12-05 2 views
0

je demande le beaucoup de l'aide communautaire et je l'apprécie toutméthode Python newtons émet

Alors ive travaille sur un programme qui permet de résoudre méthode newtons en python, mais pour une raison quelconque sa ne fonctionne pas quelqu'un pourrait regarder au-dessus S'il vous plaît? vous remercie =)

import sympy 
from collections import defaultdict 

def main(): 
    dir(sympy) 
    print ("NEWTONS METHOD") 
    print ("Write your expression in terms of 'x' ") 
    e = sympy.sympify(raw_input("input expression here: ")) 
    f = sympy.Symbol('x') 
    func1 = e 
    func1d = sympy.diff(e,f) #takes the dirivative of the function 
    print ("the dir of your function = "), func1d 
    x = input("number to substitute for x: ") 
    a = input("how many digits would you like to round to [recomended at least 4]") 
    func1sub = func1.subs({'x':x}) #substitutes the user given value of x into the equation 
    func1dsub = func1d.subs({'x':x}) #substitutes the user given value of x into the equation 
    func1sub = float(func1sub) 
    func1dsub = float(func1dsub) 
    func1sub = round(func1sub) 
    func1dsub = round(func1dsub) 
    round(func1sub,a) 
    round(func1dsub,a) 
    n = x - (func1sub/func1dsub) 
    x1 = 0 
    x2 = 0 
    n = x - (func1sub/func1dsub) 
    x1 = n 
    x1 = round(x1) 
    n = x2 - (func1sub/func1dsub) 
    x2 = n 
    x2 = round(x2) 
    while 0 == 0: 
     if abs(x1-x2) < .0001: 
     print x1 
     break 
     else: 
     n = x2 - (func1sub/func1dsub) 
     x2 = n 
     if abs(x - n) < .03: 
     print x 
    if func1dsub == 0: 
     print ("ERROR CAN NOT DIVIDE BY 0") 
main() 
+1

Qu'est-ce qui ne fonctionne pas? –

+0

il pend comme son faire quelque chose après je l'ai exécuté, mais rien ne sort. J'ai regardé dessus pendant quelques heures maintenant et ne pas réellement voir ce qui ne va pas, en supposant que c'est une erreur de syntaxe ou quelque chose d'assez nouveau pour python. – Shantanu

+0

vous ne devez pas substituer la valeur à chaque étape de la boucle? –

Répondre

1

Vous obtenez une boucle infinie ici:

while 0 == 0: 

    if abs(x1-x2) < .0001: 
     print x1 
     break 

    else: 
     n = x2 - (func1sub/func1dsub) 
     x2 = n 

    if abs(x - n) < .03: 
     print x 

La partie de cette boucle qui compte semble être:

n = x2 - (func1sub/func1dsub) 
x2 = n 

Et votre condition de boucle est abs(x1-x2) < .0001, alors réécrivons ceci:

while abs(x1 - x2) >= .0001: 
    x2 -= (func1sub/func1dsub) 
print x1 

Alors peut-être x2 -= (func1sub/func1dsub) pousse x2 dans le mauvais sens. J'ajouter une déclaration d'impression comme ceci et assurez-vous que les valeurs convergent effectivement:

while abs(x1 - x2) >= .0001: 
    x2 -= (func1sub/func1dsub) 
    print (x1, x2) 

Aussi, je ne suis pas familier avec la méthode de Newton, mais dans votre code func1sub/func1dsub ne change jamais, mais il ne devrait pas changer à chaque itération?

+0

@Shantanu aussi, utilisez True: au lieu de while 0 == 0: et prenez le dir (sympy) de votre code - cette instruction ne fait rien comme elle est. – jsbueno

+0

@jsbueno - Je pense que cela devrait probablement être un commentaire sur la question. –

+0

hm quand je fais cela im obtenir de mauvaises réponses si, qu'est-ce que le - = faire? est-il comme écrire -x2 = (func1sub/func1dsub) – Shantanu