Main Content

La traducción de esta página está obsoleta. Haga clic aquí para ver la última versión en inglés.

Restricciones no lineales

Varios solvers de optimización aceptan restricciones no lineales, incluyendo fmincon, fseminf, fgoalattain, fminimax y los solvers de Global Optimization Toolbox ga (Global Optimization Toolbox), gamultiobj (Global Optimization Toolbox), patternsearch (Global Optimization Toolbox), paretosearch (Global Optimization Toolbox), GlobalSearch (Global Optimization Toolbox) y MultiStart (Global Optimization Toolbox). Las restricciones no lineales le permiten restringir la solución a cualquier región que se pueda describir en términos de funciones suaves.

Las restricciones de desigualdad no lineales tienen el formato c(x) ≤ 0, donde c es un vector de restricciones, un componente para cada restricción. De forma similar, las restricciones de igualdad no lineales tienen el formato ceq(x) = 0.

Nota

Las funciones de restricción no lineales deben devolver tanto c como ceq, la función de desigualdad y la de igualdad, incluso aunque no existan las dos. Devuelva una entrada vacía [] para una restricción no existente.

Por ejemplo, suponga que tiene las siguientes desigualdades como restricciones:

x129+x2241,x2x121.

Escriba estas restricciones en un archivo de función de la siguiente manera:

function [c,ceq] = ellipseparabola(x)
c(1) = (x(1)^2)/9 + (x(2)^2)/4 - 1;
c(2) = x(1)^2 - x(2) - 1;
ceq = [];
end
ellipseparabola devuelve una entrada vacía [] para ceq, la función de restricción de igualdad no lineal. Además, la segunda desigualdad se reescribe en formato ≤ 0.

Minimice la función exp(x(1) + 2*x(2)) sujeta a las restricciones ellipseparabola.

fun = @(x)exp(x(1) + 2*x(2));
nonlcon = @ellipseparabola;
x0 = [0 0];
A = []; % No other constraints
b = [];
Aeq = [];
beq = [];
lb = [];
ub = [];
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)
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 =

   -0.2500   -0.9375

Incluir gradientes en las funciones de restricción

Si proporciona gradientes para c y ceq, el solver puede ejecutarse más rápidamente y obtener resultados más fiables.

Proporcionar un gradiente ofrece otra ventaja. Un solver puede alcanzar un punto x de forma que x sea factible, pero las diferencias finitas alrededor de x siempre conduzcan a un punto no factible. En este caso, un solver puede fallar o detenerse prematuramente. Proporcionar un gradiente permite al solver continuar.

Para incluir información de gradiente, escriba una función condicionalizada de la siguiente manera:

function [c,ceq,gradc,gradceq] = ellipseparabola(x)
c(1) = x(1)^2/9 + x(2)^2/4 - 1;
c(2) = x(1)^2 - x(2) - 1;
ceq = [];

if nargout > 2
    gradc = [2*x(1)/9, 2*x(1); ...
             x(2)/2, -1];
    gradceq = [];
end

Consulte Writing Scalar Objective Functions para obtener información sobre las funciones condicionalizadas. La matriz de gradientes tiene el formato

gradci, j = [∂c(j)/∂xi].

La primera columna de la matriz de gradientes se asocia con c(1) y la segunda columna se asocia con c(2). Este formato de derivada es la traspuesta del formato de matrices jacobianas.

Para que un solver utilice gradientes de restricciones no lineales, indique que existen con optimoptions:

options = optimoptions(@fmincon,'SpecifyConstraintGradient',true);

Asegúrese de pasar la estructura de las opciones al solver:

[x,fval] = fmincon(@myobj,x0,A,b,Aeq,beq,lb,ub, ...
           @ellipseparabola,options)

Si tiene una licencia de Symbolic Math Toolbox™, puede calcular gradientes y matrices hessianas de forma automática, tal y como se describe en Calculate Gradients and Hessians Using Symbolic Math Toolbox.

Funciones de restricción anónimas no lineales

Las funciones de restricción no lineales deben devolver dos salidas. La primera salida corresponde a desigualdades no lineales y la segunda, a igualdades no lineales.

Las funciones anónimas devuelven solo una salida. Entonces, ¿cómo puede escribir una función anónima como una restricción no lineal?

La función deal distribuye múltiples salidas. Por ejemplo, suponga que tiene las desigualdades no lineales

x129+x2241,x2x12-1.

Suponga que tiene la igualdad no lineal

x2=tanh(x1).

Escriba una restricción no lineal de la siguiente manera.

c = @(x)[x(1)^2/9 + x(2)^2/4 - 1;
        x(1)^2 - x(2) - 1];
ceq = @(x)tanh(x(1)) - x(2);
nonlinfcn = @(x)deal(c(x),ceq(x));

Para minimizar la función cosh(x1) + sinh(x2) sujeta a las restricciones en nonlinfcn, utilice fmincon.

obj = @(x)cosh(x(1))+sinh(x(2));
opts = optimoptions(@fmincon,'Algorithm','sqp');
z = fmincon(obj,[0;0],[],[],[],[],[],[],nonlinfcn,opts)
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.
z = 2×1

   -0.6530
   -0.5737

Para comprobar si el punto resultante z satisface bien las restricciones, utilice nonlinfcn.

[cout,ceqout] = nonlinfcn(z)
cout = 2×1

   -0.8704
         0

ceqout = 1.1102e-16

z satisface todas las restricciones dentro del valor predeterminado de la tolerancia de restricción ConstraintTolerance, 1e-6.

Para obtener más información sobre funciones objetivo anónimas, consulte Anonymous Function Objectives.

Consulte también

| | (Global Optimization Toolbox) | (Global Optimization Toolbox) | (Global Optimization Toolbox) | (Global Optimization Toolbox)

Temas relacionados