%% Optimización con restricciones de desigualdad.
% Copyright (c) 2022 G.T.A.S. (Grupo Tratamiento Avanzado de Señal). Universidad de Cantabria.
%
%% Índice:
%%     - Introducción y planteamiento del problema
%%     - Optimización con una restricción de desigualdad
%                 - Definiciones
%                 - Condiciones de Karush-Kuhn-Tucker (KKT)
%                 - Clasificación de los puntos y puntos solución
%                 - Ejemplos
%                 - Ejercicios
%%   - Optimización con varias restricciones de desigualdad
%                 - Definiciones
%                 - Condiciones necesarias de Karush-Kuhn-Tucker (KKT)
%                 - Clasificación de los puntos y puntos solución
%                 - Ejemplos
%                 - Ejercicio
%%   - Métodos numéricos: función fmincon
%                 - Ejemplos
%                 - Ejercicios
%
%
%% Introducción y planteamiento del problema
%
% Determinar el mínimo de una función f(\mathbf x)   (función objetivo) donde la variable independiente \mathbf x está sujeta a restricciones de desigualdad de la forma  h_k(\mathbf x) \leq  0, \ \  k=1,\ldots,K.
% Las funciones f(\mathbf x), \ g_k(\mathbf x) , \ \  k=1,\ldots,K están definidas en un subconjunto abierto D en \mathbb{R}^M:    f(\mathbf x) :  D \subset \mathbb{R}^M \longrightarrow \mathbb{R}, \quad \quad
% g_k(\mathbf x) :  D \subset \mathbb{R}^M \longrightarrow \mathbb{R}, \quad k=1,\ldots K.
% Se supone que todas las funciones f(\mathbf x), \ h_k(\mathbf x), \ \  k=1,\ldots,K son C^1, es decir con derivadas parciales continuas en D.
%
% Notación en formato estandar:
%                 \min \quad f(\mathbf{x}) \\
% \matrix{s.t. \quad h_1(\mathbf x) \leq 0 \cr \vdots \cr \quad \quad h_K(\mathbf x) \leq 0}
%
%
%%
%% Optimización con una restricción de desigualdad
%
%                 \min \quad f(\mathbf{x}) \\
% s.t. \quad h(\mathbf x) \leq 0
%
%% Definiciones
%
% - Puntos factibles:   Son los puntos \mathbf x que cumplen la restricción,  h(\mathbf{x}) \leq 0
%                 Se pueden clasificar en dos tipos:
%                 1) Puntos que no saturan la restricción (ó puntos interiores):     h(\mathbf{x}) < 0
%                 2)  Puntos que saturan la restricción (ó puntos frontera):   h(\mathbf{x}) = 0
% - Puntos irregulares:  Son puntos factibles que saturan la restricción,  h(\mathbf x)=0,  y en los que \nabla h(\mathbf x) =  \mathbf 0
% .
% - Puntos KKT: Son puntos factibles que cumplen las llamadas condiciones de Karush-Kuhn-Tucker (KKT)
%
%% Condiciones de Karush-Kuhn-Tucker (KKT)
%
%                 \left\{
% \matrix{
% \nabla f(\mathbf{x}) +  \mu \nabla h(\mathbf{x}) = \mathbf 0 \cr
% \mu \ h(\mathbf{x}) = 0 \cr
% \mu \geq 0, \cr
% h(\mathbf{x}) \leq 0
% }
%
%         donde \mu es un número real  que se conoce como multiplicador de KKT.
%
% Además, de acuerdo a la clasificación de puntos factibles (puntos interiores y puntos frontera), las condiciones KKT se pueden particularizar para los puntos frontera y para los puntos interiores:
% 1) Puntos KKT interiores: \quad h(\mathbf x) < 0 \ \Leftrightarrow \mu = 0
%                          \Rightarrow
% \left\{
% \matrix{
% \nabla f(\mathbf{x})  = \mathbf 0 \cr
% h(\mathbf{x}) < 0
% }
% 2) Puntos KKT frontera: \quad h(\mathbf x) = 0
%                          \Rightarrow
% \left\{
% \matrix{
% \nabla f(\mathbf{x}) +  \mu \nabla h(\mathbf{x}) = \mathbf 0 \cr
% \mu \geq 0, \cr
% h(\mathbf{x})= 0
% }
%
%% Clasificación de los puntos y puntos solución
%
% D:
% \left\{
% \matrix{
% - \ \textnormal{Puntos factibles}:
% \left\{\matrix{
% - \ \textnormal{Puntos regulares}:
% \left\{\matrix{
% - \ \textnormal{Puntos KKT}^{(*)}\
%
% \cr
% \cr
% - \ \textnormal{Puntos no KKT} \
% }
% \cr
% \cr
% - \ \textnormal{Puntos irregulares}^{(*)} \quad \quad \quad \quad \quad \quad \quad \quad
% }
% \cr
% \cr
% - \ \textnormal{Puntos no factibles} \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad
% }
%
% (*) Si el problema tiene solución, esta pertenece al conjunto de los puntos irregulares o al conjunto de los puntos KKT (interiores o frontera). Normalmente, estos conjuntos contienen un número finito de puntos, o ninguno.
% En algunos casos muy particulares puede haber puntos irregulares que también cumplan las condiciones KKT. De acuerdo a la clasificación anterior, nosotros los consideraremos como puntos irregulares.
% Las condiciones KKT son necesarias, pero no suficientes:  Si \mathbf x^* es solución del problema y es un punto regular, entonces es un punto KKT. Pero puede haber puntos KKT que no sean solución.
%
%
%% Ejemplo 1
%
%                     \min \quad x_1^2+x_2^2 \\
%  s.t. \quad x_1 + x_2 \geq 1
%
% Solución:
% D = \mathbb{R}^2.
% En primer lugar se escribe el problema en la forma estandar:
%                     \min \quad x_1^2+x_2^2 \\
%  s.t. \quad 1-x_1-x_2 \leq 0
% Por tanto,   f(\mathbf x) = x_1^2 + x_2^2, \quad \quad
% h(\mathbf x) = 1 - x_1 - x_2
% Sin la restricción, el mínimo de f(\mathbf x) estaría en  \mathbf x = (0, 0). Pero este punto no es factible porque no cumple la restricción h(\mathbf x) \leq 0
%
% Puntos irregulares:
% \nabla h(\mathbf x) =\left[\matrix{
% -1 \cr
% -1
% }\right]. Por tanto, no hay puntos irregulares.
%
% Puntos KKT:
% 1) Puntos KKT interiores:
%  \left\{
% \matrix{
% \nabla f(\mathbf{x})  = \mathbf 0 \cr
% h(\mathbf{x}) < 0
% } \quad
% \Rightarrow      \left\{ \matrix{2 x_1 = 0 \cr 2 x_2 = 0 \cr 1-x_1 - x_2  < 0}
% La solución para las dos ecuaciones es \mathbf x = (0, 0), que no cumple la tercera condición.
% Por tanto, no hay puntos KKT interiores.
%
% 2) Puntos KKT frontera:
%  \left\{
% \matrix{
% \nabla f(\mathbf{x}) +  \mu \nabla h(\mathbf{x}) = \mathbf 0 \cr
% h(\mathbf{x})= 0 \cr
% \mu^* \geq 0
% } \quad \Rightarrow    \left\{ \matrix{2 x_1 - \mu = 0 \cr 2 x_2 - \mu  = 0 \cr 1-x_1 - x_2  = 0 \cr \mu \geq 0}
% Las tres primeras ecuaciones constituyen un sistema lineal,  \mathbf A \mathbf y = \mathbf b, donde
% \mathbf A = \left( \matrix{
% 2 & 0 & -1 \cr
% 0 & 2 & -1 \cr
% -1 & -1 & 0
% } \right ) ,  \quad \quad
% \mathbf y = \left( \matrix{x_1 \cr x_2 \cr \mu} \right ) ,  \quad \quad
% \mathbf b = \left( \matrix{0 \cr 0 \cr -1} \right )

% Resuelve el sistema de ecuaciones
A=[2 0 -1;0 2 -1; -1 -1 0]; b=[0 0 -1]';
disp(['det A = ',num2str(det(A))])
y = A\b;
disp(['solución: ',num2str(y')])

% Por tanto,  \mathbf x^* = [1/2, \ 1/2]  es el único punto KKT. Es un punto frontera.
% Gráficamente se ve que es el mínimo global:

% Representa f(x)
funcion = @(x1,x2) x1.^2 + x2.^2;
region = [-1 1 -1 1];
fcontour(funcion, region, 'LevelStep', 0.04)
xlabel('x_1'); ylabel('x_2')
colorbar

% % % Representa h(x)
hold on
restriccion = @(x1,x2) 1 - x1 - x2;
fimplicit(restriccion, region,'r')
title('f(x), h(x)=0')
hold off

%
%
%% Ejemplo 2
%
%                     \min \quad x_1+x_2 \\
%  s.t. \quad (x_1-1)^2+x_2^2 -1  \leq 0
%
% Solución:
% D = \mathbb{R}^2.
% Ya está en forma estandar.
%
% Puntos irregulares:
% \nabla h(\mathbf x) =\left[\matrix{
% 2(x_1-1) \cr
% 2 x_2
% }\right] = \mathbf 0 en \mathbf x = (1,0), pero no es un punto frontera h(\mathbf x) \neq 0. Por tanto, no hay puntos irregulares.
%
% Puntos KKT:
% 1) Puntos KKT interiores:
%  \left\{
% \matrix{
% \nabla f(\mathbf{x})  = \mathbf 0 \cr
% h(\mathbf{x}) < 0
% } \quad
% \Rightarrow      \left\{ \matrix{
% 1 = 0 \cr
% 1 = 0 \cr
% (x_1-1)^2+x_2^2 -1  < 0
% }
% Por tanto, no hay puntos KKT interiores
%
% 1) Puntos KKT frontera:
%  \left\{
% \matrix{
% \nabla f(\mathbf{x}) +  \mu \nabla h(\mathbf{x}) = \mathbf 0 \cr
% h(\mathbf{x})= 0 \cr
% \mu \geq 0
% } \quad \Rightarrow    \left\{ \matrix{
% 1 + \mu 2 x_1 - 2 \mu= 0 \cr
% 1 + \mu 2 x_2 = 0 \cr
% (x_1-1)^2 + x_2^2-1  = 0 \cr
% \mu \geq 0
% }
%
% Las tres primeras ecuaciones constituyen un sistema de ecuaciones no lineales con dos soluciones:     \mathbf x = (0.293, -0.707) con \mu = 0.707  y  \mathbf x = (1.7071, 0.707) con \mu = -0.707

sistema = @(y)[1+2*y(1)*y(3)-2*y(3), 1+ 2*y(2)*y(3), (y(1)-1)^2 + y(2)^2-1];

y0=[0,0,0];
y = fsolve(sistema,y0);
disp(['solución: ',num2str(y)])
disp(['valor de las ecs del sistema en la solución: ',num2str(sistema(y))])

y0=[1,1,1];
y = fsolve(sistema,y0);
disp(['solución: ',num2str(y)])
disp(['valor de las ecs del sistema en la solución: ',num2str(sistema(y))])

%
% De ellos, sólo el primer punto cumple la última condición. Por tanto este es el único punto KKT frontera.
% Gráficamente se ve que el primer punto \mathbf x = (0.293, -0.707) es el mínimo, mientras que \mathbf x = (1.7071, 0.707) es el máximo del problema:

% Representa f(x)
funcion = @(x1,x2) x1+x2;
region = [-2 2 -2 2];
fcontour(funcion, region, 'LevelStep', 0.04)
xlabel('x_1'); ylabel('x_2')
colorbar

% Representa h(x)
hold on
restriccion = @(x1,x2) (x1-1).^2 + x2.^2 - 1;
fimplicit(restriccion, region,'r')
title('f(x), h(x)=0')
hold off

%
%
%% Ejemplo 3
%
%                     \min \quad x_1^2+x_2^2 \\
%  s.t. \quad -(x_1-1)^3+x_2^2  \leq 0
%
% Solución:
% D = \mathbb{R}^2.
% Ya está en forma estandar.
%
% Puntos irregulares:
% \nabla h(\mathbf x) =\left[\matrix{
% -3(x_1-1)^2 \cr
% 2 x_2
% }\right] . Por tanto el punto \mathbf x = (1,0) es irregular ya que h(\mathbf x) = 0 y \nabla h(\mathbf x) = \mathbf 0.
%
% Puntos KKT:
% 1)  Puntos KKT interiores:
% \left\{
% \matrix{
% \nabla f(\mathbf{x})  = \mathbf 0 \cr
% h(\mathbf{x}) < 0
% } \quad
% \Rightarrow      \left\{ \matrix{
% 2x_1 = 0 \cr
% 2x_2 = 0 \cr
% -(x_1-1)^3+x_2^2  < 0
% }
% No hay puntos KKT interiores.
%
% 1)  Puntos KKT frontera:
%  \left\{
% \matrix{
% \nabla f(\mathbf{x}) +  \mu \nabla h(\mathbf{x}) = \mathbf 0 \cr
% h(\mathbf{x})= 0 \cr
% \mu \geq 0
% } \quad \Rightarrow    \left\{ \matrix{
% 2 x_1 - 3 \mu (x_1-1)^2 = 0 \cr
% 2 x_2 + 2 \mu x_2 = 0 \cr
% -(x_1-1)^3 + x_2^2  = 0 \cr
% \mu \geq 0
% }
% Es fácil comprobar que no se cumple: de la segunda ecuación, teniendo en cuenta la última condición, se tiene que x_2 = 0. Considerando la tercera ecuación, se tiene que  x_1 = 1. Entonces, la primera ecuación es una contradicción. ôr tanto, no hay puntos KKT frontera.
%
% Gráficamente se ve que la solución es el punto irregular \mathbf x = (1,0):

% Representa f(x)
funcion = @(x1,x2) x1.^2 + x2.^2;
region = [-2 2 -2 2];
fcontour(funcion, region, 'LevelStep', 0.05)
xlabel('x_1'); ylabel('x_2')
colorbar

% Representa h(x)
hold on
restriccion = @(x1,x2) -(x1-1).^3 + x2.^2;
fimplicit(restriccion, region,'r')
title('f(x), h(x)=0')
hold off

%
%
%% Ejemplo 4
%
%                     \min \quad x_1^2+x_2 \\
%  s.t. \quad x_1+x_2  \leq 0
%
% Solución:
% D = \mathbb{R}^2.
% Ya está en forma estandar.
%
% Puntos irregulares:
% \nabla h(\mathbf x) =\left[\matrix{
% 1 \cr
% 1
% }\right] . Por tanto, no hay puntos irregulares.
%
% Puntos KKT:
% 1) Puntos KKT interiores:
% \left\{
% \matrix{
% \nabla f(\mathbf{x})  = \mathbf 0 \cr
% h(\mathbf{x}) < 0
% } \quad
% \Rightarrow      \left\{ \matrix{
% 2x_1 = 0 \cr
% 1 = 0 \cr
% x_1 + x_2  < 0
% }
% Por tanto, no hay puntos KKT interiores.
%
% 1) Puntos KKT frontera:
%  \left\{
% \matrix{
% \nabla f(\mathbf{x}) +  \mu \nabla h(\mathbf{x}) = \mathbf 0 \cr
% h(\mathbf{x})= 0 \cr
% \mu \geq 0
% } \quad \Rightarrow    \left\{ \matrix{
% 2 x_1 + \mu = 0 \cr
% 1 + \mu = 0 \cr
% x_1 + x_2  = 0 \cr
% \mu \geq 0
% }
% Las condiciones segunda y cuarta son incompatibles, luego no hay puntos KKT frontera.
%
% Gráficamente se ve que el problema no tiene mínimo. La función objetivo se hace infinitamente pequeña cuando x_1=0 y x_2 \rightarrow \infty :

% Representa f(x)
funcion = @(x1,x2) x1.^2 + x2;
region = [-3 3 -3 3];
fcontour(funcion, region, 'LevelStep', 0.1)
xlabel('x_1'); ylabel('x_2')
colorbar

% Representa h(x)
hold on
restriccion = @(x1,x2) x1 + x2;
fimplicit(restriccion, region,'r')
title('f(x), h(x)=0')
hold off

%
%
%
%% Ejemplo 5
%
% Considere los puntos de la esfera (sólido esférico) de radio unidad centrada en el origen, y sea \mathbf p = (p_1,p_2,p_3) un punto en el espacio dado. Determine el punto de la esfera más cercano a \mathbf p.
%
%  Solución:
% Puntos de la esfera:   x_1^2+x_2^2+x_3^2 \leq 1
% Distancia al punto \mathbf p:  \sqrt{(x_1-p_1)^2+(x_2-p_2)^2+(x_3-p_3)^2}
% D =  \mathbb{R}^3
% El problema de optimización:
%                     \min \quad  (x_1-p_1)^2+(x_2-p_2)^2 + (x_3-p_3)^2 \\
%  s.t. \quad x_1^2+x_2^2+x_3^2 \leq 1
%
% Por tanto,   f(\mathbf x) = (x_1-p_1)^2+(x_2-p_2)^2+(x_3-p_3)^2 , \quad \quad
% h(\mathbf x) = x_1^2+x_2^2+x_3^2 - 1
%
% Puntos irregulares:
%  \nabla h(\mathbf x) =\left[ \matrix{
% 2 x_1 \cr
% 2 x_2 \cr
% 2 x_3
% } \right]
% = \mathbf 0 \ solo se cumple en \mathbf x = \mathbf 0, pero h(\mathbf 0) \neq 0. Por tanto, no hay puntos irregulares.
%
% Puntos KKT:
% 1) Puntos KKT interiores:
%   \left\{
% \matrix{\nabla f(\mathbf x) = \mathbf 0 \cr
% h(\mathbf x) < 0}
% \quad \Rightarrow \quad  \left\{ \matrix{
% 2(x_1-p_1) = 0 \cr
% 2(x_2-p_2) = 0 \cr
% 2(x_3-p_3) = 0 \cr
% x_1^2 + x_2^2 + x_3^2 < 1}
% La solución de las tres primeras ecuaciones es \mathbf x = \mathbf p. Sustituyendolo en la ultima condición se tiene || \mathbf p ||^2 < 1.
% Por tanto, si  || \mathbf p ||^2 < 1, el punto \mathbf x = \mathbf p es un punto KKT interior. En caso contrario, || \mathbf p ||^2 \geq 1, no hay puntos KKT interiores.
% Interpretación geométrica:  Si || \mathbf p ||^2 < 1, entonces \mathbf p es un punto interior de la esfera y la solución es él mismo, \mathbf x = \mathbf p.
%
% 2) Puntos KKT frontera:
%  \left\{
% \matrix{
% \nabla f(\mathbf{x}) +  \mu \nabla h(\mathbf{x}) = \mathbf 0 \cr
% h(\mathbf{x})= 0 \cr
% \mu \geq 0
% } \quad \Rightarrow \left\{ \matrix{
% 2(x_1-p_1) + \mu 2 x_1 = 0 \cr
% 2(x_2-p_2) + \mu 2 x_2 = 0 \cr
% 2(x_3-p_3) + \mu 2 x_3 = 0 \cr
% x_1^2 + x_2^2 + x_3^2 = 1 \cr
% \mu \geq 0}
% Las tres primeras ecuaciones se pueden escribir así (teniendo en cuenta que \mu \neq -1):
%       \left\{ \matrix{
% x_1 = \frac{p_1}{1+\mu} \cr
% x_2 = \frac{p_2}{1+\mu} \cr
% x_3 = \frac{p_3}{1+\mu}}
% Sustituyendolas en la cuarta ecuación, se tiene,  p_1^2+p_2^2+p_3^2 = (1+\mu)^2 \ \Rightarrow \ 1+\mu  = \pm ||\mathbf p ||.
% Imponiendo la cuarta condición, \mu  =  \pm ||\mathbf p ||-1 \geq 0. Y esto sólo se cumple (con signo positivo) si ||\mathbf p || \geq 1.
% Por tanto, si se cumple ||\mathbf p || \geq 1, hay un punto KKT frontera con coordenadas \mathbf x = \frac{\mathbf p}{||\mathbf p ||}.
% En caso contrario no hay puntos KKT frontera.
%
% Interpretación geométrica:  Si || \mathbf p ||^2 \geq 1,  entonce \mathbf p está en la superficie de la esfera o fuera de ella. Por tanto la solución tiene que ser un punto de la superficie.
%
% A continuación se comprueba un caso particular resolviendo numéricamente el sistema formado por las cuatro ecuaciones.

R=1;
p=[1,1.5,-1];
sistema = @(y)[2*(y(1)-p(1))+2*y(1)*y(4) , 2*(y(2)-p(2))+2*y(2)*y(4) , 2*(y(3)-p(3))+2*y(3)*y(4) ,y(1)^2+y(2)^2+y(3)^2-R^2];
y0=[0,0,0,0];
y = fsolve(sistema,y0);
disp(['solución: ',num2str(y)])
disp(['valor del sistema de ecuaciones en la solución: ',num2str(sistema(y))])

% El sistema tiene dos soluciones que corresponden al punto de la esfera más cercano y al más lejano, pero en este último \mu < 0 por lo que no se cumple la última condición. Ver que fsolve converge a una de las dos soluciones en función del puntos semilla elegido y0.
%
%
%% Ejercicio 1
%
% Considere el siguiente problema:
%                     \min \quad x_1^2+x_2^2 \\
%  s.t. \quad 1+x_1+x_2 \geq 0
% Determine los puntos irregulares
% Determine los puntos KKT y los multiplicadores correspondientes
% Determine el punto solución
% Compruebe la solución gráficamente
%
%% Ejercicio 2
%
% Considere el siguiente problema:
%                     \min \quad x_2^2-x_1 \\
%  s.t. \quad x_1^2-x_2  \leq 0
% Determine los puntos irregulares
% Determine los puntos KKT y los multiplicadores correspondientes
% Determine el punto solución
% Compruebe la solución gráficamente
%
%
%% Optimización con varias restricciones de desigualdad
%
%                 \min \quad f(\mathbf{x}) \\
% \matrix{s.t. \quad h_1(\mathbf x) \leq 0 \cr \vdots \cr \quad \quad h_K(\mathbf x) \leq 0}
%
%% Definiciones:
%
% - Puntos factibles:  Son puntos que cumplen las restricciones,  h_1(\mathbf{x}) \leq 0, \  \ldots, \quad h_K(\mathbf{x}) \leq 0
%                 Para cada restricción de desigualdad, los puntos factibles se pueden clasificar en dos tipos:
%                 -   Puntos que saturan la restricción (ó puntos frontera):      h_k(\mathbf{x}) = 0
%                 -   Puntos que no saturan la restricción (ó puntos interiores):     h_k(\mathbf{x}) < 0
%
%                 Entonces los puntos factibles se pueden clasificar en distintos grupos atendiendo a cuales son las restricciones que saturan.
%                 Por ejemplo, si el problema tiene K=2 restricciones de desigualdad, los puntos interiores se pueden clasificar en 2^K = 4 tipos:
%                 1) Puntos interiores para ambas restricciones:  h_1(\mathbf{x}) < 0, \ h_2(\mathbf{x}) < 0
%                 2) Puntos frontera para ambas restricciones:  h_1(\mathbf{x}) = 0, \ h_2(\mathbf{x}) = 0
%                 3) Puntos frontera para la primera restricción e interiores para la segunda:  h_1(\mathbf{x}) = 0, \ h_2(\mathbf{x}) < 0
%                 4) Puntos interiores para la primera restricción y frontera para la segunda:  h_1(\mathbf{x}) < 0, \ h_2(\mathbf{x}) = 0
%
% - Puntos irregulares:  Son puntos factibles que saturan alguna restricción y que cumplen una de estas posibilidades:
% El punto satura una única restricción, y el gradiente de la función asociada a la restricción saturada, evaluado en el punto, es cero.
% El punto satura más de una restricción, y los gradientes de las funciones asociadas a las restricciones saturadas, evaluados en el punto, son vectores linealmente dependientes.
%
% - Puntos KKT: Son puntos que cumplen las llamadas condiciones de Karush-Kuhn-Tucker (KKT)
%
%% Condiciones de Karush-Kuhn-Tucker (KKT)
%
%                 \left\{
% \matrix{
% \nabla f(\mathbf{x}) + \sum_{k=1}^K \mu_k  \nabla h_k(\mathbf{x}) = \mathbf 0 \cr
% \mu_k  \ h_k(\mathbf{x}) = 0, \quad k=1,\ldots,K \cr
% \mu_k \geq 0, \quad k=1,\ldots,K \cr
% h_k(\mathbf{x}) \leq 0, \quad k=1,\ldots,K
% }
% donde \left \{\mu_1, \ldots, \mu_K \right\} son números reales conocidos como multiplicadores de KKT. Cada uno de ellos está asociado a una restricción.
% De acuerdo a la clasificación de puntos factibles (en puntos interiores y puntos frontera) para cada restricción, las condiciones KKT relativas a una restricción se pueden particularizar así:
%  -   Si \mathbf x es un punto interior para la restricción k:  \quad h_k(\mathbf x) < 0 \ \Leftrightarrow \mu_k = 0
%  -   Si \mathbf x es un puntofrontera para la restricción k:  \quad h_k(\mathbf x) = 0
%
% Por ejemplo, en el caso de K=2 restricciones, las condiciones KKT para los 2^K=4 tipos de puntos factibles son:
%
% 1) Puntos interiores para ambar restricciones: \quad h_1(\mathbf x), h_2(\mathbf x) < 0 \  \Leftrightarrow \ \mu_1, \mu_2  = 0,
%                          \Rightarrow
% \left\{
% \matrix{
% \nabla f(\mathbf{x})  = \mathbf 0 \cr
% h_1(\mathbf{x}) < 0 \cr
% h_2(\mathbf{x}) < 0
% }
%  2) Puntos frontera para ambas restricciones:  h_1(\mathbf{x}) = 0, \ h_2(\mathbf{x}) = 0
%                          \Rightarrow
% \left\{
% \matrix{
% \nabla f(\mathbf{x})  + \mu_1 \nabla h_1(\mathbf x) + \mu_2 \nabla h_2(\mathbf x) = \mathbf 0 \cr
% h_1(\mathbf{x}) = 0 \cr
% h_2(\mathbf{x}) = 0 \cr
% \mu_1 \geq 0 \cr
% \mu_2 \geq 0
% }
% 3) Puntos frontera para la primera restricción e interiores para la segunda:  \quad h_1(\mathbf x) = 0, \ \ h_2(\mathbf x) < 0 \quad   \Leftrightarrow \quad \mu_2=0
%                                    \Rightarrow
% \left\{
% \matrix{
% \nabla f(\mathbf{x})  + \mu_1 \nabla h_1(\mathbf x)= \mathbf 0 \cr
% h_1(\mathbf{x}) = 0 \cr
% h_2(\mathbf{x}) < 0 \cr
% \mu_1 \geq 0
% }
%  4) Puntos interiores para la primera restricción y frontera para la segunda:  \quad h_1(\mathbf x) < 0, \ \ h_2(\mathbf x) = 0 \quad   \Leftrightarrow \quad \mu_1=0
%                                    \Rightarrow
% \left\{
% \matrix{
% \nabla f(\mathbf{x})  + \mu_2 \nabla h_2(\mathbf x)= \mathbf 0 \cr
% h_1(\mathbf{x}) < 0 \cr
% h_2(\mathbf{x}) = 0 \cr
% \mu_2 \geq 0
% }
%
%% Clasificación de los puntos:
%
% D:
% \left\{
% \matrix{
% - \ \textnormal{Puntos factibles}:
% \left\{\matrix{
% - \ \textnormal{Puntos regulares}:
% \left\{\matrix{
% - \ \textnormal{Puntos KKT}^{(*)}\
%
% \cr
% \cr
% - \ \textnormal{Puntos no KKT} \
% }
% \cr
% \cr
% - \ \textnormal{Puntos irregulares}^{(*)} \quad \quad \quad \quad \quad \quad \quad \quad
% }
% \cr
% \cr
% - \ \textnormal{Puntos no factibles} \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad
% }
%
% (*) Si el problema tiene solución, esta pertenece al conjunto de los puntos irregulares o al conjunto de los puntos KKT. Normalmente, estos conjuntos contienen un número finito de puntos, o ninguno.
% En algunos casos muy particulares puede haber puntos irregulares que también cumplan las condiciones KKT. De acuerdo a la clasificación anterior, nosotros los consideraremos como puntos irregulares.
% Las condiciones KKT son necesarias, pero no suficientes:  Si \mathbf x^* es solución del problema y es un punto regular, entonces es un punto KKT. Pero puede haber puntos KKT que no sean solución.
%
%
%% Ejemplo 6
%
%                     \min \quad  x_1^2  + x_2^2  - 14 x_1 -6 x_2  \\
%  \quad s.t. \quad x_1 + x_2 \leq 2 \\
% \quad \quad \quad x_1+2x_2  \leq 3
% Solución:
% D = \mathbb{R}^2.
% f(\mathbf x) =
% x_1^2  + x_2^2  - 14 x_1 -6 x_2 , \quad
% h_1(\mathbf x) = x_1 + x_2 - 2 , \quad
% h_2(\mathbf x) = x_1 + 2 x_2 - 3
%
% Puntos irregulares:
% 1)   h_1(\mathbf x) = 0, \ h_2(\mathbf x) < 0
% \nabla h_1(\mathbf x) = (1, 1) \neq \mathbf 0,  por tanto no hay puntos irregulares entre los puntos que son frontera para la primera restricción e interiores para la segunda.
%
% 2)   h_1(\mathbf x) < 0, \ h_2(\mathbf x) = 0
% \nabla h_2(\mathbf x) = (1, 2) \neq \mathbf 0,  por tanto no hay puntos irregulares entre los puntos que son interiores para la primera restricción y frontera para la segunda.
%
% 3)   h_1(\mathbf x) = 0, h_2(\mathbf x) = 0
% \nabla h_1(\mathbf x) = (1, 1), \quad
%  \nabla h_2(\mathbf x) = (1,2)  son linealmente independientes. Por tanto, no hay puntos irregulares que saturan ambas restricciones.
%
% Puntos KKT:
% 1)   h_1(\mathbf x), h_2(\mathbf x) < 0 \ \Rightarrow \ \mu_1, \mu_2  = 0
%                          \left\{
% \matrix{
% \nabla f(\mathbf{x})  = \mathbf 0 \cr
% h_1(\mathbf{x}) < 0 \cr
% h_2(\mathbf{x}) < 0
% }    \Rightarrow
% \left\{
% \matrix{
% 2 x_1 - 14 = 0 \cr
% 2 x_2 - 6 = 0 \cr
% x_1 + x_2 - 2 < 0 \cr
% x_1 + 2 x_2 - 3 < 0
% }
% Las dos primeras ecuaciones forma un sistema lineal con una única solución,  \mathbf x = (7, 3), pero no cumple las dos últimas condiciones.
% No hay puntos KKT interiores a ambas restricciones.
%
% 2)   h_1(\mathbf x)=0, \ \ h_2(\mathbf x) = 0
%                          \left\{
% \matrix{
% \nabla f(\mathbf{x})  + \mu_1  \nabla h_1(\mathbf x) + \mu_2 \nabla h_2(\mathbf x) = \mathbf 0 \cr
% h_1(\mathbf{x}) = 0 \cr
% h_2(\mathbf{x}) = 0 \cr
% \mu_1 \geq 0 \cr
% \mu_2 \geq 0
% }       \Rightarrow
% \left\{
% \matrix{
% 2 x_1 -14  + \mu_1 + \mu_2 =  0 \cr
% 2 x_2 - 6  + \mu_1 + 2 \mu_2 =  0 \cr
% x_1+x_2-2 = 0 \cr
% x_1+2 x_2 -3 = 0 \cr
% \mu_1 \geq 0 \cr
% \mu_2 \geq 0
% }
% Las 4 primeras ecuaciones forman un sistema lineal con una única solución:

% Resuelve el sistema de ecuaciones
A=[ 2  0  1  1 ;...
    0  2  1  2 ;...
    1  1  0  0 ;...
    1  2  0  0] ;
b=[14 6 2 3]';
y = A\b;

disp(['solución: ',num2str(y')])

% \mathbf x = (1, 1) con \mu_1 =20, \ \mu_2=-8 .
% Como no se cumple la última condición se concluye que no hay puntos KKT que sean frontera para ambas restricciones.
%
% 3)\quad h_1(\mathbf x) = 0, \ \ h_2(\mathbf x) < 0 \quad  \Rightarrow \mu_2=0
%                                    \left\{
% \matrix{
% \nabla f(\mathbf{x})  + \mu_1 \nabla h_1(\mathbf x)= \mathbf 0 \cr
% h_1(\mathbf{x}) = 0 \cr
% h_2(\mathbf{x}) < 0 \cr
% \mu_1 \geq 0
% }         \Rightarrow \quad
% \left\{
% \matrix{
% 2 x_1 -14+\mu_1= 0 \cr
% 2 x_2 -6+\mu_1= 0 \cr
% x_1+x_2-2 = 0 \cr
% x_1+2 x_2 -3 < 0 \cr
% \mu_1 \geq 0
% }
% Las 3 primeras ecuaciones constituyen un sistema lineal con una única solución:

% Resuelve el sistema de ecuaciones
A=[ 2  0  1 ;...
    0  2  1 ;...
    1  1  0 ];
b=[14 6 2]';
y = A\b;

disp(['solución: ',num2str(y')])

% \mathbf x = (3, -1) con \mu_1 =8 . Que cumple el resto de condiciones. Por tanto, este es un punto KKT.
%
% 4)  h_1(\mathbf x) < 0, \ \ h_2(\mathbf x) = 0 \quad  \Rightarrow \mu_1=0
%                                    \left\{
% \matrix{
% \nabla f(\mathbf{x})  + \mu_2 \nabla h_2(\mathbf x)= \mathbf 0 \cr
% h_1(\mathbf{x}) < 0 \cr
% h_2(\mathbf{x}) = 0 \cr
% \mu_2 \geq 0
% }   \Rightarrow \quad
% \left\{
% \matrix{
% 2 x_1 - 14 + \mu_2=  0 \cr
% 2 x_2 - 6 + 2 \mu_2=  0 \cr
% x_1+x_2-2 < 0 \cr
% x_1+2x_2-3 = 0 \cr
% \mu_2 \geq 0
% }
% Las condiciones 1, 2 y 4 constituyen un sistema lineal de ecuaciones con una única solución:

% Resuelve el sistema de ecuaciones
A=[ 2  0  1 ;...
    0  2  2 ;...
    1  2  0 ];
b=[14 6 3]';
y = A\b;
disp(['solución: ',num2str(y')])

% \mathbf x = (5, -1) con \mu_1 = 4 . Que no cumple la tercera condición. Por tanto, no hay puntos KKT interiores para la primera restricción y frontera para la segunda.
%
% La conclusión final es que el único punto KKT es \mathbf x = (3, -1).
%
% Graficamente se comprueba que es la solución del problema:

funcion = @(x1,x2) x1.^2 + x2.^2 - 14*x1 - 6*x2;
restriccion1 = @(x1,x2) x1 + x2 -2;
restriccion2 = @(x1,x2) x1 + 2*x2 - 3;
region = [-5 5 -5 5];

fcontour(funcion, region, 'LevelStep', 1.0)
colorbar
xlabel('x_1'); ylabel('x_2')

hold on
fimplicit(restriccion1, region,'r')
fimplicit(restriccion2, region,'r')
title('f(x), h_1(x)=0, h_2(x)=0')
hold off

%
%
%% Ejemplo 7
%
% Dos móviles se mueven en el plano XY, con las siguientes ecuaciones de movimiento:
% Movil 1:   x_1(t) = 2 t - 1, \quad y_1(t) = t^2-1.
% Movil 2:   x_2(t) = -t^2, \quad y_2(t) = t^2-t+1
% donde t  denota el tiempo.
% Determine en qué instante han estado más próximos durante el intervalo de tiempo t \in [0,1].
% Determine en qué posición estaban los móviles cuando se encontraban a la distancia mínima.
% Determine la distancia mínima.
%
% Solución:
% D = \mathbb{R}.
% Dibuja las trayectorias:

t = linspace(0,1,100);
x1 = 2*t-1; y1 = t.^2-1;
x2 = -t.^2; y2 = t.^2-t+1;
plot(x1,y1,'b',x2,y2,'r')
legend('movil 1','movil 2')
axis([-1.5,1.5,-1.5,1.5]); grid on; xlabel('x');ylabel('y')

% La distancia (al cuadrado) entre los móviles:   \left[ (x_1(t) - x_2(t)\right]^2 + \left[ (y_1(t) - y_2(t)\right]^2 = t^4+4t^3+3t^2-8t+5
% Por tanto, el problema se puede plantear así
%                    \min \quad \ t^4+4t^3+3t^2-8t+5 \\
%  s.t. \quad \quad - t \leq 0 \\
% \quad \quad \quad t-1 \leq 0
% Por tanto,  f(t) =  t^4+4t^3+3t^2-8t+5,    h_1(t) = - t, \quad h_2(t) = t-1

f = @(t) t.^4 + 4*t.^3 + 3*t.^2 - 8*t + 5;
region = [0,1];
fplot(f,region)
xlabel('x'); ylabel('f(x)');title('f(x)'); grid on;

%
% Puntos irregulares:
% 1)   h_1(t) =0, \ h_2(t) < 0 \ \Rightarrow \ t=0
% \nabla h_1(t) = -1 \neq 0,  por tanto no hay puntos irregulares entre los puntos que son frontera para la primera restricción e interiores para la segunda.
%
% 2)   h_1(t) < 0, \ h_2(t) = 0  \ \Rightarrow \ t=1
% \nabla h_2(t) = 1 \neq 0,  por tanto no hay puntos irregulares entre los puntos que son interiores para la primera restricción y frontera para la segunda.
%
% 3)   h_1(t) = 0, \ h_2(t) = 0 \ \Rightarrow t=0, t=1
% No hay puntos irregulares que saturan ambas restricciones. (tampoco los hay regulares)
%
% Por tanto, no hay puntos irregulares.
%
% Puntos KKT:
% 1)   h_1(t), h_2(t) < 0 \ \Rightarrow \ \mu_1, \mu_2  = 0
%  \left\{
% \matrix{
% \nabla f(t)  = 0 \cr
% h_1(t) < 0 \cr
% h_2(t) < 0
% } \quad
% \Rightarrow      \left\{ \matrix{
% 4t^3+12t^2+6t-8 = 0 \cr
% t  > 0 \cr
% t < 1
% }
% Resuelve la ecuación:

gradiente_f = @(t) 4*t.^3 + 12*t.^2 + 6*t - 8;
t0 = 1/2; % punto semilla
ts = fsolve(gradiente_f,t0);
disp(['solución: ',num2str(ts)])
disp(['valor de las ecs del sistema en la solución: ',num2str(gradiente_f(ts))])

% El punto encontrado cumple las dos últimas restricciones, luego es un punto KKT.
%
% 2)   h_1(t)=0, \ \ h_2(t) = 0
%                          \left\{
% \matrix{
% \nabla f(t)  + \mu_1  \nabla h_1(t) + \mu_2 \nabla h_2(t) = 0 \cr
% h_1(t) = 0 \cr
% h_2(t) = 0 \cr
% \mu_1 \geq 0 \cr
% \mu_2 \geq 0
% }       \Rightarrow
% \left\{
% \matrix{
% 4t^3+12t^2+6t-8 - \mu_1 +\mu_2 = 0 \cr
% -t = 0 \cr
% t-1 = 0 \cr
% \mu_1 \geq 0 \cr
% \mu_2 \geq 0
% }
% La segunda y tercera ecuaciones son incompatibles.
%
% 3)\quad h_1(t) = 0, \ \ h_2(t) < 0 \quad  \Rightarrow \mu_2=0
%                                  \left\{
% \matrix{
% \nabla f(t)  + \mu_1 \nabla h_1(t)=0 \cr
% h_1(t) = 0 \cr
% h_2(t) < 0 \cr
% \mu_1 \geq 0
% }           \Rightarrow
% \left\{ \matrix{
% 4t^3+12t^2+6t-8 - \mu_1 = 0 \cr
% t = 0 \cr
% t < 1 \cr
% \mu_1 \geq 0}
% Sustituyendo la segunda ecuación en la primera se tiene \mu_1 = -8, que es incompatible con la última condición.
%
% 4)  h_1(t) < 0, \ \ h_2(t) = 0 \quad  \Rightarrow \mu_1=0
%                                  \left\{
% \matrix{
% \nabla f(t)  + \mu_2 \nabla h_2(t)=0 \cr
% h_1(t) < 0 \cr
% h_2(t) = 0 \cr
% \mu_2 \geq 0
% }           \Rightarrow
% \left\{ \matrix{
% 4t^3+12t^2+6t-8 + \mu_2 = 0 \cr
% t > 0 \cr
% t = 1 \cr
% \mu_2 \geq 0}
% Sustituyendo la tercera ecuación en la primera se tiene \mu_2 = -14, que es incompatible con la última condición.
%
% En resumen,  solo hay un punto KKT, y es la solución:    t^* = 0.567.
%
% Instante en que han estado más próximos: t^* = 0.567.

disp(['distancia minima: ',num2str(sqrt(f(ts)))])
x1s = 2*ts-1; y1s = ts^2-1;
x2s = -ts^2; y2s = ts^2-ts+1;
disp(['posicion movil 1: ',num2str([x1s, y1s])])
disp(['posicion movil 2: ',num2str([x2s,y2s])])
plot(x1,y1,'b',x2,y2,'r')
axis([-1.5,1.5,-1.5,1.5]); grid on; xlabel('x');ylabel('y')
hold on
plot(x1s,y1s,'ko',x2s,y2s,'ko')
hold off

%
%
%% Ejemplo 8
%
%                     \min \quad  (x_1+3)^2  + x_2^2  \\
%  \quad s.t. \quad -x_1^3 + x_2 \leq 0 \\
% \quad \quad \quad -x_1^3 - x_2 \leq 0
% Solución:
% D = \mathbb{R}^2.
% f(\mathbf x) =
% (x_1+3)^2  + x_2^2  , \quad
% h_1(\mathbf x) = -x_1^3 + x_2, \quad
% h_2(\mathbf x) = -x_1^3 - x_2
%
% Puntos irregulares:
% 1)   h_1(\mathbf x) = 0, \ h_2(\mathbf x) < 0
% \nabla h_1(\mathbf x) =\left[\matrix{
% -3 x_1^2 \cr
% 1
% }\right]
%  \neq \mathbf 0,  por tanto no hay puntos irregulares entre los puntos que son frontera para la primera restricción e interiores para la segunda.
%
% 2)   h_1(\mathbf x) < 0, \ h_2(\mathbf x) = 0
% \nabla h_1(\mathbf x) =\left[\matrix{
% -3 x_1^2 \cr
% -1
% }\right]
%  \neq \mathbf 0,  por tanto no hay puntos irregulares entre los puntos que son interiores para la primera restricción y frontera para la segunda.
%
% 3)   h_1(\mathbf x) = 0, h_2(\mathbf x) = 0
% \Rightarrow \ x_2 = x_1^3, \  x_2 = -x_1^3 \Rightarrow \ \mathbf x = \mathbf 0
% \nabla h_1(\mathbf 0) = (0, 1), \quad
%  \nabla h_2(\mathbf 0) = (0, -1), que  son linealmente dependientes. Por tanto, \mathbf x = \mathbf 0 es un punto irregular.
%
% Gráficamente se ve que el punto \mathbf x = \mathbf 0 es la solución del problema.

funcion = @(x1,x2) (x1+3).^2 + x2.^2;
restriccion1 = @(x1,x2) -x1.^3 + x2;
restriccion2 = @(x1,x2) -x1.^3 - x2;
region = [-5 5 -5 5];

fcontour(funcion, region, 'LevelStep', 0.8)
colorbar
xlabel('x_1'); ylabel('x_2')

hold on
fimplicit(restriccion1, region,'r')
fimplicit(restriccion2, region,'r')
title('f(x), h_1(x)=0, h_2(x)=0')
hold off

% La solución \mathbf x^* = \mathbf 0 no cumple las condiciones KKT. por ejemplo, la primera condición, \nabla f(\mathbf{x}^*)  + \mu_1^*  \nabla h_1(\mathbf x^*) + \mu_2^* \nabla h_2(\mathbf x^*) = \mathbf 0 , no se cumple para ningún valor de \mu_1, \mu_2.
%
%
%% Ejemplo 9
%
%                     \min \quad  x_1  + 2 x_2^2  \\
%  \quad s.t. \quad x_1 - x_2 \leq 0 \\
% \quad \quad \quad - x_1 + x_2 +1 \leq 0
% Solución:
% D = \mathbb{R}^2.
% Se puede comprobar que las restricciones son incompatibles, es decir, no se pueden cumplir simultaneamente. Por tanto, no hay puntos factibles y el problema no tiene solución
% Gráficamente se ve que no hay puntos factibles:

funcion = @(x1,x2) x1 + 2*x2.^2;
restriccion1 = @(x1,x2) x1 - x2;
restriccion2 = @(x1,x2) -x1 + x2 +1;
region = [-3 3 -3 3];

fcontour(funcion, region, 'LevelStep', 0.2)
colorbar
xlabel('x_1'); ylabel('x_2')

hold on
fimplicit(restriccion1, region,'r')
fimplicit(restriccion2, region,'k')
title('f(x), h_1(x)=0, h_2(x)=0')
hold off

%
%
%% Ejercicio 3
%
% Considere el siguiente problema:
%                                     min \quad x_1^2 + (x_2-2)^2  \\
%  \quad s.t. \quad x_1+x_2-1 \leq 0 \\
% \quad \quad \quad x_2 \geq 0
% Determine los puntos irregulares
% Determine los puntos KKT y los multiplicadores correspondientes
% Determine el punto solución
% Compruebe la solución gráficamente
%
%
%% Ejercicio 4
%
% Considere el siguiente problema:
%                                      min \quad x_1^2 + x_2^2 + x_3^2  \\
%  \quad s.t. \quad x_2 \geq 1 \\
% \quad \quad \quad x_3 \geq 1
% Determine los puntos irregulares
% Determine los puntos KKT y los multiplicadores correspondientes
% Determine el punto solución
% Compruebe la solución gráficamente
%
%% Ejercicio 5
%
% Considere el siguiente problema:
%                                     min \quad x_1^2 + 2 x_2^2 + 3 x_3^2  \\
%  \quad s.t. \quad -5 x_1 + x_2 +3 x_3 \leq -3 \\
% \quad \quad \quad 2x_1 + x_2 + 2 x_3 \geq 6
% Determine los puntos irregulares
% Determine los puntos KKT y los multiplicadores correspondientes
% Determine el punto solución
% Compruebe la solución gráficamente
%
%% Ejercicio 6
%
% Considere el siguiente problema:
%                                         min \quad x_2^2 - x_1  \\
%  \quad s.t. \quad 1 -  x_1^2 - x_2^2 \leq 0 \\
% \quad \quad \quad x_1^2 + \frac{x_2^2}{4} -1 \leq 0
% Determine los puntos irregulares
% Determine los puntos KKT y los multiplicadores correspondientes
% Determine el punto solución
% Compruebe la solución gráficamente
%
%%
%% Métodos numéricos: Función fmincon de Matlab
%
% La función de matlab fmincon resuelve numéricamente problemas de minimización con restricciones. Utiliza algoritmos iterativos para encontrar los mínimos.
% Las entradas a fmincon son la función a minimizar, f(\mathbf x) ,  las funciones asociadas a las restricciones h_k(\mathbf x) , y un puntor inicial \mathbf x_0 . A partir del punto inicial el algoritmo empleado comienza a iterar buscando un mínimo.
% Cuando converge a un mínimo, el algoritmo deja de iterar y devuelve el mínimo encontrado.
% La selección del punto inicial \mathbf x_0  puede ser crítica cuando el problema tiene minimos locales, ya que determina el mínimo al que converge el algoritmo. En ocasiones, una mala elección de \mathbf x_0  puede hacer que el algoritmo no converja.
% Se recomienda elegir un punto inicial factible y, si es posible, cercano a la solución.
% fmincon estima las derivadas de las funciones numéricamente, salvo que se las proporcione explicitamente. En este caso se acelera la convergencia del algoritmo.
%
%% Ejemplo 1
%
%                    \min \quad x_1^2+x_2^2 \\
%  s.t. \quad 1-x_1-x_2 \leq 0
%
% Por tanto,   f(\mathbf x) = x_1^2 + x_2^2, \quad \quad
% h(\mathbf x) = 1 - x_1 - x_2
% La función asociada a la restricción es lineal: \mathbf A \mathbf x \leq \mathbf b, donde \mathbf A = [- 1,- 1], \ \mathbf b = -1
%
% }.
% Resuelve el problema con fmincon:

funcion = @(x) x(1)^2 + x(2)^2;
A = [-1,-1]; b = -1;
x0 = [1,0]; 
x = fmincon(funcion,x0,A,b,[],[],[],[],[]);
disp(x)

% Se comprueba gráficamente:

funcion = @(x1,x2) x1.^2 + x2.^2;
restriccion = @(x1,x2) 1 - x1 - x2;
region = [-1 1 -1 1];

fcontour(funcion, region, 'LevelStep', 0.04)
xlabel('x_1'); ylabel('x_2')
colorbar

hold on
fimplicit(restriccion, region,'r')
title('f(x), h(x)=0')
plot(x(1),x(2),'bo')
hold off

%
%
%% Ejemplo 2
%
%                     \min \quad x_1+x_2 \\
%  s.t. \quad (x_1-1)^2+x_2^2 -1  \leq 0
%
% La función asociada a la restricción es no lineal y se define en una función (al final del LiveScript):

funcion = @(x) x(1)+x(2) ;
x0 = [1,0]; % punto factible
x = fmincon(funcion,x0,[],[],[],[],[],[],@restriccion_ejemplo2);
disp(x)

%
% Se comprueba gráficamente:

funcion = @(x1,x2) x1+x2;
restriccion = @(x1,x2) (x1-1).^2 + x2.^2 - 1;
region = [-2 2 -2 2];

fcontour(funcion, region, 'LevelStep', 0.04)
xlabel('x_1'); ylabel('x_2')
colorbar

hold on
fimplicit(restriccion, region,'r')
title('f(x), h(x)=0')
plot(x(1),x(2),'bo')
hold off

%
%% Ejemplo 3
%
%                     \min \quad x_1^2+x_2^2 \\
%  s.t. \quad -(x_1-1)^3+x_2^2  \leq 0
% La función asociada a la restricción es no lineal y se define en una función:

funcion = @(x) x(1).^2 + x(2).^2;
x0 = [2,0]; % punto factible
x = fmincon(funcion,x0,[],[],[],[],[],[],@restriccion_ejemplo3);
disp(x)

%
% Se comprueba gráficamente:

funcion = @(x1,x2) x1.^2 + x2.^2;
restriccion = @(x1,x2) -(x1-1).^3 + x2.^2;
region = [-2 2 -2 2];

fcontour(funcion, region, 'LevelStep', 0.05)
xlabel('x_1'); ylabel('x_2')
colorbar

hold on
fimplicit(restriccion, region,'r')
title('f(x), h(x)=0')
plot(x(1),x(2),'bo')
hold off

%
%
%% Ejemplo 4
%
%                     \min \quad x_1^2+x_2 \\
%  s.t. \quad x_1+x_2  \leq 0
%
% Busca la solución:

funcion = @(x) x(1).^2 + x(2);
A = [1,1]; b = 0;
x0 = [0,0]; % punto factible
x = fmincon(funcion,x0,A,b,[],[],[],[],[]);
disp(x)

%
% Gráficamente se ve que el problema no tiene mínimo. La función objetivo se hace infinitamente pequeña cuando x_1=0 y x_2 \rightarrow \infty .

funcion = @(x1,x2) x1.^2 + x2;
restriccion = @(x1,x2) x1 + x2;
region = [-3 3 -3 3];

fcontour(funcion, region, 'LevelStep', 0.1)
xlabel('x_1'); ylabel('x_2')
colorbar

hold on
fimplicit(restriccion, region,'r')
title('f(x), h(x)=0')
plot(x(1),x(2),'bo')
hold off

%
%
%% Ejemplo 6
%
%                     \min \quad  x_1^2  + x_2^2  - 14 x_1 -6 x_2  \\
%  \quad s.t. \quad x_1 + x_2 - 2 \leq 0 \\
% \quad \quad \quad x_1+2x_2 -3 \leq 0
%
%  f(\mathbf x) =
% x_1^2  + x_2^2  - 14 x_1 -6 x_2 , \quad
% h_1(\mathbf x) = x_1 + x_2 - 2 , \quad
% h_2(\mathbf x) = x_1 + 2 x_2 - 3
% Las funciones asociadas a las restricciones son lineales. Por tanto, se puede escribir así: \mathbf A \mathbf x \leq \mathbf b, donde \mathbf A = \left(\matrix{
% 1 &1  \cr
% 1 & 2
% } \right), \
% \ \mathbf
% b = \left(\matrix{
% 2 \cr 3
% } \right).

funcion = @(x) x(1).^2 + x(2).^2 - 14*x(1) - 6*x(2);
A = [1,1; 1,2]; b = [2; 3];
x0 = [0,0]; % punto factible
x = fmincon(funcion,x0,A,b,[],[],[],[],[]);
disp(x)

%
% Se comprueba la solución gráficamente:

funcion = @(x1,x2) x1.^2 + x2.^2 - 14*x1 - 6*x2;
restriccion1 = @(x1,x2) x1 + x2 -2;
restriccion2 = @(x1,x2) x1 + 2*x2 - 3;
region = [-5 5 -5 5];

fcontour(funcion, region, 'LevelStep', 0.8)
colorbar
xlabel('x_1'); ylabel('x_2')

hold on
fimplicit(restriccion1, region,'r')
fimplicit(restriccion2, region,'r')
title('f(x), h_1(x)=0, h_2(x)=0')
plot(x(1),x(2),'bo')
hold off

%
%
%% Ejemplo 8
%
%                     \min \quad  (x_1+3)^2  + x_2^2  \\
%  \quad s.t. \quad -x_1^3 + x_2 \leq 0 \\
% \quad \quad \quad -x_1^3 - x_2 \leq 0
% En este ejemplo   f(\mathbf x) =
% (x_1+3)^2  + x_2^2  , \quad
% h_1(\mathbf x) = -x_1^3 + x_2, \quad
% h_2(\mathbf x) = -x_1^3 - x_2
%
% Ambas restricciones son no lineales y se definen en una función al final del LiveScript:

funcion = @(x) (x(1)+3).^2+x(2).^2 ;
x0 = [1,1]; % punto factible
x = fmincon(funcion,x0,[],[],[],[],[],[],@restricciones_ejemplo8);
disp(x)

%
% Gráficamente se ve que el punto \mathbf x = (0, 0) es la solución del problema.

funcion = @(x1,x2) (x1+3).^2 + x2.^2;
restriccion1 = @(x1,x2) -x1.^3 + x2;
restriccion2 = @(x1,x2) -x1.^3 - x2;
region = [-5 5 -5 5];

fcontour(funcion, region, 'LevelStep', 0.8)
colorbar
xlabel('x_1'); ylabel('x_2')

hold on
fimplicit(restriccion1, region,'r')
fimplicit(restriccion2, region,'k')
title('f(x), h_1(x)=0, h_2(x)=0')
plot(x(1),x(2),'bo')
hold off

%
%
%% Ejemplo 10
%
% Resuelva el siguiente problema utilizando la funcion fmincon
%         min \quad (x_1-3)^2 + (x_2-3/2)^2  \\
%  s.t. \quad x_1 - x_2 \leq 0 \\
% \quad \quad x_1^2 + x_2^2 - 4 \leq 0 \\
% \quad \quad x_1 \leq 4 \\
% \quad \quad x_2 \geq 0
%
% En fmincon, las restricciones de la forma  x_m \geq 0  ó x_m \leq 0  se pueden indicar explicitamente (sin necesidad de dscribirlas como restricciones lineales).
% En este problema  - \infty \leq x_1 \leq 4,  0 \leq x_2 \leq \infty

funcion = @(x) (x(1)-3).^2 + (x(2)-3/2).^2;
A = [1,-1]; b = 0;
x0 = [0,0]; % punto factible
lb = [-inf,0]; % cotas inferiores para x1 y x2
ub = [4,inf]; % cotas superiores para x1 y x2
x = fmincon(funcion,x0,A,b,[],[],lb,ub,@restriccion2_ejemplo10);
disp(x)

%
% Gráficamente se ve que el punto \mathbf x^* = (\sqrt{2}, \sqrt{2}) es la solución del problema.

funcion = @(x1,x2) (x1-3).^2 + (x2-3/2).^2;
restriccion1 = @(x1,x2) x1 - x2;
restriccion2 = @(x1,x2) x1.^2 + x2.^2 - 4;
restriccion3 = @(x1,x2) x1-4;
restriccion4 = @(x1,x2) -x2;
region = [-5 5 -5 5];

fcontour(funcion, region, 'LevelStep', 0.8)
colorbar
xlabel('x_1'); ylabel('x_2')

hold on
fimplicit(restriccion1, region,'r')
fimplicit(restriccion2, region,'r')
fimplicit(restriccion3, region,'r')
fimplicit(restriccion4, region,'r')
title('f(x), h_1(x)=0, h_2(x)=0, h_3(x)=0, h_4(x)=0')
plot(x(1),x(2),'bo')
hold off

%
%
%% Ejercicio 5
%
% Resuelva el problema del ejercicio 5 utilizando la funcion fmincon
%         min \quad x_1^2 + 2 x_2^2 + 3 x_3^2  \\
%  s.t. \quad -5 x_1 + x_2 +3 x_3 + 3 \leq 0 \\
% \quad \quad \quad -2 x_1 - x_2 - 2 x_3 +6 \leq 0
%
%
%% Ejercicio 7
%
% Resuelva el siguiente problema utilizando la funcion fmincon
%         min \quad (x_1-5)^2 + (x_2-5)^2  \\
%  s.t. \quad x_1^2 - x_2 \leq 6 \\
% \quad \quad  x_1 + 3 x_2 \leq 12
%
%
%% Funciones no lineales de las restricciones:
%

function [c,ceq] = restriccion_ejemplo2(x)
c= (x(1)-1).^2 + x(2).^2 - 1;
ceq = [];
end

%

function [c,ceq] = restriccion_ejemplo3(x)
c= -(x(1)-1).^3 + x(2).^2;
ceq = [];
end

%

function [c,ceq] = restricciones_ejemplo8(x)
c(1)= -x(1).^3 + x(2);
c(2)= -x(1).^3 - x(2);
ceq = [];
end

%

function [c,ceq] = restriccion2_ejemplo10(x)
c= x(1).^2 + x(2).^2 - 4;
ceq = [];
end