function [k, X, Y, pasos, mu] = vnpls(F, signoX, signoXF, k, X)1%vnpls2% [k, X, Y] = vnpls(F)3%4% Busca la soluci�n de VN mediante la programaci�n lineal secuencial.5% Resuelve sucesivamente la aproximaci�n lineal de VN6% max k min -mu7% X F(kn) + k Xn F'(kn) - kn Xn F'(kn) ~ 0 -Y ~ 08% sum(X) - 1 = 0 -mu >=< 09% X ~ 0 F(kn) Y + mu ~ 010% k >= 0 1 + Xn F'(kn) Y <= 011% hasta que las variables converjan.12%13% [k, X, Y] = vnpls(F, signoX, signoXF, k0, X0)14% F recetas en tiempo discreto o continuo15% signoX signo de las intensidades; por defecto X >= 016% signoXF signo de los balances materiales; por defecto X F(k) = 017% k0 factor con el que se inicia la iteraci�n18% X0 intensidades con las que se inicia la iteraci�n19% k, X, Y factor, intensidades y valores soluci�n20%21% Los c�digos para los signos son 0 = 1 >= 2 <= 3 >=<2223% necesita forma0.m, forma1.m, programalineal.m2425if nargin < 2, signoX = []; end26if nargin < 3, signoXF = []; end27if nargin < 4, k = []; end28if nargin < 5, X = []; end2930cerosalida = 1e-14; %define la precisi�n del cero31if isempty(k), k = 1; end %define kn como 1 si no lo est� ya32Fn = forma0(F, k); %calcula F(kn)33[filas, columnas] = size(Fn); %determina el tama�o del problema34if isempty(X), X = ones(1, filas) ./ filas; end %define Xn si no lo est� ya35C = [zeros(filas, 1); 1]; %define la funci�n objetivo como 0 X + 1 k36Aeq = [ones(filas, 1); 0]; %define la normalizaci�n sum(X) - 1 = 037Deq = -1; %38if ~isempty(signoX), Aeq(signoX==2) = -1; end %si X <= 0 adecua la normalizaci�n39for pasos = 1:50 %inicia una iteraci�n de hasta 50 pasos40memvar = [k, X]; %almacena las variables41XDFn = X * forma1(F, k); %calcula Xn F'(kn)42A = [Fn; XDFn]; %define |X, k| |F(kn) | + |-kn Xn F'(kn)|43D = -k * XDFn; % |Xn F'(kn)|44[U,Z]=programalineal([A,Aeq],C,[D,Deq],[signoX,1],[signoXF,0]); %resuelve el programa lineal45X=U(1:filas); k=U(filas+1); Y=Z(1:columnas); mu=Z(columnas+1); %extrae las variables de la soluci�n46if abs([k, X] - memvar) < cerosalida, return; end %si las variables cambian poco interrumpe47Fn = forma0(F, k); %calcula F(kn)48end %repite la iteraci�n49disp('Atenci�n, se ha superado el m�ximo de iteraciones'); %avisa de que se ha superado el m�ximo de iteraciones50515253