Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
162 views
1
function [X, Y, exit] = programalinealaux(F, C, D, signoX, signoXF, tipo)
2
%programalinealaux
3
%
4
% Funci�n auxiliar de programalineal.m. Lanza los problemas en Octave y
5
% en las versiones superiores de Matlab.
6
7
switch tipo
8
case 1
9
[X, Y, exit] = programalinealoctave(F, C, D, signoX, signoXF);
10
case 2
11
[X, Y, exit] = programalinealmatlab(F, C, D, signoX, signoXF);
12
end
13
14
15
16
function [X, Y, exit] = programalinealoctave(F, C, D, signoX, signoXF)
17
[filas, columnas] = size(F);
18
filasn = filas - sum(signoX == 0);
19
LB = zeros(1, filasn); UB = zeros(1, filasn); Fn = zeros(filasn, columnas); Cn = zeros(filasn, 1);
20
c2 = 1;
21
for c1 = 1:filas
22
switch signoX(c1)
23
case 0,
24
case 1, LB(c2) = 0 ; UB(c2) = Inf; Fn(c2,:) = F(c1,:); Cn(c2) = C(c1); c2 = c2 + 1;
25
case 2, LB(c2) = -Inf; UB(c2) = 0 ; Fn(c2,:) = F(c1,:); Cn(c2) = C(c1); c2 = c2 + 1;
26
case 3, LB(c2) = -Inf; UB(c2) = Inf; Fn(c2,:) = F(c1,:); Cn(c2) = C(c1); c2 = c2 + 1;
27
end
28
end
29
CTYPE = '';
30
for c1 = 1:columnas
31
switch signoXF(c1)
32
case 0, CTYPE = [CTYPE, 'S'];
33
case 1, CTYPE = [CTYPE, 'L'];
34
case 2, CTYPE = [CTYPE, 'U'];
35
case 3, CTYPE = [CTYPE, 'F'];
36
end
37
end
38
[Xn, FVAL, STATUS, EXTRA] = glpk(-Cn', Fn', -D', LB, UB, CTYPE);
39
X = zeros(1, filas);
40
c0 = 1;
41
for c1 = 1:filas
42
switch signoX(c1)
43
case 0,
44
case 1, X(c1) = Xn(c0); c0 = c0 + 1;
45
case 2, X(c1) = Xn(c0); c0 = c0 + 1;
46
case 3, X(c1) = Xn(c0); c0 = c0 + 1;
47
end
48
end
49
Y = EXTRA.lambda;
50
switch STATUS
51
case 180, exit = 1;
52
case 182, exit = -2;
53
case 183, exit = -2;
54
case 184, exit = -3;
55
case 151, exit = 1;
56
otherwise, exit = 0;
57
end
58
59
60
61
62
63
64
65
66
function [X, Y, exit] = programalinealmatlab(F, C, D, signoX, signoXF)
67
[filas, columnas] = size(F);
68
filasn = filas - sum(signoX == 0);
69
LB = zeros(1, filasn); UB = zeros(1, filasn); Fn = zeros(filasn, columnas); Cn = zeros(filasn, 1);
70
c2 = 1;
71
for c1 = 1:filas
72
switch signoX(c1)
73
case 0,
74
case 1, LB(c2) = 0 ; UB(c2) = Inf; Fn(c2,:) = F(c1,:); Cn(c2) = C(c1); c2 = c2 + 1;
75
case 2, LB(c2) = -Inf; UB(c2) = 0 ; Fn(c2,:) = F(c1,:); Cn(c2) = C(c1); c2 = c2 + 1;
76
case 3, LB(c2) = -Inf; UB(c2) = Inf; Fn(c2,:) = F(c1,:); Cn(c2) = C(c1); c2 = c2 + 1;
77
end
78
end
79
numeq = sum(signoXF == 0);
80
numin = columnas - numeq;
81
Aeq = zeros(filasn, numeq); Deq = zeros(1, numeq);
82
Ain = zeros(filasn, numin); Din = zeros(1, numin);
83
ceq = 1; cin = 1;
84
for c1 = 1:columnas
85
switch signoXF(c1)
86
case 0, Aeq(:, ceq) = Fn(:,c1); Deq(ceq) = D(c1); ceq = ceq + 1;
87
case 1, Ain(:, cin) = Fn(:,c1); Din(cin) = D(c1); cin = cin + 1;
88
case 2, Ain(:, cin) = -Fn(:,c1); Din(cin) = -D(c1); cin = cin + 1;
89
case 3
90
end
91
end
92
options = optimset('Display','off', 'TolFun', 1e-12, 'TolX', 1e-12);
93
[Xn,FVAL,EXITFLAG,OUTPUT,LAMBDA] = linprog(-Cn', -Ain', Din', -Aeq', Deq', LB, UB, [], options);
94
X = zeros(1, filas);
95
c0 = 1;
96
for c1 = 1:filas
97
switch signoX(c1)
98
case 0,
99
case 1, X(c1) = Xn(c0); c0 = c0 + 1;
100
case 2, X(c1) = Xn(c0); c0 = c0 + 1;
101
case 3, X(c1) = Xn(c0); c0 = c0 + 1;
102
end
103
end
104
Y = zeros(columnas, 1);
105
ci0 = 1; ce0 = 1;
106
for c1 = 1:columnas
107
switch signoXF(c1)
108
case 0, Y(c1) = LAMBDA.eqlin(ce0); ce0 = ce0 + 1;
109
case 1, Y(c1) = LAMBDA.ineqlin(ci0); ci0 = ci0 + 1;
110
case 2, Y(c1) = -LAMBDA.ineqlin(ci0); ci0 = ci0 + 1;
111
case 3
112
end
113
end
114
exit = EXITFLAG;
115
116