Похоже, вы хотите гарантировать, что корень найден в заданном интервале (что не может гарантировать Ньютон-Рафсон). Вы можете использовать пополам для этого. Если вы знаете, что функция меняет знак в заданном интервале (и непрерывно в одном и том же), то работает что-то вроде следующего:
>>> from sympy.abc import x
>>> from sympy import nsolve
>>> ivl = 0,3
>>> expr = (x**2 + cos(x)**2 -4*x)
>>> nsolve(expr, x, ivl)
0.250324492526265
Но, похоже, вы можете смешать некоторые переменные в том, что выпытаются с помощью метода NR. xnew
, который вы рассчитываете, очень похож на f(x)/f'(x)
, который равен dx
в xnew = x - dx
. Поэтому, если вы напишите:
for j in range(1, 101):
dx = (x**2 + cos(x)**2 -4*x)/(2*(x - cos(x)*sin(x) -2))
if abs(dx) < 0.000001:
break
x = x - dx
print('Root = %0.6f ' % x)
print('Number of iterations = %d' % j)
, вы получите
Root = 0.250324
Number of iterations = 4