Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
162 views
1
function [k, X, Y, pasos, mu] = vnpls(F, signoX, signoXF, k, X)
2
%vnpls
3
% [k, X, Y] = vnpls(F)
4
%
5
% Busca la soluci�n de VN mediante la programaci�n lineal secuencial.
6
% Resuelve sucesivamente la aproximaci�n lineal de VN
7
% max k min -mu
8
% X F(kn) + k Xn F'(kn) - kn Xn F'(kn) ~ 0 -Y ~ 0
9
% sum(X) - 1 = 0 -mu >=< 0
10
% X ~ 0 F(kn) Y + mu ~ 0
11
% k >= 0 1 + Xn F'(kn) Y <= 0
12
% hasta que las variables converjan.
13
%
14
% [k, X, Y] = vnpls(F, signoX, signoXF, k0, X0)
15
% F recetas en tiempo discreto o continuo
16
% signoX signo de las intensidades; por defecto X >= 0
17
% signoXF signo de los balances materiales; por defecto X F(k) = 0
18
% k0 factor con el que se inicia la iteraci�n
19
% X0 intensidades con las que se inicia la iteraci�n
20
% k, X, Y factor, intensidades y valores soluci�n
21
%
22
% Los c�digos para los signos son 0 = 1 >= 2 <= 3 >=<
23
24
% necesita forma0.m, forma1.m, programalineal.m
25
26
if nargin < 2, signoX = []; end
27
if nargin < 3, signoXF = []; end
28
if nargin < 4, k = []; end
29
if nargin < 5, X = []; end
30
31
cerosalida = 1e-14; %define la precisi�n del cero
32
if isempty(k), k = 1; end %define kn como 1 si no lo est� ya
33
Fn = forma0(F, k); %calcula F(kn)
34
[filas, columnas] = size(Fn); %determina el tama�o del problema
35
if isempty(X), X = ones(1, filas) ./ filas; end %define Xn si no lo est� ya
36
C = [zeros(filas, 1); 1]; %define la funci�n objetivo como 0 X + 1 k
37
Aeq = [ones(filas, 1); 0]; %define la normalizaci�n sum(X) - 1 = 0
38
Deq = -1; %
39
if ~isempty(signoX), Aeq(signoX==2) = -1; end %si X <= 0 adecua la normalizaci�n
40
for pasos = 1:50 %inicia una iteraci�n de hasta 50 pasos
41
memvar = [k, X]; %almacena las variables
42
XDFn = X * forma1(F, k); %calcula Xn F'(kn)
43
A = [Fn; XDFn]; %define |X, k| |F(kn) | + |-kn Xn F'(kn)|
44
D = -k * XDFn; % |Xn F'(kn)|
45
[U,Z]=programalineal([A,Aeq],C,[D,Deq],[signoX,1],[signoXF,0]); %resuelve el programa lineal
46
X=U(1:filas); k=U(filas+1); Y=Z(1:columnas); mu=Z(columnas+1); %extrae las variables de la soluci�n
47
if abs([k, X] - memvar) < cerosalida, return; end %si las variables cambian poco interrumpe
48
Fn = forma0(F, k); %calcula F(kn)
49
end %repite la iteraci�n
50
disp('Atenci�n, se ha superado el m�ximo de iteraciones'); %avisa de que se ha superado el m�ximo de iteraciones
51
52
53