genconstrnl.py#

import gurobipy as gp
from gurobipy import nlfunc


# Formulate and solve the simple nonlinear model

# Minimize y1 + y2
# s.t.     y1 = x2 ^2
#          y2 = sin(2.5 * x1) + x2
#          y1, y2 free
#          -1 <= x1, x2 <= 1

with gp.Env() as env, gp.Model(env=env) as model:
    # Optimization variables
    x1 = model.addVar(lb=-1, ub=1, name="x1")
    x2 = model.addVar(lb=-1, ub=1, name="x2")

    # Auxiliary resultant variables for nonlinear constraints
    y1 = model.addVar(lb=-float("inf"), obj=1.0, name="y1")
    y2 = model.addVar(lb=-float("inf"), obj=1.0, name="y2")

    # First nonlinear constraint y1 = x2 ^2
    model.addGenConstrNL(y1, x2**2, name="univariate_constraint")

    # Second nonlinear constraint y2 = sin(2.5 * x1) + x2
    model.addGenConstrNL(y2, nlfunc.sin(2.5 * x1) + x2, name="multivariate_constraint")

    model.optimize()

    print(f"x1={x1.X}  x2={x2.X} y1={y1.X} y2={y2.X} obj={model.ObjVal}")