我开始在一个非常简单的例子中使用函数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")
但如果我不定义xtol,ftol就会出现:
"Warning: Maximum number of function evaluations has been exceeded."
出于这个原因,我已经使用参数xtol
和ftol
定义了算法的收敛性,但我仍然不明白它们之间的区别,我看起来是一样的,但如果我删除了其中一个,我会再次收到警告。
CCD_ 3和CCD_?,在这种情况下应该使用哪个?。
我已经阅读了文档:
其他参数
xtol:number
xopt中用于收敛的可接受的相对误差
ftol:number
func(xopt)收敛的可接受相对误差。
我仍然不理解
以下是我的理解。它类似于mathworks函数fminsearch。他们定义了这些值:
TolFun:函数值的终止公差TolX:x 上的终止公差
随着搜索以迭代方式进行。x
的值在一次迭代和另一次迭代之间的差异越来越小,直到它不再重要,你也可以这样做。功能公差也是如此。在您的示例中,对prueba
进行求值,并且它在迭代与迭代之间的返回值之间的差异越来越小,直到它也无关紧要为止。你问你应该用哪个。这可能有点像一种实验性的方法。在过去我经常使用:
xtol = 1e-6;
ftol = 1e-6;
它似乎能很好地解决许多问题,是一个很好的起点。你可能会发现,如果一个需要调整,那将是显而易见的。就像可怕的趋同时代。数据拟合度差等。希望这能有所帮助。
我知道这个问题有点老了,但我仍然想指出@user1264127的例子根本不收敛。根据fmin算法的具体细节,该示例可能呈指数发散。如果你想看看xtol和ftol之间的区别,可以尝试一个收敛的例子,比如:
def myFun(x):
return (x[0]-1.2)**2 + (x[1]+3.7)**2
optimize.fmin(myFun,[0,0])
使用默认参数运行时的输出:
Optimization terminated successfully.
Current function value: 0.000000
Iterations: 79
Function evaluations: 150
Out[4]: array([ 1.19997121, -3.70003115])
当我使用xtol=1e-12:运行时的输出
Optimization terminated successfully.
Current function value: 0.000000
Iterations: 138
Function evaluations: 263
Out[5]: array([ 1.2, -3.7])
当xtol=1时,ftol=1e-3:
Optimization terminated successfully.
Current function value: 0.000099
Iterations: 61
Function evaluations: 116
Out[17]: array([ 1.20348989, -3.69068928])