Python scipy优化没有找到最小值
Python scipy optimization does not find minimum
尝试使用scipy.optimize.minimize
,好像优化失败了。我做了以下事情:
1、objective函数为: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" 只是一个超平面,所以我真的很困惑。有任何想法吗?
替换
def pos(x):
return min(x)
和
def pos(x):
return x
(不等式约束函数可以return一个向量;向量的每个分量都必须满足约束。)
这两个公式在数学上似乎是等价的,但是您的版本中的某些内容破坏了计算。可能是因为SLSQP算法假设约束函数是可微的,而min(x)
是不可微的。
尝试使用scipy.optimize.minimize
,好像优化失败了。我做了以下事情:
1、objective函数为: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" 只是一个超平面,所以我真的很困惑。有任何想法吗?
替换
def pos(x):
return min(x)
和
def pos(x):
return x
(不等式约束函数可以return一个向量;向量的每个分量都必须满足约束。)
这两个公式在数学上似乎是等价的,但是您的版本中的某些内容破坏了计算。可能是因为SLSQP算法假设约束函数是可微的,而min(x)
是不可微的。