p= lambda x: 3 * x**3 - 5.03 * x**2 - 1.95 * x + 0.02
dp = lambda x: 9 * x**2 - 10.06 * x - 1.95
x0 = -1
tol = 10**-4
max_iter = 100
def newton_method(f, df, x0, tol, max_iter=100):
for i in range(max_iter):
fx = f(x0)
dfx = df(x0)
if df==0 and dfx!=0 :
raise Exception('division by 0')
elif fx==0:
return i, x0
x = x0 - fx/dfx
if abs(x-x0) <=tol:
return i, x0
x0 = x
raise ValueError("The newton method doesn't converge after {} iterations".format(max_iter))
c,r = newton_method(p, dp , x0, tol, max_iter)
print("Approssimazione:", r,c)
如果我将起始点设置为 -1 或 0,该函数看起来效果很好,但如果我将一个值设置为接近 5(另一个零约为 5.3),则该函数“收敛”到 2,这远不是一个解决方案。
如果我输入
x_0=2
,那就更奇怪了,因为无论我输入哪个容差,该函数都会执行0次迭代并将2视为解决方案,就像函数在检查绝对值是否小于或等于容差时关闭一样,但是如果我尝试计算 x
处的 i=0
项,结果不小于或等于任何容差,有人可以帮助我理解算法出了什么问题吗?
函数 𝑓(𝑥)=3𝑥³−5.03𝑥²−1.95𝑥+0.02 的图形如下所示(由 Wolfram 生成):
根位于:
运行函数得到的结果符合预期。
值得注意的是,当您从 5 开始时,预计该过程会收敛到 2,这是一个解决方案。另一方面,5.3 不是该函数的零点。