#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 проблемы с вашим кодом —
- Вы не обновляете
x
- если
x0lt;x
тогда цикл закончится, но они могут отличаться более10^-8
- Неправильное условие
Подводя итог, я бы изменил цикл —
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. Большое вам спасибо!