GCFuncnonlinear.java#

/* 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 com.gurobi.gurobi.*;

public class GCFuncnonlinear {

   private static void printsol(GRBModel m, GRBVar x)
     throws GRBException {

     assert(m.get(GRB.IntAttr.Status) == GRB.OPTIMAL);
     System.out.println("x = " + x.get(GRB.DoubleAttr.X));
     System.out.println("Obj = " + m.get(GRB.DoubleAttr.ObjVal));
   }

   public static void main(String[] args) {
     try {

      // Create environment

      GRBEnv env = new GRBEnv();

      // Create a new model

      GRBModel m = new GRBModel(env);

      // Create variables

      GRBVar x     = m.addVar(-1.0, 4.0, 0.0, GRB.CONTINUOUS, "x");
      GRBVar twox  = m.addVar(-2.0, 8.0, 0.0, GRB.CONTINUOUS, "twox");
      GRBVar sinx  = m.addVar(-1.0, 1.0, 0.0, GRB.CONTINUOUS, "sinx");
      GRBVar cos2x = m.addVar(-1.0, 1.0, 0.0, GRB.CONTINUOUS, "cos2x");
      GRBVar expx  = m.addVar(0.0, GRB.INFINITY, 0.0, GRB.CONTINUOUS, "expx");

      // Set objective

      GRBLinExpr obj = new GRBLinExpr();
      obj.addTerm(1.0, sinx); obj.addTerm(1.0, cos2x); obj.addConstant(1.0);
      m.setObjective(obj, GRB.MINIMIZE);

      // Add linear constraints

      GRBLinExpr expr = new GRBLinExpr();
      expr.addTerm(0.25, expx); expr.addTerm(-1.0, x);
      m.addConstr(expr, GRB.LESS_EQUAL, 0.0, "l1");
      expr = new GRBLinExpr();
      expr.addTerm(2.0, x); expr.addTerm(-1.0, twox);
      m.addConstr(expr, GRB.EQUAL, 0.0, "l2");

      // Add general function constraints
      // sinx = sin(x)
      GRBGenConstr gcf1 = m.addGenConstrSin(x, sinx, "gcf1", null);
      // cos2x = cos(twox)
      GRBGenConstr gcf2 = m.addGenConstrCos(twox, cos2x, "gcf2", null);
      // expx = exp(x)
      GRBGenConstr gcf3 = m.addGenConstrExp(x, expx, "gcf3", null);

   // Approach 1) Set FuncNonlinear parameter

      m.set(GRB.IntParam.FuncNonlinear, 1);

      // Optimize the model and print solution

      m.optimize();
      printsol(m, x);

      // Restore unsolved state and set parameter FuncNonlinear to
      // its default value
      m.reset();
      m.set(GRB.IntParam.FuncNonlinear, 0);

   // Approach 2) Set FuncNonlinear attribute for every
   //             general function constraint

      gcf1.set(GRB.IntAttr.FuncNonlinear, 1);
      gcf2.set(GRB.IntAttr.FuncNonlinear, 1);
      gcf3.set(GRB.IntAttr.FuncNonlinear, 1);

      // Optimize the model and print solution

      m.optimize();
      printsol(m, x);

      // Dispose of model and environment

      m.dispose();
      env.dispose();

    } catch (GRBException e) {
      System.out.println("Error code: " + e.getErrorCode() + ". " +
          e.getMessage());
    }
  }
}