Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
162 views
1
function [F, signoX, signoXF] = formaproblema(F, signoX, signoXF, problema)
2
%formaproblema
3
% Fn = formaproblema(F, signoX, signoXF, problema)
4
%
5
% Convierte unas recetas a la forma est�ndar, X >= 0 y X F(k) = 0, o a la
6
% forma can�nica, X >=0 y X F(k) >= 0.
7
% F recetas originales en tiempo discreto
8
% signoX signo de las intensidades; por defecto X >= 0
9
% signoXF signo de los balances materiales; por defecto X F(k) = 0
10
% problema [] para la forma est�ndar y 1 para la forma can�nica
11
% Fn recetas transformadas en tiempo discreto
12
13
if nargin < 2, signoX = []; end
14
if nargin < 3, signoXF = []; end
15
if nargin < 4, problema = []; end
16
17
[filas, columnas, ancho] = size(F);
18
if isempty(signoX), signoX = 1; end
19
if isempty(signoXF), signoXF = 0; end
20
if size(signoX, 2) == 1, signoX = signoX.*ones(1, filas); end
21
if size(signoXF, 2) == 1, signoXF = signoXF.*ones(1, columnas); end
22
23
if isempty(problema)
24
F = formaestandar(F, signoX, signoXF, filas, columnas, ancho);
25
elseif problema == 1
26
F = formacanonica(F, signoX, signoXF, filas, columnas, ancho);
27
end
28
29
30
31
32
function [Fn] = formaestandar(F, signoX, signoXF, filas, columnas, ancho)
33
if and(sum(signoX==1) == filas, sum(signoXF==0) == columnas)
34
Fn = F;
35
return
36
end
37
filasn = sum(signoX == 1) + sum(signoX == 2) + 2*sum(signoX == 3) + sum(signoXF == 1) + sum(signoXF == 2) + 2*sum(signoXF == 3);
38
Fn = zeros(filasn, columnas, ancho);
39
if sum(signoX == 1) == filas
40
Fn(1:filas,:,:) = F(1:filas,:,:);
41
c2 = filas + 1;
42
else
43
c2 = 1;
44
for c1 = 1:filas
45
switch signoX(c1)
46
case 0
47
case 1, Fn(c2, :, :) = F(c1, :, :); c2 = c2 + 1;
48
case 2, Fn(c2, :, :) = -F(c1, :, :); c2 = c2 + 1;
49
case 3, Fn(c2, :, :) = F(c1, :, :); Fn(c2+1, :, :) = -F(c1, :, :); c2 = c2 + 2;
50
end
51
end
52
end
53
if sum(signoXF == 0) ~= columnas
54
for c1 = 1:columnas
55
switch signoXF(c1)
56
case 0
57
case 1, Fn(c2, c1, 1) = -1; c2 = c2 + 1;
58
case 2, Fn(c2, c1, 1) = 1; c2 = c2 + 1;
59
case 3, Fn(c2, c1, 1) = -1; Fn(c2+1, c1, 1) = 1; c2 = c2 + 2;
60
end
61
end
62
end
63
64
65
66
67
68
function Fm = formacanonica(F, signoX, signoXF, filas, columnas, ancho)
69
if and(sum(signoX==1) == filas, sum(signoXF==1) == columnas)
70
Fm = F;
71
return
72
end
73
filasn = sum(signoX == 1) + sum(signoX == 2) + 2*sum(signoX == 3);
74
columnasn = 2*sum(signoXF == 0) + sum(signoXF == 1) + sum(signoXF == 2);
75
if sum(signoX == 1) == filas
76
Fn = F;
77
else
78
Fn = zeros(filasn, columnas, ancho);
79
c2 = 1;
80
for c1 = 1:filas
81
switch signoX(c1)
82
case 0
83
case 1, Fn(c2, :, :) = F(c1, :, :); c2 = c2 + 1;
84
case 2, Fn(c2, :, :) = -F(c1, :, :); c2 = c2 + 1;
85
case 3, Fn(c2, :, :) = F(c1, :, :); Fn(c2+1, :, :) = -F(c1, :, :); c2 = c2 + 2;
86
end
87
end
88
end
89
if sum(signoXF == 1) == columnas
90
Fm = Fn;
91
else
92
Fm = zeros(filasn, columnasn, ancho);
93
c2 = 1;
94
for c1 = 1:columnas
95
switch signoXF(c1)
96
case 0, Fm(:, c2, :) = Fn(:, c1, :); Fm(:, c2+1, :) = -Fn(:, c1, :); c2 = c2 + 2;
97
case 1, Fm(:, c2, :) = Fn(:, c1, :); c2 = c2 + 1;
98
case 2, Fm(:, c2, :) = -Fn(:, c1, :); c2 = c2 + 1;
99
case 3
100
end
101
end
102
end
103
104