Python 如何在Scipy SLSQP中定义大于但不等于零的约束
我试图最大化形式为Python 如何在Scipy SLSQP中定义大于但不等于零的约束,python,optimization,scipy,Python,Optimization,Scipy,我试图最大化形式为x1/x2的函数。我不希望x2变为零,因此我将约束定义为x2>0。但是Scipy-SLSQP方法没有考虑到这一点,并且说“不等式约束不兼容”。Scipy文档说明所有约束都是非负的,我如何只接受大于零的值 编辑:这是我必须最小化的函数 def f(x): T = x[0] mdot = x[1] Pin = 1.5 # Input power in watts f = -(T**2/(2*mdot*Pin)) return f x2>0
x1/x2
的函数。我不希望x2变为零,因此我将约束定义为x2>0
。但是Scipy-SLSQP方法没有考虑到这一点,并且说“不等式约束不兼容”
。Scipy文档说明所有约束都是非负的,我如何只接受大于零的值
编辑:这是我必须最小化的函数
def f(x):
T = x[0]
mdot = x[1]
Pin = 1.5 # Input power in watts
f = -(T**2/(2*mdot*Pin))
return f
x2>0的我的约束:
def constraint1(x): ## mdot > 0
return x[1]
cons1 = {'type':'ineq', 'fun': constraint1}
res = minimize(f,[0.5,0.025],method = 'SLSQP',constraints = cons1,callback=callbackF)
回调函数仅用于在每次迭代时获取x个值
结果是:
Iter X1 X2 f(X)
1 0.520000 0.000000 19484373451061.960938
2 0.520000 0.000000 19484373451061.960938
Maximum thrust value is 0.5200000003096648
Ideal mass flow rate value is 6.938893903907228e-18
fun: -19484373451061.96
jac: array([-7.49398988e+13, 1.30757417e+21])
message: 'Inequality constraints incompatible'
nfev: 6
nit: 2
njev: 2
status: 4
success: False
x: array([5.2000000e-01, 6.9388939e-18])
正如您所看到的,mdot(x2)立即变为零,我不知道如何修复它?如果我们用边界替换约束,我们可以看到:
from scipy.optimize import minimize
def f(x):
T = x[0]
mdot = x[1]
Pin = 1.5 # Input power in watts
f = -(T**2/(2*mdot*Pin))
return f
res = minimize(f,[0.5,0.025],method = 'l-bfgs-b',bounds=[(0,10000),(0.0001,15)])
res
fun:-333.3333
赫斯苏投资公司:
jac:阵列([-6.66687012e+07,3.33300003e+15])
信息:b'收敛性:投影的范数\梯度\请显示a。我的错,我已经添加了相关部分,现在优化中没有>或<。只有≥ 及≤. (出于理论和实践原因)。向变量添加边界通常会有所帮助(取决于解算器:大多数高级NLP解算器在变量超出其边界时永远不会计算函数。我对SLSQP不够熟悉,不知道它在这方面做了什么,所以我尝试为x2添加边界,如:边界=((0,无),(1e-5,10.325))当x2最大值为10.325时,它仍然会给我同样的错误
fun: -333333333333.3333
hess_inv: <2x2 LbfgsInvHessProduct with dtype=float64>
jac: array([-6.66687012e+07, 3.33300003e+15])
message: b'CONVERGENCE: NORM_OF_PROJECTED_GRADIENT_<=_PGTOL'
nfev: 9
nit: 2
status: 0
success: True
x: array([1.e+04, 1.e-04])