首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >scipy.optimize.minimize多元

scipy.optimize.minimize多元
EN

Stack Overflow用户
提问于 2017-11-27 13:05:36
回答 1查看 1.8K关注 0票数 0

我试图最小化以下功能:

代码语言:javascript
复制
def func(x, *args):
  #""" Objective function """
       return ((2*math.pi*2000*((x[0]/2)**2))+(2**(x[0]/2)*(x[1])*1000))

的约束、边界和初始值:

代码语言:javascript
复制
 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))

而优化的乐趣:

代码语言:javascript
复制
scipy.optimize.minimize(func,guess, method='SLSQP',bounds=bnds, 
constraints=cons)

但我一直找不到解决办法:

代码语言:javascript
复制
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])

请帮帮我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-27 13:22:43

从数值优化的角度来看,这看起来非常不稳定。当给出一些限制来保存它时,它可能会起作用。但是像2^n这样的快速增长的东西却带来了麻烦。

现在,如果我正确地解释了您的函数,您可以将其除以1000;这在较小的值中产生了效果,这是优化器所喜欢的。这基本上是对目标的一种缩放。

比较一下你的乐趣:

代码语言:javascript
复制
# ((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])

通过以下方式:

代码语言:javascript
复制
# ((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])

如果你需要最初的目标,做一个后处理乘法!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47511683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档