xtol 和 ftol 使用 scipy.optimize 的 fmin() 有什么区别?

use*_*127 4 scipy

我开始在一个非常简单的例子中使用函数 fmin 并尝试获取最小化乘法值的向量的值:

def prueba(x,y):
    print "valor1:",x[0],"\n"
    print "valor2:",x[1],"\n"
    print "valor3:",x[2],"\n"
    print "valor4:",x[3],"\n"
    min=x[0]*x[1]*x[2]*x[3]
    print min
    return min

sal = fmin(prueba,x0=array([1, 2, 3,4]),args="1",retall=1,xtol=0.5,ftol=0.5)#maxfun=1,maxiter=1,retall=1,args="1")
Run Code Online (Sandbox Code Playgroud)

但如果我不定义 xtol 和 ftol 出现:

"Warning: Maximum number of function evaluations has been exceeded."
Run Code Online (Sandbox Code Playgroud)

出于这个原因,我使用参数xtol和定义了算法的收敛性ftol,但我仍然不明白它们之间有什么区别,我看起来是一样的,但是如果我删除两者之一,我会再次收到警告。

xtolftol?到底有什么区别,在这种情况下应该使用哪个?。

我已阅读文档:

其他参数

xtol :
收敛的 xopt 中可接受的相对误差数。
ftol :
func(xopt) 中可接受的收敛相对误差的数量。

我还是不明白

mac*_*uff 5

这是我的理解。它类似于 mathworks 函数fminsearch。他们定义了这些值:

TolFun:函数值的终止容差 TolX:x 的终止容差

随着搜索以迭代方式进行。x从一次迭代到另一次迭代的值差异变得越来越小,直到它不再重要并且您还不如完成。功能容差也是如此。在您的示例中,prueba被评估并且其从迭代到迭代的返回值之间的差异越来越小,直到它也无关紧要。你问你应该使用哪个。这可能有点像实验方法。过去我经常使用:

xtol = 1e-6;
ftol = 1e-6;
Run Code Online (Sandbox Code Playgroud)

它似乎可以很好地解决许多问题,并且是一个很好的起点。您可能会发现,如果需要调整,这将是显而易见的。就像可怕的收敛时间。数据拟合度差等。希望这会有所帮助。