问题描述
是否有任何开箱即用的类似牛顿法的求解器允许输入参数的边界(以及提供的雅可比和黑森表达式)。
我基本上就是在 SciPy 中寻找 "trust-constr"
,除了那个似乎根本不起作用。虽然它接受边界作为参数,但它似乎只是忽略了它们。另请参阅关于此问题的此问题 Scipy: How can I use Bounds with trust-constr?。
似乎 trust-constr 没有考虑边界的问题并不完全是普遍的。最好显示一个具有像 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 是一个明确定义的二次可微函数,该函数太大而无法包含在最小示例中。然而,我们只需要初始点的值即可看到算法的错误行为。)
也稍微改变了界限,我意识到它并没有完全忽略它们。它根据边界选择不同的点,但它不介意跨出边界,这似乎是一个可怕的特征。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)