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])