我正在尝试简单的实验来学习scipy的SLSQP优化器。
我采用了下面的函数:
def obj(x):
return -1*((x[0]*x[0])+(x[1]*x[1]))
它是雅可比矩阵:
def jacj(x):
return [-2*x[0],-2*x[1]]
它的界限是:
bounds=[(0,1),(0,1)]
一个简单的约束-- x+2*x1<=1:
cons2=({'type':'ineq',
'fun':lambda x: np.array([-(x[0])-2*(x[1])+1]),
'jac':lambda x: np.array([-1.0,-2.0])})
现在我尝试使用initial guess x0=.1,0.01
res=minimize(obj,x0,method='slsqp',jac=jacj,bounds=bounds,
constraints=cons2,options={'maxiter':100,'ftol':0.000001,'eps':1.0e-08})
当我运行它时,我得到的解决方案是: x=1,x1=0和obj=-1
但是,当我以x0=0.001,0.01作为初始猜测时,我得到的解决方案是: x=0、x1=0.5和obj=0.25
为什么它没有在后一次运行中给出最优解决方案?它怎麽工作?
发布于 2019-09-21 02:16:47
最大化平方和函数是非凸的。求解器通常会收敛到局部最优。对于有保证的最优解,您需要使用全局求解器。
请注意,最小化平方和目标更容易:这是凸的。在这种情况下,求解器总是(好吧,除了不可行和数值问题)收敛到全局最优。
https://stackoverflow.com/questions/57777210
复制相似问题