function [F, T, gruposseparables, materias] = formapoligonal(nombrefuncion, msist, malet, maletodo, LB, UB, K, grado, potencia)1%formapoligonal2% F = formapoligonal(funcion)3%4% Obtiene unas recetas en tiempo discreto con la aproximaci�n poligonal a5% unas funciones de producci�n (en tiempo discreto o continuo)6%7% [F, T] = formapoligonal(funcion, msist, malet, maletodo, LB, UB, K, grado)8% funcion archivo con la definici�n de las funciones de producci�n9% msist muestras sistem�ticas por cada insumo10% malet muestras aleatorias por grupo separable11% maletodo muestras aleatorias para todos los insumos12% LB l�mite inferior para cada insumo (por defecto 0)13% UB limite superior para cada insumo (por defecto 1)14% K factores con formapolinomioinverso (s�lo con tiempo continuo)15% grado grado con formapolinomioinverso (s�lo con tiempo continuo)16% F aproximaci�n poligonal como recetas en tiempo discreto17% T matriz de conversi�n de intensidades a insumos18% msist y malet tambi�n pueden definirse como vectores para cada grupo19% separable, y LB y UB para cada insumo. En Octave con funciones en20% tiempo continuo hay que definir alg�n K.21%22% A partir de la X soluci�n de VN para F los insumos se obtienen con X*T.23% En el caso en tiempo discreto los flujos netos en el tiempo se obtienen24% con funcion(X*T); las materias se corresponden con las filas y el25% tiempo con las columnas. En el caso en tiempo continuo los flujos26% actualizados se obtienen con funcion(k, X*T).2728%necesita formapolinomioinverso.m2930if nargin < 2, msist = []; end31if nargin < 3, malet = []; end32if nargin < 4, maletodo = []; end33if nargin < 5, LB = []; end34if nargin < 6, UB = []; end35if nargin < 7, K = []; end36if nargin < 8, grado = []; end37if nargin < 9, potencia = []; end3839v = version; %determina la versi�n del software40if 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)41if isempty(K), numarg = 1; else numarg = 2; end %define el caso en tiempo discreto si K no est� definido42else %si se usa Matlab u Octave 3.6 o superior43numarg = nargin(nombrefuncion); %define el caso en tiempo discreto por el n�mero de argumentos44end %45%46switch numarg %dependiendo de si el problema est� en tiempo discreto o continuo47case 1 %si el problema est� en tiempo discreto48[F, gruposseparables] = feval(nombrefuncion, zeros(1,10000)); %obtiene la variable gruposseparables49[materias, grado] = size(F); %determina el n�mero de materias y de pasos temporales50case 2 %si el problema est� en tiempo continuo51[F, gruposseparables] = feval(nombrefuncion,1,zeros(1,10000));%obtiene la variable gruposseparables52materias = size(F, 2); %determina el n�mero de materias53if isempty(K), K = 1; end %si K no est� definido es 154if 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 puntos55puntos = size(K, 2); %determina el n�mero de factores para los que se hace la aproximaci�n56if isempty(grado), grado = fix((puntos+3)/2); end %define el grado del polinomio inverso por defecto57end %58insumos = sum(gruposseparables); %establece el n�mero de insumos59numgrupos = size(gruposseparables, 2); %establece el n�mero de grupos de insumos separables60%61if isempty(msist), msist = 5; end %muestras sistem�ticas para cada insumo a variar en cada grupo separable por defecto62if isempty(malet), malet = 0; end %muestras aleatorias para cada grupo separable por defecto63if isempty(maletodo), maletodo = 0; end %muestras aleatorias para todos los insumos por defecto64if isempty(LB), LB = 0; end %establece el l�mite inferior para cada insumo por defecto65if isempty(UB), UB = 1; end %establece el l�mite superior para cada insumo por defecto66if isempty(potencia), potencia = 10; end %potencia a la que se elevan los insumos aleatorios por defecto67if size(msist,2) == 1, msist = msist.*ones(1,numgrupos); end %si las muestras sistem�ticas es un escalar lo aplica a todos los grupos68if size(malet,2) == 1, malet = malet.*ones(1,numgrupos); end %si las muestras aleatorias es un escalar lo aplica a todos los grupos69if size(LB, 2) == 1, LB = LB .* ones(1, insumos); end %si el l�mite inferior es un escalar lo aplica a todos los insumos70if size(UB, 2) == 1, UB = UB .* ones(1, insumos); end %si el l�mite superior es un escalar lo aplica a todos los insumos71UL = UB - LB; %determina la amplitud de los l�mites72T = []; %define la variable para almacenar los resultados73%========= aproximaci�n sistem�tica por cada grupo de insumos separables74Xinicio = 1; %Xinicio es la variable que describe el primer insumo del grupo separable75for c1 = 1:numgrupos %para cada grupo de insumos separables76Xfin = Xinicio + gruposseparables(c1) - 1; %Xfin es la variable que describe el �ltimo insumo del grupo separable77if msist(c1) > 0 %si queremos obtener alguna muestra del grupo separable78V = varia(gruposseparables(c1),msist(c1)) ./ msist(c1); %V es la variaci�n de msist muestras para los insumos en el grupo79sV = size(V, 1); %establece el n�mero de muestras80Xn = zeros(sV, insumos); %define Xn81for c2 = 1:sV %para cada muestra82Xn(c2,Xinicio:Xfin)=LB(Xinicio:Xfin)+V(c2,:).*UL(Xinicio:Xfin);%ajusta a LB y UB83end %84T = [T; Xn]; %almacena los insumos85end %86Xinicio = Xfin + 1; %establece Xinicio para el pr�ximo grupo separable87end %88%========= aproximaci�n aleatoria por cada grupo de insumos separables89Xinicio = 1; %Xinicio es la variable que describe el primer insumo del grupo separable90for c1 = 1:numgrupos %para cada grupo de insumos separables91Xfin = Xinicio + gruposseparables(c1) - 1; %Xfin es la variable que describe el �ltimo insumo del grupo separable92if malet(c1) > 0 %si queremos obtener alguna muestra del grupo separable93V = rand(malet(c1), Xfin-Xinicio+1) .^ potencia; %V es la variaci�n aleatoria de malet muestras para los insumos en el grupo94Xn = zeros(malet(c1), insumos); %define Xn95for c2 = 1:malet(c1) %para cada muestra96V(c2, :) = V(c2, :) ./ sum(V(c2, :)); %normaliza para que sume 197Xn(c2,Xinicio:Xfin)=LB(Xinicio:Xfin)+V(c2,:).*UL(Xinicio:Xfin);%ajusta a LB y UB98end %99T = [T; Xn]; %almacena los insumos100end %101Xinicio = Xfin + 1; %establece Xinicio para el pr�ximo grupo separable102end %103%========= aproximaci�n aleatoria de todos los insumos104Xn = rand(maletodo, insumos) .^ potencia; %obtiene las muestras aleatorias para todos los inusmos105for c1 = 1:maletodo %para cada muestra106Xn(c1, :) = Xn(c1, :) ./ sum(Xn(c1, :)); %normaliza cada muestra para que sume 1107Xn(c1, :) = LB + Xn(c1, :) .* UL; %ajusta a LB y UB108end %109T = [T; Xn]; %almacena los insumos110%========= calcula las recetas con los flujos netos111procesos = size(T, 1); %establece el n�mero de procesos112F = zeros(procesos, materias, grado); %define las matrices de flujos netos113for c1 = 1:procesos %para cada proceso114switch numarg %dependiendo de si el problema est� en tiempo discreto o continuo115case 1, F(c1,:,:) = feval(nombrefuncion, T(c1, :)); %establece los flujos netos para el caso en tiempo discreto116case 2, F(c1,:,:) = formapolinomioinverso(nombrefuncion, K, grado, T(c1, :)); %aproxima los flujos netos para el caso en tiempo continuo117end %118end %119120121122123function P = varia(columnas, n)124if columnas == 1125P = n;126elseif columnas == 2 %no es estrictamente necesario127P = zeros(n+1, 2);128R = (0:n)';129P(:, 1) = n - R;130P(:, 2) = R;131else132P = [];133for c1 = 0:n134P2 = varia(columnas-1, n-c1);135q = size(P2, 1);136P = [c1*ones(q,1), P2; P];137end138end139140141