Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
162 views
1
function [solucion, distancia, distabs] = condicionesvn(k, X, Y, F, signoX, signoXF, cero)
2
%condicionesvn
3
% solucion = condicionesvn(k, X, Y, F, signoX, signoXF)
4
%
5
% Comprueba si se cumplen las condiciones de primer orden para VN
6
% X ~ 0 <-> F(k) Y ~ 0 X .* F(k) Y = 0
7
% X F(k) ~ 0 <-> -Y ~ 0 X F(k) .* Y = 0
8
% k > 0 1 + X F'(k) Y = 0
9
%
10
% [solucion, distancia, distabs] = condicionesvn(k,X,Y,F,signoX,signoXF,cero)
11
% Devuelve la tabla con las distancias al cumplimiento de las condiciones
12
% [X~0, dL/dX~0, X�dL/dX; -Y~0, dL/dY~0, dL/dY�Y; k>0, dL/dk, k�dL/dk]
13
% k, X, Y factor, intensidades y valores soluci�n
14
% F recetas en tiempo discreto o continuo
15
% signoX signo de las intensidades; por defecto X >= 0
16
% signoXF signo de los balances materiales; por defecto X F(k) = 0
17
% cero precisi�n del cero (1e-10 por defecto)
18
% solucion es 1 si se cumplen las condiciones y 0 si no se cumplen
19
% distancia tabla con las distancias a las condiciones
20
% distabs suma de la magnitud absoluta de las distancias
21
22
%necesita forma0.m, forma1.m
23
24
if nargin < 5, signoX = []; end
25
if nargin < 6, signoXF = []; end
26
if nargin < 7, cero = []; end
27
28
if isempty(cero), cero = 1e-10; end %define la precisi�n del cero
29
Fn = forma0(F, k); %calcula F(k)
30
[filas, columnas] = size(Fn); %establece el tama�o del problema
31
if isempty(signoX), signoX = 1; end %si no esta definido supone que X >= 0
32
if size(signoX, 2) == 1, signoX = signoX*ones(1,filas); end
33
if isempty(signoXF), signoXF = 0; end %si no esta definido supone que X F(k) = 0
34
if size(signoXF, 2) == 1, signoXF = signoXF*ones(1,columnas); end
35
signoY = signodual(signoXF, [3,1,2,0]); %establece los signos de Y
36
signoFY = signodual(signoX, [3,2,1,0]); %establece los signos de F(k) Y
37
38
if nargout == 1 %si s�lo hay un argumento de salida
39
solucion = 0; %de entrada se supone que no hay soluci�n
40
if and(abs(imag(k)) < cero, real(k) > cero) %pero si k es real y positivo
41
if res(X, signoX, cero) %si X ~ 0
42
if res(Y, signoY, cero) %si Y ~ 0
43
if res(Fn*Y, signoFY, cero) %si dL/dX = F(k) Y ~ 0
44
if res(X*Fn, signoXF, cero) %si dL/dY = X F(k) ~ 0
45
if abs(X'.*(Fn*Y)) < cero %si X' � dL/dX = X' .* F(k) Y = 0
46
if abs((X*Fn)'.*Y) < cero %si dL/dY � Y' = X F(k) .* Y' = 0
47
if abs(1+X*forma1(F,k)*Y) < cero %si dL/dk = 1 + X F'(k) Y = 0
48
solucion = 1; %entonces existe soluci�n
49
end
50
end
51
end
52
end
53
end
54
end
55
end
56
end
57
else %si hay varios argumentos de salida
58
XF = X * Fn; %calcula X * F(k)
59
FY = Fn * Y; %calcula F(k) * Y
60
XdFY = X * forma1(F, k) * Y; %calcula X * F'(k) * Y
61
distancia = [res2(X, signoX) , res2(FY, signoFY), X' .* FY ; %X ~ 0 F(k) Y ~ 0 X' � F(k) Y = 0
62
res2(XF, signoXF), res2(Y, signoY) , XF' .* Y ; %X F(k) ~ 0 -Y ~ 0 X F(k) � Y' = 0
63
res2(k, 1) , 1 + XdFY , k*(1+XdFY)]; %k > 0 1 + X F'(k) Y = 0 k � (1+X F'(k) Y) = 0
64
solucion = sum(sum(abs(distancia)<cero)) == ((filas+columnas+1)*3);
65
distabs = sum(sum(abs(distancia)));
66
end
67
68
69
70
71
function solucion = res(X, signoX, cero)
72
solucion = 1;
73
for c1 = 1:size(signoX, 2)
74
switch signoX(c1)
75
case 0, if abs(X(c1)) > cero, solucion = 0; break; end
76
case 1, if X(c1) < -cero, solucion = 0; break; end
77
case 2, if X(c1) > cero, solucion = 0; break; end
78
case 3,
79
end
80
end
81
82
83
function distancia = res2(X, signoX)
84
n = size(signoX, 2);
85
distancia = zeros(n, 1);
86
for c1 = 1:n
87
switch signoX(c1)
88
case 0, distancia(c1) = X(c1);
89
case 1, if X(c1) < 0, distancia(c1) = X(c1); end
90
case 2, if X(c1) > 0, distancia(c1) = X(c1); end
91
case 3,
92
end
93
end
94
95
96
function y = signodual(x, distancia)
97
y = distancia(x(:) + 1);
98
99