Python scipy优化找不到最小值

时间:2017-03-03 19:33:48

标签: python numpy optimization scipy minimize

尝试使用scipy.optimize.minimize,似乎优化失败了。我做了以下几点:
1.目标函数是:f(x)= x[0]+x[1]+x[2]+x[3]+10
2.约束是:x_i >= 0
3.最初的猜测是:x0 = [1,1,1,1]
非常琐碎的问题,最优解x=[0,0,0,0], f(x)=10 代码:

def pos(x):
    return min(x)
def f1(p):
    return (p[0] + p[1] + p[2] +p[3] + 10)
cons2 = ({'type' : 'ineq', 'fun' : pos})
x0 = np.array([1,1,1,1])
res = opt.minimize(f1, x0,method='SLSQP',constraints=cons2)

我得到以下结果:

 fun: 100543626.59510386
 jac: array([ 0.,  0.,  0.,  0.,  0.])
message: 'Optimization terminated successfully.'
nfev: 54
 nit: 9
njev: 9
status: 0
success: True
   x: array([ 24128556.46553156,  24130378.42917114,  28154390.61929696,
    24130291.0811042 ])

这显然是错误的答案(但成功标志是真的) 我知道有一些假设" f"必须遵循,但在这种情况下" f"只是一个超平面,所以我真的很困惑。有任何想法吗?

1 个答案:

答案 0 :(得分:2)

替换

def pos(x):
    return min(x)

def pos(x):
    return x

(不等式约束函数可以返回一个向量;向量的每个分量都必须满足约束。)

这两个配方在数学上似乎是等价的,但是关于你的版本的某些内容打破了计算。这可能是因为SLSQP算法假设约束函数是可微的,min(x)不可微分。