Как перебирать условие до тех пор, пока значения не сойдутся? (Метод Ньютона Рафсона)

#python #python-3.x #loops #newtons-method

Вопрос:

Для метода Ньютона-Рафсона меня просят написать цикл для вызова функции до тех пор, пока она не сойдется так, чтобы значения x(n) и x(n 1) отличались менее чем на небольшое число e=10^-8, однако я не совсем уверен, как создать этот цикл.

Вот мой код до сих пор

 def newton_step(f, fp, x0):  return x0-(f(x0)/fp(x0))  import numpy as np def f(x):  return x**3   x**2  2   def fp(x):   return 3*x**2   2*x  x = newton_step(f, fp, (x0)) count = 0 #to count the number of iterations required to satisfy the condition while (x0 - x) lt;= 10**-8:  x0 = newton_step(f, fp, (x0))  count  = 1  print(x0, x)  

Комментарии:

1. В чем именно заключается ваш опыт?

2. У меня есть «Ошибка имени: имя» x0 «не определено»

3. Вы используете функцию, чтобы приблизить значения 2 друг к другу, верно? Вы должны указать эти 2 начальных значения (x, x0)

4. Большое вам спасибо!

Ответ №1:

Похоже, ваш оператор сравнения работает в обратном направлении, попробуйте:

while (x0 - x) gt; 10**-8:

так что он будет зацикливаться, продолжая while разницу greater than 10^-8 (выход из цикла, как только она станет меньше этого значения).

Кроме того, вы захотите убедиться, что ваш код устанавливает начальное значение x0 перед циклом (чтобы было с чем сравнивать).

Комментарии:

1. Я был сбит с толку тем, что такое x0, так что это просто любое случайное значение или решение этого выражения?

2. Большое вам спасибо!

Ответ №2:

Я вижу по крайней мере 2 проблемы с вашим кодом —

  1. Вы не обновляете x
  2. если x0lt;x тогда цикл закончится, но они могут отличаться более 10^-8
  3. Неправильное условие

Подводя итог, я бы изменил цикл —

 while abs(x0-x) gt;= 10**-8:  new_x = newton_step(f, fp, (x0))  x = x0  x0 = new_x  count  =1  print(x0, x)  

Комментарии:

1. Я продолжаю получать «Ошибка имени: имя «x0″ не определено»

2. Я предположил, что это было определено ранее в коде

3. Проблема, с которой я борюсь, заключается в том, просят ли они меня указать конечное значение/фактический корень для этого уравнения, или если они просят меня снова вызвать функцию, чтобы x0 = (f, fp, (x0))

4.Большое вам спасибо!

Ответ №3:

Ваш цикл while выполняется до тех пор, пока разница меньше, но он должен выполняться до тех пор, пока разница больше. Измените while (x0 - x) lt;= 10**-8 на while (x0 - x) gt;= 10**-8 .

Комментарии:

1. Большое вам спасибо!