在scipy.optimize.minimize中的NonlinearConstraint中指定黑线



我在scipy.optimize.minimize中指定我自己的Hessian时遇到了麻烦。我创建了一个最小的问题来重复检查,但我也不能让它工作。有人知道是什么问题吗?

下面是我的例子:

import numpy as np 
import jax.numpy as jnp 
import scipy
from scipy.optimize import minimize 
from scipy.optimize import NonlinearConstraint
from jax import grad, jit, vmap, jacrev, hessian

size_overall = 4 
constr_size= size_overall 
x0 = np.dot(2,np.ones((size_overall)))
def cost_func(x):    
return jnp.dot(x,x)
def cost_func_grad(x):   
return jnp.dot(2,x)
def test(x):     
return x-np.ones(constr_size)
def jac_func(x):    
return np.array(jacrev(test)(x0))
def hess_func(x,v): 
temp = hessian(test)(x0)    
temp0 = temp[0]     
for i in range(0,constr_size):  
temp0 = np.concatenate((temp0,temp[i])) 
return temp0
print(hess_func(x0,0)) 
print(hess_func(x0,0).shape)

nonlinear_constraint = NonlinearConstraint(test,np.size(constr_size),np.size(constr_size),jac_func,hess_func)
res2 = minimize(cost_func, x0, method='trust-constr', jac=cost_func_grad,
constraints=[nonlinear_constraint], options={'disp': True})

请参阅我上面的评论。

这似乎解决了这个问题:

def hess_func(x,v): 
temp = hessian(test)(x0)    
temp0 = v[0]*temp[0]
for i in range(1,constr_size):
temp0 = temp0 + v[i]*temp[i]
return temp0
print(hess_func(x0,np.zeros((constr_size)))) 
print(hess_func(x0,np.zeros((constr_size))).shape)

我认为这可能是因为它想要的黑森线的形状与黑森线本身的标准定义不同,H(x,v)实际上是一个和,参见:https://docs.scipy.org/doc/scipy/reference/tutorial/optimize.html#constrained-minimization-of-multivariate-scalar-functions-minimize。

相关内容

  • 没有找到相关文章

最新更新