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
y la restricción de desigualdad no lineal
.
Reescriba estas restricciones como
La función auxiliar confuneq
al final de este ejemplo implementa estas desigualdades con la sintaxis correcta.
Función objetivo
Resuelva el problema
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