scipy.optimize.minimize multivariate

时间:2017-11-27 13:05:36

标签: python-3.x optimization scipy minimize

我试图最小化以下功能:

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])

请帮帮我。

1 个答案:

答案 0 :(得分:1)

这在数值优化方面看起来非常不稳定。当给出一些边界来保存它时,它可能会起作用。但像2^n这样快速发展的事情正在呼唤着麻烦。

现在,如果我正确地解释你的功能,你可以将它除以1000;哪个效果更小,优化器喜欢。它基本上是目标的缩放。

比较你的乐趣:

# ((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])

如果您需要原始目标,请进行后处理乘法!