function [solucion, distancia, distabs] = condicionesvn(k, X, Y, F, signoX, signoXF, cero)1%condicionesvn2% solucion = condicionesvn(k, X, Y, F, signoX, signoXF)3%4% Comprueba si se cumplen las condiciones de primer orden para VN5% X ~ 0 <-> F(k) Y ~ 0 X .* F(k) Y = 06% X F(k) ~ 0 <-> -Y ~ 0 X F(k) .* Y = 07% k > 0 1 + X F'(k) Y = 08%9% [solucion, distancia, distabs] = condicionesvn(k,X,Y,F,signoX,signoXF,cero)10% Devuelve la tabla con las distancias al cumplimiento de las condiciones11% [X~0, dL/dX~0, X�dL/dX; -Y~0, dL/dY~0, dL/dY�Y; k>0, dL/dk, k�dL/dk]12% k, X, Y factor, intensidades y valores soluci�n13% F recetas en tiempo discreto o continuo14% signoX signo de las intensidades; por defecto X >= 015% signoXF signo de los balances materiales; por defecto X F(k) = 016% cero precisi�n del cero (1e-10 por defecto)17% solucion es 1 si se cumplen las condiciones y 0 si no se cumplen18% distancia tabla con las distancias a las condiciones19% distabs suma de la magnitud absoluta de las distancias2021%necesita forma0.m, forma1.m2223if nargin < 5, signoX = []; end24if nargin < 6, signoXF = []; end25if nargin < 7, cero = []; end2627if isempty(cero), cero = 1e-10; end %define la precisi�n del cero28Fn = forma0(F, k); %calcula F(k)29[filas, columnas] = size(Fn); %establece el tama�o del problema30if isempty(signoX), signoX = 1; end %si no esta definido supone que X >= 031if size(signoX, 2) == 1, signoX = signoX*ones(1,filas); end32if isempty(signoXF), signoXF = 0; end %si no esta definido supone que X F(k) = 033if size(signoXF, 2) == 1, signoXF = signoXF*ones(1,columnas); end34signoY = signodual(signoXF, [3,1,2,0]); %establece los signos de Y35signoFY = signodual(signoX, [3,2,1,0]); %establece los signos de F(k) Y3637if nargout == 1 %si s�lo hay un argumento de salida38solucion = 0; %de entrada se supone que no hay soluci�n39if and(abs(imag(k)) < cero, real(k) > cero) %pero si k es real y positivo40if res(X, signoX, cero) %si X ~ 041if res(Y, signoY, cero) %si Y ~ 042if res(Fn*Y, signoFY, cero) %si dL/dX = F(k) Y ~ 043if res(X*Fn, signoXF, cero) %si dL/dY = X F(k) ~ 044if abs(X'.*(Fn*Y)) < cero %si X' � dL/dX = X' .* F(k) Y = 045if abs((X*Fn)'.*Y) < cero %si dL/dY � Y' = X F(k) .* Y' = 046if abs(1+X*forma1(F,k)*Y) < cero %si dL/dk = 1 + X F'(k) Y = 047solucion = 1; %entonces existe soluci�n48end49end50end51end52end53end54end55end56else %si hay varios argumentos de salida57XF = X * Fn; %calcula X * F(k)58FY = Fn * Y; %calcula F(k) * Y59XdFY = X * forma1(F, k) * Y; %calcula X * F'(k) * Y60distancia = [res2(X, signoX) , res2(FY, signoFY), X' .* FY ; %X ~ 0 F(k) Y ~ 0 X' � F(k) Y = 061res2(XF, signoXF), res2(Y, signoY) , XF' .* Y ; %X F(k) ~ 0 -Y ~ 0 X F(k) � Y' = 062res2(k, 1) , 1 + XdFY , k*(1+XdFY)]; %k > 0 1 + X F'(k) Y = 0 k � (1+X F'(k) Y) = 063solucion = sum(sum(abs(distancia)<cero)) == ((filas+columnas+1)*3);64distabs = sum(sum(abs(distancia)));65end6667686970function solucion = res(X, signoX, cero)71solucion = 1;72for c1 = 1:size(signoX, 2)73switch signoX(c1)74case 0, if abs(X(c1)) > cero, solucion = 0; break; end75case 1, if X(c1) < -cero, solucion = 0; break; end76case 2, if X(c1) > cero, solucion = 0; break; end77case 3,78end79end808182function distancia = res2(X, signoX)83n = size(signoX, 2);84distancia = zeros(n, 1);85for c1 = 1:n86switch signoX(c1)87case 0, distancia(c1) = X(c1);88case 1, if X(c1) < 0, distancia(c1) = X(c1); end89case 2, if X(c1) > 0, distancia(c1) = X(c1); end90case 3,91end92end939495function y = signodual(x, distancia)96y = distancia(x(:) + 1);979899