Try our new documentation site (beta).
Filter Content By
Version
Text Search
${sidebar_list_label} - Back
Filter by Language
gc_funcnonlinear.py
#!/usr/bin/env python3.11 # Copyright 2024, Gurobi Optimization, LLC # This example considers the following nonconvex nonlinear problem # # minimize sin(x) + cos(2*x) + 1 # subject to 0.25*exp(x) - x <= 0 # -1 <= x <= 4 # # We show you two approaches to solve it as a nonlinear model: # # 1) Set the paramter FuncNonlinear = 1 to handle all general function # constraints as true nonlinear functions. # # 2) Set the attribute FuncNonlinear = 1 for each general function # constraint to handle these as true nonlinear functions. # import gurobipy as gp from gurobipy import GRB def printsol(m, x): print(f"x = {x.X}") print(f"Obj = {m.ObjVal}") try: # Create a new model m = gp.Model() # Create variables x = m.addVar(lb=-1, ub=4, name="x") twox = m.addVar(lb=-2, ub=8, name="2x") sinx = m.addVar(lb=-1, ub=1, name="sinx") cos2x = m.addVar(lb=-1, ub=1, name="cos2x") expx = m.addVar(name="expx") # Set objective m.setObjective(sinx + cos2x + 1, GRB.MINIMIZE) # Add linear constraints lc1 = m.addConstr(0.25 * expx - x <= 0) lc2 = m.addConstr(2.0 * x - twox == 0) # Add general function constraints # sinx = sin(x) gc1 = m.addGenConstrSin(x, sinx, "gc1") # cos2x = cos(twox) gc2 = m.addGenConstrCos(twox, cos2x, "gc2") # expx = exp(x) gc3 = m.addGenConstrExp(x, expx, "gc3") # Approach 1) Set FuncNonlinear parameter m.params.FuncNonlinear = 1 # Optimize the model m.optimize() printsol(m, x) # Restore unsolved state and set parameter FuncNonlinear to # its default value m.reset() m.resetParams() # Approach 2) Set FuncNonlinear attribute for every # general function constraint gc1.funcnonlinear = 1 gc2.funcnonlinear = 1 gc3.funcnonlinear = 1 m.optimize() printsol(m, x) except gp.GurobiError as e: print(f"Error code {e.errno}: {e}") except AttributeError: print("Encountered an attribute error")