Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
162 views
1
function [u, X, Y, v] = cpdistancia(F, signoX, signoXF)
2
%cpdistancia
3
% u = cpdistancia(Fact)
4
%
5
% Determina la distancia a un crecimiento proporcional con la matriz
6
% num�rica de fujos actualizados para un factor, transformando el
7
% problema a la forma can�nica y resolviendo el juego con la matriz de
8
% pagos correspondiente.
9
%
10
% [u, X, Y] = cpdistancia(Fact, signoX, signoXF)
11
% Fact matriz num�rica con los flujos actualizados
12
% signoX signo de las intensidades; por defecto X >= 0
13
% signoXF signo de los balances materiales; por defecto X F(k) = 0
14
% u si u >= 0 existe un crecimiento proporcional, si u < 0 no
15
% X intensidades
16
% Y multiplicadores de Lagrange
17
%
18
% Si escribimos
19
% [u, X, Y] = cpdistancia(forma0(F,k), signoX, signoXF)
20
% nos determinar� si existe un crecimiento proporcional para unas recetas
21
% en tiempo discreto o continuo con el factor k. Tambi�n si escribimos
22
% [u, X, Y] = cpdistancia(P, 1, 1)
23
% obtendremos el valor u y las estrategias X e Y del juego para la matriz
24
% de pagos P.
25
26
% necesita formaproblema.m, formasolucion.m
27
28
if nargin < 2, signoX = []; end
29
if nargin < 3, signoXF = []; end
30
31
if isempty(signoX), s3 = 0; else s3 = sum(signoX == 3); end %determina si alg�n X tiene signo >=< 0
32
if s3 == 0 %si ning�n X >=< 0
33
[Fcan, signoX, signoXF] = formaproblema(F, signoX, signoXF, 1); %convierte el problema a la forma can�nica
34
[u, X, Y, v] = juego(Fcan); %resuelve el juego
35
[X, Y] = formasolucion(X, Y, signoX, signoXF, 1); %convierte la solucion desde la forma canonica
36
else %en caso contrario
37
for c1 = 1:size(signoX,2), if signoX(c1) == 3, break; end, end %determina el primer caso con X >=< 0
38
signoX(c1) = 1; %establece que ese signoX(c1) sea 1
39
[u1, X1, Y1, v1] = cpdistancia(F, signoX, signoXF); %calcula la distancia u1 para signoX(c1) = 1
40
signoX(c1) = 2; %establece que ese signoX(c1) sea 2
41
[u2, X2, Y2, v2] = cpdistancia(F, signoX, signoXF); %calcula la distancia u2 para signoX(c1) = 2
42
if u1 >= u2 %si u1 es mayor o igual a u2
43
u = u1; X = X1; Y = Y1; v = v1; %establece como soluci�n la de signoX(c1) = 1
44
else %en caso contrario
45
u = u2; X = X2; Y = Y2; v = v2; %establece como soluci�n la de signoX(c1) = 2
46
end
47
end
48
49
50
51
52
53
function [u, X, Y, v] = juego(F)
54
%juego
55
% [u, X, Y, v] = juego(F)
56
%
57
% Calcula el valor del juego u para la matriz de pagos F resolviendo el
58
% programa lineal
59
% max u min v
60
% X F >= u Y >= 0
61
% 1 - sum(X) = 0 v >=< 0
62
% X >= 0 F Y <= v
63
% u >=< 0 1 - sum(Y) = 0
64
65
%necesita programalineal.m
66
67
[filas, columnas] = size(F); %determina el tama�o de F
68
Fn = [F, -ones(filas,1); -ones(1, columnas), 0]; %establece la matriz del programa lineal [F,-1; -1, 0]
69
C = [zeros(filas,1); 1]; %define la funci�n objetivo [X, u] [0; 0; 0;...; 0; 1]
70
D = [zeros(1,columnas), 1]; %[0, 0, 0, ..., 0, 1]
71
signoX = [ones(1, filas), 3]; %establece que X >= 0, u >=< 0
72
signoXF = [ones(1, columnas), 0]; %establece que X F - u >= 0, 1 - sum(X) = 0
73
[Xu, Yv] = programalineal(Fn, C, D, signoX, signoXF); %resuelve el programa lineal
74
u = Xu(filas+1); X = Xu(1:filas); Y = Yv(1:columnas); v = Yv(columnas+1); %extrae u, X, Y, v de la soluci�n
75
76
77
78