Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
162 views
1
function [F, T, gruposseparables, materias] = formapoligonal(nombrefuncion, msist, malet, maletodo, LB, UB, K, grado, potencia)
2
%formapoligonal
3
% F = formapoligonal(funcion)
4
%
5
% Obtiene unas recetas en tiempo discreto con la aproximaci�n poligonal a
6
% unas funciones de producci�n (en tiempo discreto o continuo)
7
%
8
% [F, T] = formapoligonal(funcion, msist, malet, maletodo, LB, UB, K, grado)
9
% funcion archivo con la definici�n de las funciones de producci�n
10
% msist muestras sistem�ticas por cada insumo
11
% malet muestras aleatorias por grupo separable
12
% maletodo muestras aleatorias para todos los insumos
13
% LB l�mite inferior para cada insumo (por defecto 0)
14
% UB limite superior para cada insumo (por defecto 1)
15
% K factores con formapolinomioinverso (s�lo con tiempo continuo)
16
% grado grado con formapolinomioinverso (s�lo con tiempo continuo)
17
% F aproximaci�n poligonal como recetas en tiempo discreto
18
% T matriz de conversi�n de intensidades a insumos
19
% msist y malet tambi�n pueden definirse como vectores para cada grupo
20
% separable, y LB y UB para cada insumo. En Octave con funciones en
21
% tiempo continuo hay que definir alg�n K.
22
%
23
% A partir de la X soluci�n de VN para F los insumos se obtienen con X*T.
24
% En el caso en tiempo discreto los flujos netos en el tiempo se obtienen
25
% con funcion(X*T); las materias se corresponden con las filas y el
26
% tiempo con las columnas. En el caso en tiempo continuo los flujos
27
% actualizados se obtienen con funcion(k, X*T).
28
29
%necesita formapolinomioinverso.m
30
31
if nargin < 2, msist = []; end
32
if nargin < 3, malet = []; end
33
if nargin < 4, maletodo = []; end
34
if nargin < 5, LB = []; end
35
if nargin < 6, UB = []; end
36
if nargin < 7, K = []; end
37
if nargin < 8, grado = []; end
38
if nargin < 9, potencia = []; end
39
40
v = version; %determina la versi�n del software
41
if and(exist('OCTAVE_VERSION'), str2num(v([1,3])) < 36) %con Octave en versiones inferiores a 3.6 (nargin necesita que la funci�n est� cargada)
42
if isempty(K), numarg = 1; else numarg = 2; end %define el caso en tiempo discreto si K no est� definido
43
else %si se usa Matlab u Octave 3.6 o superior
44
numarg = nargin(nombrefuncion); %define el caso en tiempo discreto por el n�mero de argumentos
45
end %
46
%
47
switch numarg %dependiendo de si el problema est� en tiempo discreto o continuo
48
case 1 %si el problema est� en tiempo discreto
49
[F, gruposseparables] = feval(nombrefuncion, zeros(1,10000)); %obtiene la variable gruposseparables
50
[materias, grado] = size(F); %determina el n�mero de materias y de pasos temporales
51
case 2 %si el problema est� en tiempo continuo
52
[F, gruposseparables] = feval(nombrefuncion,1,zeros(1,10000));%obtiene la variable gruposseparables
53
materias = size(F, 2); %determina el n�mero de materias
54
if isempty(K), K = 1; end %si K no est� definido es 1
55
if size(K(:),1) == 1, K = (K/2:K/5:K*3/2); end %si K es un escalar la aproximaci�n se efectua en [K/2, K*3/2] con 6 puntos
56
puntos = size(K, 2); %determina el n�mero de factores para los que se hace la aproximaci�n
57
if isempty(grado), grado = fix((puntos+3)/2); end %define el grado del polinomio inverso por defecto
58
end %
59
insumos = sum(gruposseparables); %establece el n�mero de insumos
60
numgrupos = size(gruposseparables, 2); %establece el n�mero de grupos de insumos separables
61
%
62
if isempty(msist), msist = 5; end %muestras sistem�ticas para cada insumo a variar en cada grupo separable por defecto
63
if isempty(malet), malet = 0; end %muestras aleatorias para cada grupo separable por defecto
64
if isempty(maletodo), maletodo = 0; end %muestras aleatorias para todos los insumos por defecto
65
if isempty(LB), LB = 0; end %establece el l�mite inferior para cada insumo por defecto
66
if isempty(UB), UB = 1; end %establece el l�mite superior para cada insumo por defecto
67
if isempty(potencia), potencia = 10; end %potencia a la que se elevan los insumos aleatorios por defecto
68
if size(msist,2) == 1, msist = msist.*ones(1,numgrupos); end %si las muestras sistem�ticas es un escalar lo aplica a todos los grupos
69
if size(malet,2) == 1, malet = malet.*ones(1,numgrupos); end %si las muestras aleatorias es un escalar lo aplica a todos los grupos
70
if size(LB, 2) == 1, LB = LB .* ones(1, insumos); end %si el l�mite inferior es un escalar lo aplica a todos los insumos
71
if size(UB, 2) == 1, UB = UB .* ones(1, insumos); end %si el l�mite superior es un escalar lo aplica a todos los insumos
72
UL = UB - LB; %determina la amplitud de los l�mites
73
T = []; %define la variable para almacenar los resultados
74
%========= aproximaci�n sistem�tica por cada grupo de insumos separables
75
Xinicio = 1; %Xinicio es la variable que describe el primer insumo del grupo separable
76
for c1 = 1:numgrupos %para cada grupo de insumos separables
77
Xfin = Xinicio + gruposseparables(c1) - 1; %Xfin es la variable que describe el �ltimo insumo del grupo separable
78
if msist(c1) > 0 %si queremos obtener alguna muestra del grupo separable
79
V = varia(gruposseparables(c1),msist(c1)) ./ msist(c1); %V es la variaci�n de msist muestras para los insumos en el grupo
80
sV = size(V, 1); %establece el n�mero de muestras
81
Xn = zeros(sV, insumos); %define Xn
82
for c2 = 1:sV %para cada muestra
83
Xn(c2,Xinicio:Xfin)=LB(Xinicio:Xfin)+V(c2,:).*UL(Xinicio:Xfin);%ajusta a LB y UB
84
end %
85
T = [T; Xn]; %almacena los insumos
86
end %
87
Xinicio = Xfin + 1; %establece Xinicio para el pr�ximo grupo separable
88
end %
89
%========= aproximaci�n aleatoria por cada grupo de insumos separables
90
Xinicio = 1; %Xinicio es la variable que describe el primer insumo del grupo separable
91
for c1 = 1:numgrupos %para cada grupo de insumos separables
92
Xfin = Xinicio + gruposseparables(c1) - 1; %Xfin es la variable que describe el �ltimo insumo del grupo separable
93
if malet(c1) > 0 %si queremos obtener alguna muestra del grupo separable
94
V = rand(malet(c1), Xfin-Xinicio+1) .^ potencia; %V es la variaci�n aleatoria de malet muestras para los insumos en el grupo
95
Xn = zeros(malet(c1), insumos); %define Xn
96
for c2 = 1:malet(c1) %para cada muestra
97
V(c2, :) = V(c2, :) ./ sum(V(c2, :)); %normaliza para que sume 1
98
Xn(c2,Xinicio:Xfin)=LB(Xinicio:Xfin)+V(c2,:).*UL(Xinicio:Xfin);%ajusta a LB y UB
99
end %
100
T = [T; Xn]; %almacena los insumos
101
end %
102
Xinicio = Xfin + 1; %establece Xinicio para el pr�ximo grupo separable
103
end %
104
%========= aproximaci�n aleatoria de todos los insumos
105
Xn = rand(maletodo, insumos) .^ potencia; %obtiene las muestras aleatorias para todos los inusmos
106
for c1 = 1:maletodo %para cada muestra
107
Xn(c1, :) = Xn(c1, :) ./ sum(Xn(c1, :)); %normaliza cada muestra para que sume 1
108
Xn(c1, :) = LB + Xn(c1, :) .* UL; %ajusta a LB y UB
109
end %
110
T = [T; Xn]; %almacena los insumos
111
%========= calcula las recetas con los flujos netos
112
procesos = size(T, 1); %establece el n�mero de procesos
113
F = zeros(procesos, materias, grado); %define las matrices de flujos netos
114
for c1 = 1:procesos %para cada proceso
115
switch numarg %dependiendo de si el problema est� en tiempo discreto o continuo
116
case 1, F(c1,:,:) = feval(nombrefuncion, T(c1, :)); %establece los flujos netos para el caso en tiempo discreto
117
case 2, F(c1,:,:) = formapolinomioinverso(nombrefuncion, K, grado, T(c1, :)); %aproxima los flujos netos para el caso en tiempo continuo
118
end %
119
end %
120
121
122
123
124
function P = varia(columnas, n)
125
if columnas == 1
126
P = n;
127
elseif columnas == 2 %no es estrictamente necesario
128
P = zeros(n+1, 2);
129
R = (0:n)';
130
P(:, 1) = n - R;
131
P(:, 2) = R;
132
else
133
P = [];
134
for c1 = 0:n
135
P2 = varia(columnas-1, n-c1);
136
q = size(P2, 1);
137
P = [c1*ones(q,1), P2; P];
138
end
139
end
140
141