Проблемы с Python-ньютонами - PullRequest
0 голосов
/ 05 декабря 2011

Я много просил сообщество о помощи, и я благодарен за все это

Итак, я работал над программой, которая решает метод ньютонов в python, но по какой-то причине он не работает, может кто-нибудь просмотреть его, пожалуйста?спасибо тебе =)

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 Ответ

1 голос
/ 06 декабря 2011

Вы получаете бесконечный цикл здесь:

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

Часть этого цикла, которая имеет значение, выглядит так:

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

И ваше условие цикла abs(x1-x2) < .0001, поэтому давайте перепишем это:

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

Так что, возможно, x2 -= (func1sub / func1dsub) толкает x2 в неправильном направлении. Я бы добавил инструкцию print, подобную этой, и убедился бы, что значения действительно сходятся:

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

Кроме того, я не очень знаком с методом Ньютона, но в вашем коде func1sub / func1dsub никогда не меняется, но разве он не должен меняться на каждой итерации?

...