Nonlinear Equality and Inequality Constraints

You can include nonlinear constraints by writing a function that computes both equality and inequality constraint values. A nonlinear constraint function has the syntax

[c,ceq] = nonlinconstr(x)

The function c(x) represents the constraint c(x) <= 0. The function ceq(x) represents the constraint ceq(x) = 0.

    Note:   You must have the nonlinear constraint function return both c(x) and ceq(x), even if you have only one type of nonlinear constraint. If a constraint does not exist, have the function return [] for that constraint.

For example, if you have the nonlinear equality constraint x12+x2=1 and the nonlinear inequality constraint x1x2 ≥ –10, rewrite them as

x12+x21=0,x1x2100,

and then solve the problem using the following steps.

Step 1: Write a file objfun.m.

function f = objfun(x)
f = exp(x(1))*(4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+2*x(2)+1);

Step 2: Write a file confuneq.m for the nonlinear constraints.

function [c,ceq] = confuneq(x)
% Nonlinear inequality constraints
c = -x(1)*x(2) - 10;
% Nonlinear equality constraints
ceq = x(1)^2 + x(2) - 1;

Step 3: Invoke constrained optimization routine.

x0 = [-1,1]; % Make a starting guess at the solution
options = optimoptions(@fmincon,'Algorithm','sqp');
[x,fval] = fmincon(@objfun,x0,[],[],[],[],[],[],... 
   @confuneq,options);

After 21 function evaluations, the solution produced is

x,fval
x =
   -0.7529    0.4332
fval =
    1.5093

[c,ceq] = confuneq(x) % Check the constraint values at x

c =
   -9.6739
ceq =
   5.3291e-15

Note that ceq is equal to 0 within the default tolerance on the constraints of 1.0e-006 and that c is less than or equal to 0, as desired.

Related Examples

Was this topic helpful?