Powell 方法中的边界 Scipy

Boundary in Powell method Scipy

让我们最小化函数

f =lambda x: (x+1)**2 

在scipy

中使用鲍威尔方法

如果我们使用

scipy.optimize.minimize(f, 1, method='Powell', bounds=None)

return是

   direc: array([[1.]])
     fun: array(0.)
 message: 'Optimization terminated successfully.'
    nfev: 20
     nit: 2
  status: 0
 success: True
       x: array(-1.)

即最小值应该是 -1。如果我们提供边界

scipy.optimize.minimize(f, 1, method='Powell', bounds=[(0,2)])

return又是

   direc: array([[1.]])
     fun: array(0.)
 message: 'Optimization terminated successfully.'
    nfev: 20
     nit: 2
  status: 0
 success: True
       x: array(-1.)

现在错了!正确答案应该是 0。就像不考虑边界一样。我正在使用 scipy '1.4.1' 和 python 3.7.6。 有人知道吗?

使用 scipy 1.4.x Powell 方法无法处理约束和边界,如您所见 here. Updating to scipy 1.5.x, it can handle bounds, see here:

In [11]: scipy.optimize.minimize(f, x0=1.0, method='Powell', bounds=[(0.0,2.0)])
Out[11]:
   direc: array([[1.64428414e-08]])
     fun: array(1.)
 message: 'Optimization terminated successfully.'
    nfev: 103
     nit: 2
  status: 0
 success: True
       x: array([2.44756652e-12])

我想补充一点,我也注意到 Powell 方法倾向于探索越界参数。