function [k, X, Y, u, pasos, kno, Xno, Yno, uno] = cpbusqueda(F, signoX, signoXF, k, problema)
%cpbusqueda
%   [k, X, Y] = cpbusqueda(F, signoX, signoXF)
%
%   Busca un k para el que existe un crecimiento proporcional usando
%   cpdistancia.
%
%   [k, X, Y, u, pasos, kno, Xno, Yno, uno] = cpbusqueda(F, signoX, signoXF, k0)
%      F         recetas en tiempo discreto o continuo
%      signoX    signo de las intensidades; por defecto X >= 0 
%      signoXF   signo de los balances materiales; por defecto X F(k) = 0 
%      k0        factor con el que se inicia la iteración; por defecto 1 
%      k         factor para el que existe un crecimiento proporcional 
%      X         intensidades para las que existe un crecimiento proporcional 
%      Y         multiplicadores de Lagrange del juego correspondiente 
%      u         valor del juego para k 
%      pasos     número de iteraciones 
%      kno       factor el que no existe un crecimiento proporcional 
%      Xno       intensidades para las que no existe un crecimiento proporcional 
%      Yno       multiplicadores de Lagrange del juego correspondiente 
%      uno       valor del juego para kno

%   necesita cpdistancia.m, forma0.m, forma1.m

if nargin < 2, signoX = []; end
if nargin < 3, signoXF = []; end
if nargin < 4, k = []; end
if nargin < 5, problema = []; end

cero = 1e-14;                                                   %define la precisión del cero
X = []; Y = []; u = []; pasos = []; kno = 0;                    %define las variables
if isempty(k), k = 1; end                                       %define k como 1 si no está ya definida

if isempty(problema)                                            %
   for pasos = 1:100                                               %inicia una iteración de hasta 100 pasos
      [u, X, Y] = cpdistancia(forma0(F, k), signoX, signoXF);         %comprueba si existe un crecimiento proporcional para k
      if u >= -cero, break, end                                       %si existe un crecimiento proporcional sale del bucle
      kno = k; Xno = X; Yno = Y; uno = u;                             %se almacenan las variables
      du = X * forma1(F, k) * Y;                                      %calcula du/dk
      if abs(du) < cero                                               %si du/dk = 0
         k = k / 2;                                                      %el nuevo k pasa a ser la mitad del anterior
      else                                                            %en caso contrario
         k = k - u / du;                                                 %se aplica la fórmula de Newton
         if k < kno / 2, k = kno / 2; end                                %el nuevo k no puede ser menos de la mitad del anterior
         if k > kno * 2, k = kno * 2; end                                %el nuevo k no puede ser más del doble del anterior
      end                                                             %
   end                                                             %repite la iteración
   if pasos >= 100, disp('Atención, se ha superado el número máximo de iteraciones para ksi'); end
end                                                              %

if or(nargout < 6, kno > k), return; end                         %si no se pide un kno o si se encontró ya uno interrumpe

if isempty(problema), kno = k * 2; else kno = k; k = []; end     %
for pasos2 = 1:20                                                %inicia una iteración de hasta 20 pasos
   [uno, Xno, Yno] = cpdistancia(forma0(F, kno), signoX, signoXF);  %comprueba si existe un crecimiento proporcional para kno
   if uno < -cero, break, end                                       %si no existe sale de la iteración
   kno = kno * 2;                                                   %duplica k
end                                                              %repite la iteración
if pasos2 >= 20, disp('Atención, se ha superado el número máximo de iteraciones para kno'); end
pasos = [pasos, pasos2];
