scipy.optimize.newton - 容差参数 tol 不是指函数结果而是指输入容差?

3

我想解决一个函数接近于0的问题。

我尝试使用Scipy包中的newton函数,但容差似乎适用于输入而不是输入的函数:

from scipy.optimise import newton
fn = lambda x: x*x-60
res = newton(fn, 0, tol=0.1, maxiter=10000)
print(res)
print(fn(res))

res 接近于0,fn(res) 约为-60。看起来 newton() 停止是因为它找到了两个限制解并且在容差范围内。

这是正确的,容差是基于 x 而不是 fn(x) 吗?

对我来说,这似乎非常违反直觉。

1个回答

2
是的,这里的“容差”是指函数f(x)的函数参数x。 请参见此处:zeros.py 代码检查从p0到p的步长是否足够小(他们在代码中将函数参数称为p而不是x),如果是,则算法停止。
实际上,您正在使用弦截法而不是牛顿法,因为您没有提供函数的导数。 请改用newton(func=lambda x: x*x-60, fprime=lambda x:2*x, x0=0, tol=0.1, maxiter=10000)
当您运行上述代码时,会出现错误。那是因为您从函数的局部最小值开始,其中切线与x轴平行。 在每次迭代中,牛顿法跳到切线和x轴相交的位置。 如果x轴和切线平行,这当然是不可能的。尝试从x0=0.1开始以获得正确的输出。 下面的图显示了您的二次函数及其在x = 0和x = 2处的切线。很容易看出从x0 = 2开始可以工作,因为x轴和切线将在某一点相交。 enter image description here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接