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 para resolver
sujeto a las restricciones
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 , escriba la función de restricción de forma que devuelva el siguiente valor:
.
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