Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
162 views
1
function [X, Y, exit] = programalineal(F, C, D, signoX, signoXF)
2
%programalineal
3
% [X, Y] = programalineal(F, C, D)
4
%
5
% Lanza las funciones correspondientes en cada software para obtener la
6
% soluci�n del programa lineal
7
% Max X C Min D Y
8
% D + X F ~ 0 <-> -Y ~ 0 (D + X F) .* Y' = 0
9
% X ~ 0 <-> C + F Y ~ 0 X' .* (C + F Y) = 0
10
%
11
% [X, Y, exit] = programalineal(F, C, D, signoX, signoXF)
12
% F matriz m*n
13
% C vector columna m*1
14
% D vector fila 1*n
15
% signoX signo de las variables; por defecto X >= 0
16
% signoXF signo de las restricciones; por defecto D + X F = 0
17
% X vector fila 1*m de variables
18
% Y vector columnas n*1 de multiplicadores de Lagrange
19
% exit si es 1 la soluci�n cumple las condiciones del programa
20
%
21
% Los c�digos para los signos son 0 = 1 >= 2 <= 3 >=<
22
23
%necesita programalinealaux.m
24
25
if nargin < 1, F = []; end
26
if nargin < 2, C = []; end
27
if nargin < 3, D = []; end
28
if nargin < 4, signoX = []; end
29
if nargin < 5, signoXF = []; end
30
31
[filas, columnas] = size(F);
32
if isempty(C), C = zeros(filas, 1); end
33
if isempty(D), D = zeros(1, columnas); end
34
if isempty(signoX), signoX = 1; end
35
if isempty(signoXF), signoXF = 0; end
36
if size(signoX, 2) == 1, signoX = signoX .* ones(1, filas); end
37
if size(signoXF, 2) == 1, signoXF = signoXF .* ones(1, columnas); end
38
39
homogeneo = (sum(abs(C))+sum(abs(D))) == 0; %establece si el programa es homog�neo
40
if exist('OCTAVE_VERSION') %si se usa Octave
41
if homogeneo %si el programa es homog�neo
42
[X, Y, exit] = programalinealhomogeneo(F, signoX, signoXF); %
43
else %si no es homog�neo
44
[X, Y, exit] = programalinealaux(F, C, D, signoX, signoXF, 1); %
45
end %
46
else %si se usa Matlab
47
v = version; %determina la versi�n del software que se usa
48
if v([1,2]) == '5.' %si la versi�n es la 5
49
if homogeneo %si el programa es homog�neo
50
[X, Y, exit] = programalinealhomogeneo(F, signoX, signoXF); %
51
else %si no es homog�neo
52
[X, Y, exit] = programalinealmatlab5(F, C, D, signoX, signoXF); %
53
end %
54
else %si es otra versi�n
55
[X, Y, exit] = programalinealaux(F, C, D, signoX, signoXF, 2); %
56
end %
57
end %
58
59
60
61
62
function [X, Y, exit] = programalinealhomogeneo(F, signoX, signoXF)
63
cero = 1e-14;
64
[u, X, Y] = cpdistancia(F, signoX, signoXF);
65
if u > cero, Y = Y .* 0; elseif u < -cero, X = X .* 0; end
66
exit = 1;
67
68
69
70
71
function [X, Y, exit] = programalinealmatlab5(F, C, D, signoX, signoXF)
72
[filas, columnas] = size(F);
73
filasn = filas - sum(signoX == 0);
74
LB = zeros(1, filasn); UB = zeros(1, filasn); Fn = zeros(filasn, columnas); Cn = zeros(filasn, 1);
75
c2 = 1;
76
for c1 = 1:filas
77
switch signoX(c1)
78
case 0,
79
case 1, LB(c2) = 0 ; UB(c2) = Inf; Fn(c2,:) = F(c1,:); Cn(c2) = C(c1); c2 = c2 + 1;
80
case 2, LB(c2) = -Inf; UB(c2) = 0 ; Fn(c2,:) = F(c1,:); Cn(c2) = C(c1); c2 = c2 + 1;
81
case 3, LB(c2) = -Inf; UB(c2) = Inf; Fn(c2,:) = F(c1,:); Cn(c2) = C(c1); c2 = c2 + 1;
82
end
83
end
84
numeq = sum(signoXF == 0);
85
numin = columnas + numeq;
86
Ain = zeros(filasn, numin); Din = zeros(1, numin);
87
cin = 1;
88
for c1 = 1:columnas
89
switch signoXF(c1)
90
case 0, Ain(:, cin) = Fn(:,c1); Din(cin) = D(c1); Ain(:, cin+1) = -Fn(:,c1); Din(cin+1) = -D(c1); cin = cin + 2;
91
case 1, Ain(:, cin) = Fn(:,c1); Din(cin) = D(c1); cin = cin + 1;
92
case 2, Ain(:, cin) = -Fn(:,c1); Din(cin) = -D(c1); cin = cin + 1;
93
case 3
94
end
95
end
96
[Xn, Yn, HOW] = lp(-Cn', -Ain', Din', LB, UB, [], 0, -1);
97
X = zeros(1, filas);
98
c0 = 1;
99
for c1 = 1:filas
100
switch signoX(c1)
101
case 0,
102
case 1, X(c1) = Xn(c0); c0 = c0 + 1;
103
case 2, X(c1) = Xn(c0); c0 = c0 + 1;
104
case 3, X(c1) = Xn(c0); c0 = c0 + 1;
105
end
106
end
107
Y = zeros(columnas, 1);
108
ci0 = 1;
109
for c1 = 1:columnas
110
switch signoXF(c1)
111
case 0, Y(c1) = Yn(ci0) - Yn(ci0+1); ci0 = ci0 + 2;
112
case 1, Y(c1) = Yn(ci0) ; ci0 = ci0 + 1;
113
case 2, Y(c1) = -Yn(ci0) ; ci0 = ci0 + 1;
114
case 3
115
end
116
end
117
switch HOW
118
case 'ok', exit = 1;
119
case 'infeasible', exit = -2;
120
case 'unbounded', exit = -3;
121
case 'unrealiable', exit = -4;
122
case 'illposed', exit = -7;
123
otherwise, exit = 0;
124
end
125
126