用python中的scipy求解有界非线性极小化

用python中的scipy求解有界非线性极小化,python,optimization,scipy,nonlinear-optimization,minimization,Python,Optimization,Scipy,Nonlinear Optimization,Minimization,试图解决一个简单的单变量非线性极小化问题 from scipy.optimize import minimize import math alpha = 0.05 waiting = 50 mean_period = 50 neighborhood_size = 5 def my_func(w): return -(2/(w+1) + alpha*math.floor(waiting/mean_period))*(1-(2/(w+1) + alpha*math.floor(waiti

试图解决一个简单的单变量非线性极小化问题

from scipy.optimize import minimize
import math

alpha = 0.05
waiting = 50
mean_period = 50
neighborhood_size = 5

def my_func(w):
    return -(2/(w+1) + alpha*math.floor(waiting/mean_period))*(1-(2/(w+1) + alpha*math.floor(waiting/mean_period)))**(neighborhood_size-1)

print minimize(my_func, mean_period, bounds=(2,200))
这让我

ValueError: length of x0 != length of bounds
我输入错了吗?我应该如何格式化它

如果我去掉边界,我得到:

status: 2
  success: False
     njev: 19
     nfev: 69
 hess_inv: array([[1]])
      fun: array([-0.04072531])
        x: array([50])
  message: 'Desired error not necessarily achieved due to precision loss.'
      jac: array([-1386838.30676792])
函数看起来像,因此我需要将解限制在我感兴趣的局部最大值内的边界。

它应该是:

print minimize(my_func, mean_period, bounds=((2,200),))

  status: 0
 success: True
    nfev: 57
     fun: array([-0.08191999])
       x: array([ 12.34003932])
 message: 'CONVERGENCE: NORM_OF_PROJECTED_GRADIENT_<=_PGTOL'
     jac: array([  2.17187379e-06])
     nit: 4
打印最小化(my_func,mean_period,bounds=((2200),)
状态:0
成功:真的
nfev:57
乐趣:数组([-0.08191999])
x:数组([12.34003932])

信息:'收敛:投影梯度的范数,你能试试边界=((2200),)?@ambi,事实上这解决了它。我想我在第一次尝试时就错了。一个快速的反问:来自C语言背景的人很容易从函数签名确定参数的类型。在这种情况下,一个新用户如何知道它接受一个元组而不实际查看源()?正如我在上面的评论中提到的,我来自一个C背景,在这里可以很容易地从函数签名确定参数的类型。在这种情况下,新用户如何知道它需要一个元组而不实际查看源代码()?@George不幸的是,Python中的一个问题是很难看到函数需要什么类型。通常要由文档来明确这一点-在minimize()的文档中,它说边界是一个“序列”-它没有指定元组的原因是因为它实际上可以用于任何iterable,例如,它可以是一个列表。