我想找到函数 f(x) 的局部最大值,其中 x 可以介于两个固定值之间,因为如果 x 趋于 +inf,f(x) 将趋于 +inf。我一直在尝试使用诸如 scipy.optimize.fmin_l_bfgs_b
和 scipy.optimize.fmin_tnc
(来自 scipy.ref 指南)之类的算法,但我不知道如何正确设置边界。 (我知道,这一定很愚蠢,但我是 Python 的菜鸟)。让我们举一个简单的例子:
>>>import scipy.optimize as opt
>>>import scipy
>>>from numpy import *
>>>def f (x): return x**(1/2.0)
>>>max_x = opt.fmin_l_bfgs_b(lambda x: -f(x), [0,0], bounds=([0,0],[9,0])) #I want x to range between 0 and 9 and fmax be 3
虽然输出很奇怪:我什么也没得到!甚至没有错误!我错过了什么?
最佳答案
边界参数变为 [(lower1,upper1),(lower2,upper2)],而不是 [(lower1,lower2),(upper1,upper2)]。如果您查看结果 (max_x),您会看到“错误:没有可行的解决方案”,我猜这是因为您的边界指定了一个空集。
这是调用函数的正确方法。我假设平方根只是一个例子。我改用 -x**2。
import scipy.optimize as opt
import scipy
from numpy import *
def f(x):
print x
return -x**(2)
max_x = opt.fmin_l_bfgs_b(lambda x: -f(x), 1.0, bounds=[(-9,9)],approx_grad=True)
因为没有指定梯度函数,所以需要设置approx_grad=True。 1.0 是我对最大值的初始猜测(尽管在这个例子中它显然为零)。我添加了一个 print 语句,以便每次调用该函数时都能看到,但这通常不是必需的。有关调用 fmin_l_bfgs_b 的不同方式的更多详细信息,请参阅 here .
以上代码的结果是:
[ 1.]
[ 1.]
[ 1.00000001]
[-0.99999999]
[-0.99999999]
[-0.99999998]
[ 0.001]
[ 0.001]
[ 0.00100001]
[ -5.01108742e-09]
[ -5.01108742e-09]
[ 4.98891258e-09]
max_x 看起来像这样:
(array([ -5.01108742e-09]),
array([ 2.51109971e-17]),
{'funcalls': 4,
'grad': array([ -2.21748344e-11]),
'task': 'CONVERGENCE: NORM_OF_PROJECTED_GRADIENT_<=_PGTOL',
'warnflag': 0})
关于python - 在 Python 中找到带边界的函数的最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16781115/