Метод Ньютона в Python

Я пишу программу на питоне, которая будет решать нули, используя метод Ньютона. Я закончил писать черновую версию, затем понял несколько разных вещей и задался вопросом, нужно ли мне это исправить/изменить. (знание предмета может помочь)

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) 


   print ("the dirivative of your function = "), func1d

   x = input("number to substitude for x: ")


   func1sub = func1.subs({'x':x})
   func1dsub = func1d.subs({'x':x})
   n = x - float(func1sub/func1dsub)



   while n != x:
      func1sub = func1.subs({'x':x})
      func1dsub = func1d.subs({'x':x})
      n = x - float(func1sub/func1dsub)
      print n



main()

1) Ну, во-первых, мне было интересно, поскольку значения n и x могут не всегда быть точно такими же, мне пришлось бы округлять, используя функцию округления.

2) Посмотрев на это, я чувствую, что мой цикл while не решает того, что он должен решать, он должен решать, что такое x, что вы можете подключить к x в функции, и вывод будет x. Могу ли я сделать это, добавив значения в массив, а затем увидев, где они являются кратными экземплярами одного числа?


person Shantanu    schedule 22.11.2011    source источник


Ответы (2)


Прежде всего, значение x не меняется в вашем цикле while.

Во-вторых, критерием завершения должно быть то, что «текущая» оценка по сравнению с «предыдущей» должна быть «достаточно близкой», то есть... вы должны использовать что-то вроде:

while abs(current - previous) > tolerance:
person Pablo    schedule 22.11.2011
comment
Я согласен. Также было бы неплохо добавить проверки деления на ноль (для производной) и дивергенции (например, проверка того, остается ли оценка в определенных пределах). - person dimatura; 22.11.2011

Q1: Я согласен.

Q2: x = n в верхней части цикла. Вы хотите двигаться дальше.

person yosukesabai    schedule 22.11.2011
comment
но я не вижу, если x = n, я вижу, при каком числе n будет постоянно равняться n после прохождения уравнения - person Shantanu; 22.11.2011
comment
Метод рекурсивный. вы используете x1 для вычисления x2, затем используете x2 для вычисления x4 и так далее, пока не будете удовлетворены. в ваших обозначениях вы вычислили n на основе x. это похоже на то, что вы получили x2 (n) из x1 (x). Теперь вы хотите повторить ту же сделку, используя это время x2 в правой части формулы. Следовательно, вам нужно перейти от n (т.е. x2) к x (теперь x имеет x2, так что вы получите x3 как n) - person yosukesabai; 22.11.2011