scipy.optimize.newton的tol参数是否针对输入x而非函数输出值?
关于Scipy中newton函数tol参数的说明
问题结论
是的,scipy.optimize.newton的tol参数默认确实作用于输入变量x的迭代步长,而非目标函数输出f(x)的残差。
测试代码异常的直接原因
你选择了初始点x=0,而你定义的函数fn = lambda x: x*x-60在x=0处的导数值为0,牛顿法(未传入导数参数时默认使用正割法)在该位置无法正常迭代更新x值,两次迭代的x差值直接小于你设置的tol=0.1,所以迭代提前终止,返回了接近0的结果,对应的f(x)自然接近-60。
另外注意你的导入拼写有误,正确导入应为from scipy.optimize import newton,你写的optimise是英式拼写,会导致导入报错。
参数设计说明
newton函数的官方定义中,终止条件为|x_k - x_{k-1}| < tol,即相邻两次迭代的x值的绝对差小于容差时停止迭代。这种设计是数值求根领域的常见实现:
- 步长容差不受函数缩放影响,比如你将目标函数整体乘以任意常数,x的解精度不会受干扰
- 如果需要基于
f(x)残差的终止条件,可在迭代结束后自行校验fn(res)是否符合要求,或是使用scipy.optimize.root_scalar接口,该接口支持更灵活的终止条件配置
修正后的测试示例
from scipy.optimize import newton fn = lambda x: x*x-60 # 传入导数,选择非导数零点的初始值8 res = newton(fn, 8, fprime=lambda x: 2*x, tol=0.1, maxiter=10000) print(res) # 输出约7.746,满足x的步长容差要求 print(fn(res)) # 输出约1e-4量级,残差远小于预期
内容的提问来源于stack exchange,提问作者BlueTrin
相关产品推荐
相关产品推荐

