在Python中查找具有边界的函数的最大值

在Python中查找具有边界的函数的最大值,python,python-3.x,scipy,max,Python,Python 3.x,Scipy,Max,我想找到一个函数f(x)的局部最大值,其中x可以在两个固定值之间,因为如果x趋向于+inf,f(x)趋向于+inf。我一直在尝试使用诸如scipy.optimize.fmin_bfgs_b和scipy.optimize.fmin_tnc(来自scipy.ref指南)但我不知道如何正确设置边界。(我知道,这一定很愚蠢,但我对Python很在行)。让我们举一个简单的例子: >>>import scipy.optimize as opt >>>import sc

我想找到一个函数f(x)的局部最大值,其中x可以在两个固定值之间,因为如果x趋向于+inf,f(x)趋向于+inf。我一直在尝试使用诸如
scipy.optimize.fmin_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

但是,输出非常奇怪:我什么也得不到!一个错误也没有!我遗漏了什么?

为什么要使用多元极小值?尝试
scipy.optimize.fminbound

max_x = opt.fminbound(lambda x: -f(x), 0, 9)
bounds参数是[(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)
因为您没有指定梯度函数,所以需要设置“近似梯度=真”。1.0是我对最大值的初始猜测(尽管在本例中它显然是零)。我添加了一个print语句,以便每次调用函数时都能看到它,但这通常不是必需的。有关调用fmin_l_bfgs_b的不同方法的更多详细信息,请参阅

上述代码导致:

[ 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})
(数组([-5.01108742e-09]),
阵列([2.51109971e-17]),
{'funcall':4,
“梯度”:数组([-2.21748344e-11]),

“任务”:“收敛:投影梯度的范数”
>max\ux
是什么意思?请注意,
max\ux
将是一个三元组,如文档所示……第三个元素还将提供一些关于函数导数的渐进信息尝试牛顿方法数次,以找到函数上的临界点。这些临界点之一应为最大值。这假设函数表现良好。函数肯定
-sqrt(x)
没有局部极大值?你的函数是一维的,但你试图使用二维初始猜测和边界。这很可疑。很好!你的代码工作得很好!事实上,我对边界参数有点怀疑,我以为我已经尝试了这些值之间的所有组合,但看起来好像没有!最后一个问题问题:我如何分别使用max_x结果中得到的fmin值?我的意思是,我想用fmin进行其他计算:比方说,将它乘以2(不过在你的例子中仍然是零)。我可以这样做吗?返回值是一个称为元组的标准Python数据结构,它类似于列表,只是它是不可变的。如果您查看我回答中的链接,在“returns”下,您将看到三个带标签的对象,x、f和d。它们对应于返回元组中的三个项。您可以访问第一个带标签的“x”在链接的文档中,作为max_x[0]。请注意,它是一个numpy数组,而不是一个简单的浮点。您可以用相同的方法获取numpy数组的元素。例如,max_x[0][0]是(可能是多变量的)最佳点的第一个元素。老实说,我不知道这个特定函数!(scipy.optimize.fminbound)不过,它也很有效:我会记住这一点,以便快速评估最小/最大值,谢谢!