我正在学习用scipy.optimize.minimize
优化一个多变量约束非线性问题,但得到了奇怪的结果。
我的问题:
minimize objfun
objfun x*y
constraints 0<=x<=5, 0<=y<=5, x+y==5
我的代码:
from scipy import optimize
def func(x):
return x[0]*x[1]
bnds=((0,100),(0,5))
cons=({'type':'eq','fun':lambda x:x[0]+x[1]-5})
x0=[0,0]
res= optimize.minimize(func,x0,method='SLSQP',bounds=bnds,constraints=cons)
收到的结果:
status: 0
success: True
njev: 2
nfev: 8
fun: 6.2499999999999991
x: array([ 2.5, 2.5])
message: 'Optimization terminated successfully.'
jac: array([ 2.5, 2.5, 0. ])
nit: 2
我期望乐趣为0或显著接近0,x或y为0
我觉得你的案子很危险。如果你尝试一个非对称的猜测,你就会收敛到正确的解。
只要把
x0=[0,0]
改成其他的,比如x0=[.2,.9]
。编辑:@pv comment后展开。
[x,y]=[2.5,2.5]
是约束函数的局部最大值。在跳转到这个局部最大值之后,算法再次计算最小化目标所需的方向。它是通过计算
[ 2.50000001 2.5 ]
和[ 2.5 2.50000001]
处的值来实现的。它发现这个方向是(-1,-1)
。但是,该方向与约束正交,然后停止。出现这个问题是因为目标和约束相对于
x=y
是对称的,并且我们是从x=y
上的猜测开始的。相关问题 更多 >
编程相关推荐