Main Content

Restricciones de desigualdad no lineales

Este ejemplo muestra cómo resolver un problema de minimización escalar con restricciones de desigualdad no lineales. El problema consiste en encontrar x para resolver

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

sujeto a las restricciones

x1x2-x1-x2-1.5x1x2-10.

Dado que ninguna de las restricciones es lineal, cree una función, confun.m, que devuelva el valor de ambas restricciones en un vector c. Puesto que el solver fmincon espera que las restricciones estén escritas en formato c(x) 0, escriba la función de restricción de forma que devuelva el siguiente valor:

c(x)=[x1x2-x1-x2+1.5-10-x1x2].

Crear una función objetivo

La función auxiliar objfun es la función objetivo y aparece al final de este ejemplo. Establezca el argumento fun como un identificador de función para la función objfun.

fun = @objfun;

Crear una función de restricción no lineal

Las funciones de restricción no lineales deben devolver dos argumentos: c, la restricción de desigualdad, y ceq, la restricción de igualdad. Dado que este problema no tiene restricción de igualdad, la función auxiliar confun al final de este ejemplo devuelve [] como restricción de igualdad.

Resolver el problema

Establezca el punto inicial en [-1,1].

x0 = [-1,1];

El problema no tiene límites ni restricciones lineales. Establezca esos argumentos en [].

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

Resuelva el problema con fmincon.

[x,fval] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,@confun)
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

   -9.5473    1.0474

fval = 0.0236

Examinar la solución

El mensaje de salida indica que la solución es factible con respecto a las restricciones. Para volver a comprobarlo, evalúe la función de restricción no lineal en la solución. Los valores negativos indican que se cumplen las restricciones.

[c,ceq] = confun(x)
c = 2×1
10-4 ×

   -0.3179
   -0.3063

ceq =

     []

Ambas restricciones no lineales son negativas y cercanas a cero, lo que indica que la solución es factible y que ambas restricciones están activas en la solución.

Funciones auxiliares

Este 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

Este código crea la función auxiliar confun.

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 = [];
end

Temas relacionados