当约束兼容时,SciPy SLSQP声称约束不兼容

时间:2018-11-08 15:47:58

标签: python scipy numerical-methods

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

我知道我的目标函数可能难以优化,但是我认为包括所有内容的Jacobian都将有助于解决此问题。似乎应该在求解器中调整一些步长参数以解决此问题,但是改变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

0 个答案:

没有答案