function [k, X, Y, pasos] = vnbiseccion(F, signoX, signoXF, ksi, kno)
%vnbiseccion
%   [k, X, Y] = vnbiseccion(F)
% 
%   Busca la solución de VN con el método de bisección. Se parte de un
%   ksi para el que existe un crecimiento proporcional y de un kno mayor
%   que ksi para el que no. Se procede comprobando si en el medio del
%   intervalo [ksi, kno) existe un crecimiento proporcional y bisecando el
%   intervalo en consecuencia hasta que kno-ksi sea menor que una cota. 
% 
%   [k, X, Y] = vnbiseccion(F, signoX, signoXF, ksi, kno)
%      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
%      ksi       factor para el que existe un crecimiento proporcional
%      kno       factor, mayor que ksi, para el que no existe
%      k, X, Y   factor, intensidades y valores solución.
% 
%   Los códigos para los signos son   0 =    1 >=    2 <=    3 >=<

%   necesita cpdistancia.m, forma0.m

if nargin < 2, signoX = []; end
if nargin < 3, signoXF = []; end
if nargin < 4, ksi = []; end
if nargin < 5, kno = []; end

cero = 1e-14;                                            %define la precisión del cero
if isempty(ksi), ksi = 0.01; end                         %si no está definido define ksi como 0.01
if isempty(kno), kno = 100; end                          %si no está definido define kno como 100
for pasos = 1:100                                        %inicia una iteración de hasta 100 pasos
    k = (ksi + kno) / 2;                                     %k es el punto medio del intervalo [ksi, kno)
    [u, X, Y] = cpdistancia(forma0(F,k), signoX, signoXF);   %calcula si existe un crecimiento proporcional para k
    if u >= -cero, ksi = k; else kno = k; end                %si existe el intervalo queda [k, kno) y si no [ksi, k)
    if abs(kno-ksi) < cero; return, end                      %si kno-ksi es inferior a una cota interrumpe
end                                                      %repite la iteración
disp('Atención, se superó el máximo de iteraciones');    %avisa de que se ha superado el máximo de iteraciones
