function [k, X, Y, pasos] = vnnewton(F, signoX, signoXF, k)
%vnnewton
%   [k, X, Y] = vnnewton(F)
% 
%   busca la solución de VN intentando resolver la ecuación u(k) = 0
%   mediante el método de Newton, donde u(k) es la distancia al crecimiento 
%   proporcional establecida como el valor del juego para la matriz de
%   pagos F(k) convertida a la forma canónica. 
% 
%   [k, X, Y] = vnnewton(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, X, Y   factor, intensidades y valores solución
% 
%   Los códigos para los signos son   0 =    1 >=    2 <=    3 >=<

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

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

cero = 1e-14;                                                   %define la precisión del cero
if isempty(k), k = 1; end                                       %si no está definida, define k como 1
for pasos = 1:100                                               %inicia una iteración de hasta 100 pasos
    kmem = k;                                                       %almacena la magnitud de k
    [u, X, Y] = cpdistancia(forma0(F,k), signoX, signoXF);          %calcula la distancia al crecimiento proporcional
    du = X * forma1(F, k) * Y;                                      %establece la derivada de la distancia = X F'(k) Y
    if abs(du)<cero, disp('Atención, derivada nula'); return; end   %si la derivada es nula avisa e interrumpe
    k = k - u / du;                                                 %establece la nueva k
    if k <= 0, disp('Atención, factor no positivo'); return; end    %si el nuevo factor no es positivo avisa e interrumpe
    if abs(kmem - k) < cero; return, end                            %si k cambia poco interrumpe
end                                                             %repite la iteración
disp('Atención, se ha superado el máximo de iteraciones');      %avisa de que se ha superado el máximo de iteraciones
