Main Content

Restricciones de igualdad y desigualdad no lineales

Este ejemplo muestra cómo resolver un problema de optimización con restricciones no lineales. Incluya restricciones no lineales escribiendo una función que calcule tanto el valor de restricción de igualdad como el de desigualdad. Una función de restricción no lineal tiene la sintaxis

[c,ceq] = nonlinconstr(x)

La función c(x) representa la restricción c(x) <= 0. La función ceq(x) representa la restricción ceq(x) = 0.

Nota: Debe hacer que la función de restricción no lineal devuelva tanto c(x) como ceq(x), incluso si solo tiene un tipo de restricción no lineal. Si una restricción no existe, haga que la función devuelva [] para esa restricción.

Restricciones no lineales

Suponga que tiene la restricción de igualdad no lineal

x12+x2=1

y la restricción de desigualdad no lineal

x1x2-10.

Reescriba estas restricciones como

x12+x2-1=0-x1x2-100.

La función auxiliar confuneq al final de este ejemplo implementa estas desigualdades con la sintaxis correcta.

Función objetivo

Resuelva el problema

minxf(x)=ex1(4x12+2x22+4x1x2+2x2+1)

sujeto a las restricciones. La función auxiliar objfun al final de este ejemplo implementa esta función objetivo.

Resolver el problema

Resuelva el problema llamando al solver fmincon. Este solver requiere un punto inicial; utilice el punto x0 = [-1,-1].

x0 = [-1,-1];

El problema no tiene límites ni restricciones lineales, así que establezca estas entradas en [].

A = [];
b = [];
Aeq = [];
beq = [];
lb = [];
ub = [];

Llame al solver.

[x,fval] = fmincon(@objfun,x0,A,b,Aeq,beq,lb,ub,@confuneq)
Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.
x = 1×2

   -0.7529    0.4332

fval = 1.5093

El solver informa de que las restricciones se satisfacen en la solución. Compruebe las restricciones no lineales en la solución.

[c,ceq] = confuneq(x)
c = -9.6739
ceq = 2.0668e-12

c es menor que 0, según lo exigido. ceq es igual a 0 dentro de la tolerancia de restricción predeterminada de 1e-6.

Funciones auxiliares

El siguiente código crea la función auxiliar confuneq.

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

El siguiente código crea la función auxiliar objfun.

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);
end

Temas relacionados