Пусть f - символическая функция, представляющая рассматриваемое уравнение, dF - символическое уравнение, представляющее производную от f, начальное значение x0, epsilon (конечное условие существования функции, когда вы достаточно близки к корню), и max_iter(сколько итераций вы хотите запустить).Это лучше, чем ваш метод, потому что он работает для любого корня, пока вы пишете соответствующую производную.
def newtons_method(f,Df,x0,epsilon,max_iter):
xn = x0
for n in range(0,max_iter):
fxn = f(xn)
if abs(fxn) < epsilon:
print('Found solution after',n,'iterations.')
return xn
Dfxn = Df(xn)
if Dfxn == 0:
print('Zero derivative. No solution found.')
return None
xn = xn - fxn/Dfxn
print('Exceeded maximum iterations. No solution found.')
return None
Пример использования:
f = lambda x: x**4 - x**3 - 1
Df = lambda x: 4*x**3 - 3*x
approx = newtons_method(f,Df,1,1e-10,10)
print(approx)