scipy.optimize.minimize 多变量

scipy.optimize.minimize multivariate

我正在尝试最小化以下函数:

def func(x, *args):
  #""" Objective function """
       return ((2*math.pi*2000*((x[0]/2)**2))+(2**(x[0]/2)*(x[1])*1000))

约束、边界和初始值:

 guess=[4,5]
 d1=3
 d2=10 
 h1=3
 h2=10
 v=50
 cons = ({'type': 'ineq','fun' : lambda x: math.pi*x[1]*((x[0]/2)**2)-v})
 bnds = ((d1, d2), (h1, h2))

和优化乐趣:

scipy.optimize.minimize(func,guess, method='SLSQP',bounds=bnds, 
constraints=cons)

但我一直没有解决方案:

fun: 48281.04745868263
jac: array([ 25783.35449219,   2828.42675781])
message: 'Positive directional derivative for linesearch'
nfev: 12
nit: 7
njev: 3
status: 8
success: False
x: array([ 3.        ,  7.07344142])

请帮助我。

这在数值优化方面看起来非常不稳定。当给出一些界限来保存它时,它可能会起作用。但像 2^n 这样快速增长的东西正在招来麻烦。

现在如果我正确解释你的函数,你可以将它除以 1000;哪个影响较小的值,优化器喜欢。它基本上是 objective.

的缩放

比较你的乐趣:

# ((2*math.pi*2000*((x[0]/2)**2))+(2**(x[0]/2)*(x[1])*1000))
     fun: 48258.32083419573
     jac: array([ 25775.48237605,   2828.42712477])
 message: 'Positive directional derivative for linesearch'
    nfev: 44
     nit: 10
    njev: 6
  status: 8
 success: False
       x: array([ 3.        ,  7.06540634])

与:

# ((2*math.pi*2*((x[0]/2)**2))+(2**(x[0]/2)*(x[1])*1))
     fun: 48.2813631259886
     jac: array([ 25.78346395,   2.82842684])
 message: 'Optimization terminated successfully.'
    nfev: 12
     nit: 3
    njev: 3
  status: 0
 success: True
       x: array([ 3.        ,  7.07355302])

如果需要原图objective,做个后处理乘法!