function [u, X, Y, v] = cpdistancia(F, signoX, signoXF)1%cpdistancia2% u = cpdistancia(Fact)3%4% Determina la distancia a un crecimiento proporcional con la matriz5% num�rica de fujos actualizados para un factor, transformando el6% problema a la forma can�nica y resolviendo el juego con la matriz de7% pagos correspondiente.8%9% [u, X, Y] = cpdistancia(Fact, signoX, signoXF)10% Fact matriz num�rica con los flujos actualizados11% signoX signo de las intensidades; por defecto X >= 012% signoXF signo de los balances materiales; por defecto X F(k) = 013% u si u >= 0 existe un crecimiento proporcional, si u < 0 no14% X intensidades15% Y multiplicadores de Lagrange16%17% Si escribimos18% [u, X, Y] = cpdistancia(forma0(F,k), signoX, signoXF)19% nos determinar� si existe un crecimiento proporcional para unas recetas20% en tiempo discreto o continuo con el factor k. Tambi�n si escribimos21% [u, X, Y] = cpdistancia(P, 1, 1)22% obtendremos el valor u y las estrategias X e Y del juego para la matriz23% de pagos P.2425% necesita formaproblema.m, formasolucion.m2627if nargin < 2, signoX = []; end28if nargin < 3, signoXF = []; end2930if isempty(signoX), s3 = 0; else s3 = sum(signoX == 3); end %determina si alg�n X tiene signo >=< 031if s3 == 0 %si ning�n X >=< 032[Fcan, signoX, signoXF] = formaproblema(F, signoX, signoXF, 1); %convierte el problema a la forma can�nica33[u, X, Y, v] = juego(Fcan); %resuelve el juego34[X, Y] = formasolucion(X, Y, signoX, signoXF, 1); %convierte la solucion desde la forma canonica35else %en caso contrario36for c1 = 1:size(signoX,2), if signoX(c1) == 3, break; end, end %determina el primer caso con X >=< 037signoX(c1) = 1; %establece que ese signoX(c1) sea 138[u1, X1, Y1, v1] = cpdistancia(F, signoX, signoXF); %calcula la distancia u1 para signoX(c1) = 139signoX(c1) = 2; %establece que ese signoX(c1) sea 240[u2, X2, Y2, v2] = cpdistancia(F, signoX, signoXF); %calcula la distancia u2 para signoX(c1) = 241if u1 >= u2 %si u1 es mayor o igual a u242u = u1; X = X1; Y = Y1; v = v1; %establece como soluci�n la de signoX(c1) = 143else %en caso contrario44u = u2; X = X2; Y = Y2; v = v2; %establece como soluci�n la de signoX(c1) = 245end46end474849505152function [u, X, Y, v] = juego(F)53%juego54% [u, X, Y, v] = juego(F)55%56% Calcula el valor del juego u para la matriz de pagos F resolviendo el57% programa lineal58% max u min v59% X F >= u Y >= 060% 1 - sum(X) = 0 v >=< 061% X >= 0 F Y <= v62% u >=< 0 1 - sum(Y) = 06364%necesita programalineal.m6566[filas, columnas] = size(F); %determina el tama�o de F67Fn = [F, -ones(filas,1); -ones(1, columnas), 0]; %establece la matriz del programa lineal [F,-1; -1, 0]68C = [zeros(filas,1); 1]; %define la funci�n objetivo [X, u] [0; 0; 0;...; 0; 1]69D = [zeros(1,columnas), 1]; %[0, 0, 0, ..., 0, 1]70signoX = [ones(1, filas), 3]; %establece que X >= 0, u >=< 071signoXF = [ones(1, columnas), 0]; %establece que X F - u >= 0, 1 - sum(X) = 072[Xu, Yv] = programalineal(Fn, C, D, signoX, signoXF); %resuelve el programa lineal73u = Xu(filas+1); X = Xu(1:filas); Y = Yv(1:columnas); v = Yv(columnas+1); %extrae u, X, Y, v de la soluci�n7475767778