This example shows how to solve a scalar minimization problem with nonlinear inequality constraints. The problem is to find x that solves
| (6-56) |
subject to the constraints
x1x2 – x1 – x2 ≤
–1.5,
x1x2 ≥
–10.
Because neither of the constraints is linear, you cannot pass
the constraints to fmincon at
the command line. Instead you can create a second file, confun.m,
that returns the value at both constraints at the current x in
a vector c. The constrained optimizer, fmincon,
is then invoked. Because fmincon expects the constraints
to be written in the form c(x) ≤ 0, you
must rewrite your constraints in the form
| x1x2 – x1 – x2 +
1.5 ≤ 0, –x1x2 –10 ≤ 0. | (6-57) |
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);
function [c, ceq] = confun(x)
% Nonlinear inequality constraints
c = [1.5 + x(1)*x(2) - x(1) - x(2);
-x(1)*x(2) - 10];
% Nonlinear equality constraints
ceq = [];x0 = [-1,1]; % Make a starting guess at the solution options = optimoptions(@fmincon,'Algorithm','sqp'); [x,fval] = ... fmincon(@objfun,x0,[],[],[],[],[],[],@confun,options);
fmincon produces the solution x with
function value fval:
x,fval
x =
-9.5474 1.0474
fval =
0.0236You can evaluate the constraints at the solution by entering
[c,ceq] = confun(x)
This returns numbers close to zero, such as
c =
1.0e-14 *
-0.6661
0.7105
ceq =
[]Note that both constraint values are, to within a small tolerance,
less than or equal to 0; that is, x satisfies c(x) ≤ 0.