Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
/ vn.m
162 views
1
function [k, X, Y, pasos, distancias, sal1, sal2] = vn(F, signoX, signoXF, algoritmo, par1, par2, par3)
2
%vn
3
% [k, X, Y] = vn(F)
4
%
5
% Resuelve el modelo Von Neumann
6
% Max k
7
% X F(k) ~ 0 <-> -Y ~ 0 X F(k) .* Y = 0
8
% X ~ 0 <-> F(k) Y ~ 0 X .* F(k) Y = 0
9
% k > 0 1 + X F'(k) Y = 0
10
%
11
% [k, X, Y, pasos, distancias] = vn(F, signoX, signoXF, algoritmo)
12
% F recetas en tiempo discreto o continuo
13
% signoX signo de las intensidades; por defecto X >= 0
14
% signoXF signo de los balances materiales; por defecto X F(k) = 0
15
% algoritmo especifica el algoritmo que se usar�; por defecto 0
16
% k factor de expansi�n
17
% X intensidades-VN
18
% Y valores-VN o precios
19
% pasos n�mero de iteraciones efectuadas
20
% distancias distancia de la soluci�n a las condiciones
21
%
22
% Los c�digos para los signos son 0 = 1 >= 2 <= 3 >=<
23
% Si se escribe un escalar para signoX o signoXF se aplica a todos; as�
24
% vn(F, 1, 0) resuelve la forma est�ndar, X >= 0, X F(k) = 0.
25
% vn(F, 1, 1) resuelve la forma can�nica, X >= 0, X F(k) >= 0.
26
%
27
% Seg�n definamos algoritmo se usar�:
28
% 0 selecci�n autom�tica (por defecto)
29
% 1 vnautovalor
30
% 2 vnautovalor mayor orden
31
% 3 vnbiseccion
32
% 4 vnnewton
33
% 5 vnpls
34
% 6 vnsimplex
35
% 7 vnnolineal
36
% 8 vnbrody
37
% 9 cpbusqueda -> vnbiseccion
38
% 10 cpbusqueda -> vnpls
39
% 11 vnpls; cpbusqueda -> vnpls; cpbusqueda -> vnbiseccion
40
%
41
% Cuando F son recetas en tiempo discreto la selecci�n autom�tica escoge
42
% el algoritmo 1 para los problemas peque�os, el 2 para los problemas
43
% casi-cuadrados medianos y para los problemas cuadrados grandes en la
44
% forma est�ndar, el 11 para los problemas rectangulares grandes, y el 6
45
% para los muy grandes.
46
% Cuando F son unas recetas en tiempo continuo la selecci�n autom�tica
47
% escoge el 11 en cualquier caso. Si con unas recetas en tiempo continuo
48
% pedimos la soluci�n con los algoritmos 1,2,6,7,8 primero se usa
49
% formapolinomioinverso.
50
% Los algoritmos 9 a 11 ejecutan sucesivamente los algoritmos indicados
51
% hasta encontrar una soluci�n.
52
53
%necesita forma0.m, formaproblema.m, formasolucion.m, condicionesvn.m,
54
%forma1.m, cpbusqueda.m, vnautovalor.m, vnbiseccion.m, vnnewton.m, vnpls.m,
55
%vnnolineal.m, vnbrody.m, vnsimplex
56
57
if nargin < 2, signoX = []; end
58
if nargin < 3, signoXF = []; end
59
if nargin < 4, algoritmo = []; end
60
if nargin < 5, par1 = []; end
61
if nargin < 6, par2 = []; end
62
if nargin < 7, par3 = []; end
63
64
k = []; X = []; Y = []; pasos = []; distancias = []; sal1 = []; sal2 = []; %define las variables para la sailda
65
if isempty(F), disp('Los procesos de producci�n no est�n definidos'); return, end %avisa de que F = []
66
[filas, columnas, ancho] = size(F); %establece el tama�o del problema
67
if ancho == 1, [filas, columnas] = size(forma0(F, 1)); end %si las recetas est�n en tiempo continuo, establece el tama�o
68
if isempty(signoX), signoX = 1; end %por defecto X >= 0
69
if size(signoX, 2) == 1, signoX = signoX.*ones(1,filas); end %si signoX es un escalar lo aplica a todas las intensidades
70
if isempty(signoXF), signoXF = 0; end %por defecto X F(k) = 0
71
if size(signoXF, 2) == 1, signoXF = signoXF.*ones(1,columnas); end %si signoXF es un escalar lo aplica a todos los balances materiales
72
if isempty(algoritmo), algoritmo = 0; end %si algoritmo no est� definido selecci�n autom�tica
73
74
simplex = (algoritmo == -1); %si algoritmo == -1 lanza para simplex
75
if algoritmo <= 0 %si seleccion automatica o lanzado desde simplex
76
if ancho == 1 %si las recetas est�n definidas inline
77
algoritmo = 11; %algoritmo 11: vnpls; cpbusqueda -> vnpls; cpbusqueda -> vnbiseccion
78
else %si las recetas est�n definidas como matrices
79
filasestandar = filas - sum(signoX == 0) + sum(signoXF == 1) + sum(signoXF == 2) + 2*sum(signoXF == 3); %calcula el n�mero de filas en la forma est�ndar
80
if (filas*columnas) < 50 %si problema peque�o
81
if simplex, par1 = []; par2 = 1; end %si desde simplex, busca en todos los menores y una soluci�n
82
algoritmo = 1; %algoritmo 1: vnautovalor
83
elseif and(abs(filasestandar-columnas) < 2, columnas < 100) %si problema casi-cuadrado mediano (en forma est�ndar)
84
if simplex, par1 = 1; end %si desde simplex, busca una solucion
85
algoritmo = 2; %algoritmo 2: vnautovalor mayor orden
86
elseif and(filasestandar==columnas, columnas < 500) %si problema cuadrado grande (en forma est�ndar)
87
if simplex, par1 = 1; end %si desde simplex, busca una solucion
88
algoritmo = 2; %algoritmo 2: vnautovalor mayor orden
89
elseif and(filas < 3000, columnas < 200) %si problema rectangular grande
90
algoritmo = 11; %algoritmo 11: vnpls; cpbusqueda -> vnpls; cpbusqueda -> vnbiseccion
91
else %si problema muy grande
92
if simplex %si desde simplex
93
algoritmo = 11; %algoritmo 11: vnpls; cpbusqueda -> vnpls; cpbusqueda -> vnbiseccion
94
else %en caso contrario
95
algoritmo = 6; %algoritmo 6: vnsimplex
96
end
97
end
98
end
99
end
100
101
if and(ancho == 1, sum(algoritmo==[1,2,6,7,8]))
102
F = formapolinomioinverso(F);
103
disp('Matrices de flujos netos aproximadas con formapolinomioinverso');
104
end
105
106
switch algoritmo
107
case 1
108
disp('Algoritmo 1: vnautovalor');
109
[k, X, Y, pasos] = vnautovalor(F, signoX, signoXF, par1, par2);
110
[X, Y, k] = normalizacion(k, X, Y, F, 1);
111
[k, X, Y] = quitarsolucionesrepetidas(k, X, Y);
112
case 2
113
disp('Algoritmo 2: vnautovalor mayor orden');
114
[Fn, signoX, signoXF] = formaproblema(F, signoX, signoXF); %convierte a la forma estandar
115
[k, X, Y, pasos] = vnautovalor(Fn, 1, 0, 0, par1); %busca en los menores de mayor orden
116
[X, Y] = formasolucion(X, Y, signoX, signoXF); %convierte desde la forma estandar
117
[X, Y, k] = normalizacion(k, X, Y, F, 1);
118
[k, X, Y] = quitarsolucionesrepetidas(k, X, Y);
119
case 3
120
disp('Algoritmo 3: vnbiseccion');
121
[k, X, Y, pasos] = vnbiseccion(F, signoX, signoXF, par1, par2);
122
[X, Y] = normalizacion(k, X, Y, F);
123
case 4
124
disp('Algoritmo 4: vnnewton');
125
[k, X, Y, pasos] = vnnewton(F, signoX, signoXF, par1);
126
[X, Y] = normalizacion(k, X, Y, F);
127
case 5
128
disp('Algoritmo 5: vnpls');
129
[k, X, Y, pasos] = vnpls(F, signoX, signoXF, par1, par2);
130
case 6
131
disp('Algoritmo 6: vnsimplex');
132
[k, X, Y, pasos, sal2] = vnsimplex(F, signoX, signoXF, par1);
133
case 7
134
disp('Algoritmo 7: vnnolineal');
135
[k, X, Y, pasos, sal1] = vnnolineal(F, signoX, signoXF, par1, par2);
136
[X, Y] = normalizacion(k, X, Y, F);
137
case 8
138
disp('Algoritmo 8: vnbrody');
139
[k, X, Y] = vnbrody(F, signoX, signoXF);
140
[X, Y] = normalizacion(k, X, Y, F);
141
case 9
142
[k, Xsi, Ysi, u, pasos, kno, Xno, Yno] = cpbusqueda(F, signoX, signoXF, par1);
143
[X, Y] = normalizacion(k, Xsi, Yno, F);
144
if condicionesvn(k, X, Y, F, signoX, signoXF)
145
disp('Algoritmo 9: cpbusqueda');
146
else
147
[k, X, Y, pasos2] = vnbiseccion(F, signoX, signoXF, k, kno);
148
pasos = [pasos, pasos2];
149
[X, Y] = normalizacion(k, X, Y, F);
150
disp('Algoritmo 9: cpbusqueda -> vnbiseccion');
151
end
152
case 10
153
[k, X, Y, u, pasos] = cpbusqueda(F, signoX, signoXF, par1);
154
[X, Y] = normalizacion(k, X, Y, F);
155
if condicionesvn(k, X, Y, F, signoX, signoXF)
156
disp('Algoritmo 10: cpbusqueda');
157
else
158
[k, X, Y, pasos2] = vnpls(F, signoX, signoXF, k, X);
159
pasos = [pasos, pasos2];
160
disp('Algoritmo 10: cpbusqueda -> vnpls');
161
end
162
case 11
163
k0 = par1;
164
X = par2;
165
[k1, X, Y, pasos] = vnpls(F, signoX, signoXF, k0, X);
166
if condicionesvn(k1, X, Y, F, signoX, signoXF)
167
disp('Algoritmo 11: vnpls');
168
k = k1;
169
else
170
[ksi, Xsi, Ysi, usi, pasos2] = cpbusqueda(F, signoX, signoXF, k0);
171
pasos = [pasos, pasos2];
172
[X, Y] = normalizacion(ksi, Xsi, Ysi, F);
173
if condicionesvn(ksi, X, Y, F, signoX, signoXF)
174
disp('Algoritmo 11: vnpls; cpbusqueda');
175
k = ksi;
176
else
177
[k3, X, Y, pasos3] = vnpls(F, signoX, signoXF, ksi, Xsi);
178
pasos = [pasos, pasos3];
179
if condicionesvn(k3, X, Y, F, signoX, signoXF)
180
disp('Algoritmo 11: vnpls; cpbusqueda -> vnpls');
181
k = k3;
182
else
183
[kw, Xw, Yw, uw, pasos4, kno, Xno, Yno] = cpbusqueda(F, signoX, signoXF, ksi, 1); %busca un kno
184
pasos = [pasos, pasos4];
185
[X, Y] = normalizacion(ksi, Xsi, Yno, F);
186
if condicionesvn(ksi, X, Y, F, signoX, signoXF)
187
disp('Algoritmo 11: vnpls; cpbusqueda -> vnpls; cpbusqueda');
188
k = ksi;
189
else
190
[k, X, Y, pasos5] = vnbiseccion(F, signoX, signoXF, ksi, kno);
191
pasos = [pasos, pasos5];
192
[X, Y] = normalizacion(k, X, Y, F);
193
disp('Algoritmo 11: vnpls; cpbusqueda -> vnpls; cpbusqueda -> vnbiseccion');
194
end
195
end
196
end
197
end
198
otherwise
199
disp('Atenci�n, no hay ning�n algoritmo con ese n�mero');
200
end
201
202
numsoluciones = size(k, 2);
203
distancias = zeros(filas+columnas+1, 3, numsoluciones);
204
if numsoluciones == 0
205
disp('Atenci�n, no se ha encontrado ninguna soluci�n');
206
else
207
for c1 = 1:numsoluciones
208
[solucion, distancia, distanciatotal] = condicionesvn(k(c1), X(c1,:), Y(:,c1), F, signoX, signoXF);
209
if nargout > 4, distancias(:,:,c1) = distancia; end
210
if ~solucion
211
if numsoluciones > 1, q = [' ', num2str(c1), ' ']; else q = ' '; end
212
disp(['Atenci�n, la distancia de la soluci�n', q, 'a las condiciones de m�ximo, ', num2str(distanciatotal) , ', supera la prefijada.']);
213
end
214
end
215
end
216
217
218
219
220
221
222
223
224
225
226
function [X, Y, k] = normalizacion(k, X, Y, F, tipo)
227
if nargin < 5, tipo = 0; end
228
v = version;
229
for c1 = 1:size(k, 2)
230
if and(tipo == 1, v([1,2]) == '5.') %si vnautovalor y Matlab 5.0 ajustar a n�meros reales
231
w = max(abs(imag([k(c1), X(c1,:), Y(:,c1)'])));
232
if w > 1e-10, disp(['Atenci�n, la soluci�n ', num2str(c1) , ' conten�a t�rm�nos complejos de magnitud ', num2str(w), '.']); end
233
k(c1) = real(k(c1)); X(c1,:) = real(X(c1,:)); Y(:,c1) = real(Y(:,c1));
234
end
235
s = sum(abs(X(c1,:)));
236
if s > 0
237
X(c1,:) = X(c1,:) ./ s;
238
Y(:,c1) = Y(:,c1) .* s;
239
end
240
if tipo == 0 %si no vnautovalor
241
q = -X(c1,:) * forma1(F, k(c1)) * Y(:,c1);
242
if abs(q) > 0, Y(:,c1) = Y(:,c1) ./ q; end
243
end
244
end
245
246
247
248
249
function [k, X, Y] = quitarsolucionesrepetidas(kn, Xn, Yn)
250
if ~isempty(kn)
251
k = kn(1); X = Xn(1, :); Y = Yn(:, 1);
252
for c1 = 2:size(kn, 2)
253
poner = 1;
254
for c2 = 1:size(k, 2)
255
if sum(abs([kn(c1), Xn(c1,:), Yn(:,c1)'] - [k(c2), X(c2,:), Y(:,c2)'])) < 1e-12
256
poner = 0; break;
257
end
258
end
259
if poner, k = [k, kn(c1)]; X = [X; Xn(c1,:)]; Y = [Y, Yn(:,c1)]; end
260
end
261
else
262
k = []; X = []; Y = [];
263
end
264
265
266