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. <stopping criteria details>
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