是否有任何开箱即用的牛顿求解器允许边界(以及提供的雅可比和粗麻布)

Is there any out of the box newton like solver that allows bounds (and a supplied jacobian and hessian)

是否有开箱即用的牛顿求解器允许输入参数的边界(以及提供的雅可比矩阵和黑森矩阵表达式)。

我基本上就是在 SciPy 中寻找 "trust-constr",除了一个似乎根本不起作用。虽然它接受边界作为参数,但它似乎只是忽略了它们。另请参阅此问题 Scipy: How can I use Bounds with trust-constr? 关于此问题。


看来trust-constr没有考虑到bounds的问题不完全是普遍的。最好显示一个像 rosen 函数这样的标准实例,但我最初的尝试没有奏效。所以这是一个简单的反例

def fake_function(x):
    if x[0]==0.523 and x[1]==1.43:
        return -0.0318285
    print("value at x not available")

def fake_grad(x):
    return [9.21296, -1.98147]

def fake_hess(x):
    return [[-467.451, -98.9485], [-98.9485, 28.6649]]

scipy.optimize.minimize(fake_function, [0.523, 1.43], method='trust-constr', jac=fake_grad, hess=fake_hess,
                                  bounds=[(0.5,0.55),(0.5,2)],
                                  options={'gtol': 1e-5, 'disp': True})

显然这个优化在第一步之后没有意义,因为我在初始点通过它的值定义了函数。然而,这足以表明在第一步中 trust-constr 将忽略边界并要求边界之外的点。 (现在澄清以表明 fake_function 是一个定义良好的二次可微函数,它太大而无法包含在最小示例中。我们只需要初始点的值就可以看到算法运行不正常。)


我也稍微改变了边界,我意识到它并没有完全忽略它们。它根据边界选择不同的点,但它不介意跨出边界,这似乎是一个糟糕的特性。

尽管用于演示问题的(恕我直言)糟糕的设置,请考虑明确执行 feasiblity (docs):

代码

import numpy as np
from scipy.optimize import minimize, Bounds

def fake_function(x):
    print('EVAL @: ', x)

    if x[0]==0.523 and x[1]==1.43:
        return -0.0318285
    print("value at x not available")

def fake_grad(x):
    return [9.21296, -1.98147]

def fake_hess(x):
    return [[-467.451, -98.9485], [-98.9485, 28.6649]]

# !!!
bounds_explicit_feas = Bounds(np.array([0.5, 0.5]), np.array([0.55, 2.0]), keep_feasible = True)
bounds_original = [(0.5,0.55),(0.5,2)]
# !!!    

minimize(fake_function, [0.523, 1.43], method='trust-constr', jac=fake_grad, hess=fake_hess,
                                  bounds=bounds_explicit_feas,
                                  options={'gtol': 1e-5, 'disp': True})

原始边界:输出

EVAL @:  [0.523 1.43 ]
EVAL @:  [0.19537876 1.56399192]
value at x not available

显式可行:输出

EVAL @:  [0.523 1.43 ]
EVAL @:  [0.52256323 1.49080832]
value at x not available