function [k, X, Y, u, pasos, kno, Xno, Yno, uno] = cpbusqueda(F, signoX, signoXF, k, problema)1%cpbusqueda2% [k, X, Y] = cpbusqueda(F, signoX, signoXF)3%4% Busca un k para el que existe un crecimiento proporcional usando5% cpdistancia.6%7% [k, X, Y, u, pasos, kno, Xno, Yno, uno] = cpbusqueda(F, signoX, signoXF, k0)8% F recetas en tiempo discreto o continuo9% signoX signo de las intensidades; por defecto X >= 010% signoXF signo de los balances materiales; por defecto X F(k) = 011% k0 factor con el que se inicia la iteraci�n; por defecto 112% k factor para el que existe un crecimiento proporcional13% X intensidades para las que existe un crecimiento proporcional14% Y multiplicadores de Lagrange del juego correspondiente15% u valor del juego para k16% pasos n�mero de iteraciones17% kno factor el que no existe un crecimiento proporcional18% Xno intensidades para las que no existe un crecimiento proporcional19% Yno multiplicadores de Lagrange del juego correspondiente20% uno valor del juego para kno2122% necesita cpdistancia.m, forma0.m, forma1.m2324if nargin < 2, signoX = []; end25if nargin < 3, signoXF = []; end26if nargin < 4, k = []; end27if nargin < 5, problema = []; end2829cero = 1e-14; %define la precisi�n del cero30X = []; Y = []; u = []; pasos = []; kno = 0; %define las variables31if isempty(k), k = 1; end %define k como 1 si no est� ya definida3233if isempty(problema) %34for pasos = 1:100 %inicia una iteraci�n de hasta 100 pasos35[u, X, Y] = cpdistancia(forma0(F, k), signoX, signoXF); %comprueba si existe un crecimiento proporcional para k36if u >= -cero, break, end %si existe un crecimiento proporcional sale del bucle37kno = k; Xno = X; Yno = Y; uno = u; %se almacenan las variables38du = X * forma1(F, k) * Y; %calcula du/dk39if abs(du) < cero %si du/dk = 040k = k / 2; %el nuevo k pasa a ser la mitad del anterior41else %en caso contrario42k = k - u / du; %se aplica la f�rmula de Newton43if k < kno / 2, k = kno / 2; end %el nuevo k no puede ser menos de la mitad del anterior44if k > kno * 2, k = kno * 2; end %el nuevo k no puede ser m�s del doble del anterior45end %46end %repite la iteraci�n47if pasos >= 100, disp('Atenci�n, se ha superado el n�mero m�ximo de iteraciones para ksi'); end48end %4950if or(nargout < 6, kno > k), return; end %si no se pide un kno o si se encontr� ya uno interrumpe5152if isempty(problema), kno = k * 2; else kno = k; k = []; end %53for pasos2 = 1:20 %inicia una iteraci�n de hasta 20 pasos54[uno, Xno, Yno] = cpdistancia(forma0(F, kno), signoX, signoXF); %comprueba si existe un crecimiento proporcional para kno55if uno < -cero, break, end %si no existe sale de la iteraci�n56kno = kno * 2; %duplica k57end %repite la iteraci�n58if pasos2 >= 20, disp('Atenci�n, se ha superado el n�mero m�ximo de iteraciones para kno'); end59pasos = [pasos, pasos2];606162