Home > OS >  SciPy constraints do not work properly when I try to minimize the objective function
SciPy constraints do not work properly when I try to minimize the objective function

Time:07-24

I have the following simple python code:

from scipy.optimize import minimize

def cons_function(x):

    return x[0] - 1000

def objective(x):
    a = x[0]
    
    return a ** 5

x0 = [0]
cons_dict = [{'type':'ineq', 'fun': cons_function}]
res = minimize(objective, x0, constraints=cons_dict)

print('x: ', res.x)
print('fun: ',res.fun)

And the output is as follows:

x:  [-2.64828354e 12]
fun:  -1.3026339977067573e 62 

But the value of x is supposed to be greater than 1000. And the minimum value of the objective function would be 10e 15.

CodePudding user response:

please check the documentation for the methods that you are using. Depending on the methods of optimization, constraints are used or even ignored. https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html

Note

If not given, chosen to be one of BFGS, L-BFGS-B, SLSQP, depending on whether or not the problem has constraints or bounds.

CodePudding user response:

Your initial guess x0 is not feasible and contradicts your constraint as you can see by checking the return optimization result res:

     fun: -1.3026339977067573e 62
     jac: array([2.45939306e 50])
 message: 'Inequality constraints incompatible'
    nfev: 50
     nit: 16
    njev: 15
  status: 4
 success: False
       x: array([-2.64828354e 12])

You always have to use a feasible initial guess that satisfies all your constraints. Note also that your constraint is a simple bound on the variable, so it's recommended to pass it as a bound instead of the more general constraints:

from scipy.optimize import minimize

def objective(x):
    a = x[0]
    return a ** 5

# 1000 <= x[0] <= None is equivalent to 1000 <= x[0] <= Inf
bounds = [(1000, None)]
x0 = [1002]
res = minimize(objective, x0, bounds=bounds)

print('x: ', res.x)
print('fun: ',res.fun)
  • Related