SciPy SLSQP在约束兼容时声明约束不兼容



我有一个约束优化问题,其中目标函数在输入向量上的一些不等式约束下是凸的。唯一的问题是SLSQP声称约束是不兼容的,这是不真实的。我使用初始向量检查了两个不等式约束,它们都满足。

我知道我的目标函数可能很难优化,但我认为将雅各宾派包括在内会有助于解决这个问题。似乎应该有一些步长参数,我可以在求解器中调整来解决这个问题,但改变SLSQP的公差似乎并不能解决这个问题。

下面是一个问题实例的代码的精简版本(通常,这些变量中的许多可能会发生变化,包括我正在优化的向量的维度(,以及它返回的输出

import numpy as np
from scipy.optimize import minimize
###############################
# Problem Setup
###############################
omega = 2*np.pi/(1E-6)
r = 3.26
T = 1E-6/r
omega_s = 2*np.pi/T
yf = 120.E-6 
analytic_inf = 0.7611241494308488
analytic_inf_v = 43.30005226677565
n_vec = np.arange(1,4)
normalizing_vec = 1-n_vec**2*r**2
fqc_coeff = 7.422483151210897
fqc_mat = n_vec*omega_s/(1-(n_vec*r)**2)
fxd_mat = omega_s*n_vec
epsilon_coeff = 0.019552534524785916 
delta_coeff = 0.2015101389747311
alpha = 160.96016835831352
###############################
# Cost Function, Jacobians & Constraints
###############################
gaussian = lambda a: np.exp(-(fqc_coeff*(fqc_mat.dot(a)+omega_s/(2*np.pi))**2))
costa = lambda a: alpha*(1- gaussian(a))
costd = lambda a: delta_coeff*1/2*np.sum(a**2)
coste = lambda a: epsilon_coeff*1/2*np.sum((n_vec*2*np.pi*a)**2)
cost_f = lambda a: costa(a) + costd(a) + coste(a)
# Constraints
eqa = lambda a: (fqc_mat.dot(a) + omega_s/(2*np.pi))
ineqa = lambda a: eqa(a)*fqc_coeff + 1/np.sqrt(2)
jaca = lambda a: fqc_coeff*fqc_mat
ineqb = lambda a: -eqa(a)*fqc_coeff+ 1/np.sqrt(2)
jacb = lambda a: -fqc_coeff*fqc_mat
cons = [{'type':'ineq','fun':ineqa,'jac':jaca},
{'type':'ineq','fun':ineqb,'jac':jacb}]
# Jacobian, if solver uses it
jacobian = lambda a: alpha*2*fqc_coeff**2*gaussian(a)*fqc_mat.dot(a)*fqc_mat + (
delta_coeff*a) + (
epsilon_coeff*(2*np.pi*n_vec)**2*a)
x0 = np.array([1.17120635, 0.54328102, 0.35740402])
result = minimize(cost_f, x0, method='SLSQP', jac=jacobian, 
constraints=cons, options={'disp':True,'maxiter':1001,'ftol':1E-5})
print(ineqa(result.x))
print(ineqb(result.x))

以及输出

Inequality constraints incompatible    (Exit mode 4)
Current function value: 1.6377594465810514
Iterations: 1
Function evaluations: 1
Gradient evaluations: 1
0.7431425286510408
0.6710710337220541

查看scipy存储库中的fortran代码

IF (mode.EQ.6) THEN
IF (n.EQ.meq) THEN
mode = 4
ENDIF
ENDIF

评论6: SINGULAR MATRIX C IN LSQ SUBPROBLEM似乎LSQ子问题存在问题。我不是这方面的专家,但你可以看看开创性论文";一种用于序列二次规划的软件包"由Dieter Kraft撰写,以了解为什么会出现奇点。

最新更新