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 |
For example, if you have the nonlinear equality constraint $${x}_{1}^{2}+{x}_{2}=1$$ and the nonlinear inequality constraint x_{1}x_{2} ≥ –10, rewrite them as
$$\begin{array}{c}{x}_{1}^{2}+{x}_{2}-1=0,\\ -{x}_{1}{x}_{2}-10\le 0,\end{array}$$
and then solve the problem using the following steps.
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] = confuneq(x) % Nonlinear inequality constraints c = -x(1)*x(2) - 10; % Nonlinear equality constraints ceq = x(1)^2 + x(2) - 1;
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.