iteraciones en octave
Publicado por
JOSE ANTONIO (1 intervención) el 02/03/2013 06:58:55
Hola...Necesito ayuda con un programa que tengo que entregar en la universidad sobre un separador trifasico-flash multicomponentes tengo tres programas que he desarrollado para tal fin pero tengo un problema y es que el programa debe tener 3 ciclos internos es decir que tiene que variar 3 variables:
clc;
clear all;
format long
%tic
T=346.78;
F = 100; %input( 'flujo de alimentacion en moles: ');
V = 30; % input('cantidad de moles en el flujo de vapor: ');
L = 30; % input('cantidad de moles en el flujo de liquido: ');
S=(F-(V+L));
a=[0.2 0.3 0.5];
%k=unifac(T);
KV=[1.2 1 1];
KS=[1 1.1 1];
xo=[V;L]/F;
XR=[0.2;0.4;0.4];
xo1=[V;L]*(1/(7*F));
x1=[V;L]/(F);
syms x y
n=length(a);
fun1=0;fun2=0; % funcion de rachford rice para tres fases
for i=1:1:n
fun1=fun1+(a(i)*(KV(i)-1))/(1+(KV(i)-1)*x+(KS(i)-1)*y);
fun2=fun2+(a(i)*(KS(i)-1))/(1+(KV(i)-1)*x+(KS(i)-1)*y);
end
f=[fun1;fun2];
suma1=0;suma2=0;suma3=0;suma4=0; % sistema no lineals o jacobiano especial para la %solucion de programa
for i=1:1:n
suma1=suma1+(a(i)/(1+(KS(i)-1)*x+(KV(i)-1)*x))*(diff(((a(i)*KV(i))/(XR(i)*(1+(KS(i)-1)*y+(KV(i)-1)*x))),x)-((KV(i)-1)/(1+(KS(i)-1)*x+(KV(i)-1)*x))*((KV(i)-1)+x*(diff(((a(i)*KV(i))/(XR(i)*(1+(KS(i)-1)*y+(KV(i)-1)*x))),x))+y*(diff(((a(i)*KV(i))/(XR(i)*(1+(KS(i)-1)*y+(KV(i)-1)*x))),x))));
suma2=suma2+(a(i)/(1+(KS(i)-1)*y+(KV(i)-1)*y))*(diff(((a(i)*KS(i))/(XR(i)*(1+(KS(i)-1)*y+(KV(i)-1)*x))),x)-((KS(i)-1)/(1+(KS(i)-1)*y+(KV(i)-1)*y))*((KS(i)-1)+x*(diff(((a(i)*KS(i))/(XR(i)*(1+(KS(i)-1)*y+(KV(i)-1)*x))),x))+y*(diff(((a(i)*KS(i))/(XR(i)*(1+(KS(i)-1)*y+(KV(i)-1)*x))),x))));
suma3=suma3+(a(i)/(1+(KS(i)-1)*x+(KV(i)-1)*x))*(diff(((a(i)*KV(i))/(XR(i)*(1+(KS(i)-1)*y+(KV(i)-1)*x))),y)-((KV(i)-1)/(1+(KS(i)-1)*x+(KV(i)-1)*x))*((KV(i)-1)+x*(diff(((a(i)*KV(i))/(XR(i)*(1+(KS(i)-1)*y+(KV(i)-1)*x))),y))+y*(diff(((a(i)*KV(i))/(XR(i)*(1+(KS(i)-1)*y+(KV(i)-1)*x))),y))));
suma4=suma4+(a(i)/(1+(KS(i)-1)*y+(KV(i)-1)*y))*(diff(((a(i)*KS(i))/(XR(i)*(1+(KS(i)-1)*y+(KV(i)-1)*x))),y)-((KS(i)-1)/(1+(KS(i)-1)*y+(KV(i)-1)*y))*((KS(i)-1)+x*(diff(((a(i)*KS(i))/(XR(i)*(1+(KS(i)-1)*y+(KV(i)-1)*x))),y))+y*(diff(((a(i)*KS(i))/(XR(i)*(1+(KS(i)-1)*y+(KV(i)-1)*x))),y))));
end
J=[suma1,suma2;suma3,suma4];
fpri=J;
epsilon=(1.e-12)*ones(2,1);
maxi=5000;
iter = 1;
f=inline(f);
jf=inline(fpri);
E1=norm(f(xo1(1),xo1(2)),2);
E2=norm(f(xo(1),xo(2)),2);
error=E1/E2;
EROR=abs((xo-x1)./x1);
while EROR>=epsilon
if error>=1;
lamb=1;
else
lamb=((((1+6*error)^(0.5))-1)/3*error);
end
B=f(xo(1),xo(2));
A=jf(xo(1),xo(2));
X=GJPivParEsc(A,B); % Gaus Jordan con pivoteo parcial y rescalado de columna
x1=xo-lamb.*X;
fx1=f(x1(1),x1(2));
E2=norm((fx1),2);
error=E2/E1;
EROR=abs((xo-x1)./xo);
fprintf(' Iter %2d raiz x1=(%14.9f, %14.9f) xo=(%14.9f, %14.9f) f(x)=(%14.9f, %14.9f)\n',....
iter,x1(1),x1(2),xo(1),xo(2),fx1(1),fx1(2));
if iter > maxi
fprintf(' Nº max de iter se excedido \n');
return;
end
xo=x1;
E2=E1;
iter=iter+1;
end
%toc
El programa corre pero lo que yo necesito es que tomo unas KV Y KS (que vienen de otras funciones que ya programe) iniciales luego que entre al while las recalcule y las multiplique con otros valores que calcula otro programa...
He leído muchos sus foros y me han servido de mucho gracias a ustedes y a mathworks tengo lo que tengo hasta ahora pero necesito ayuda para poder continuar con mi trabajo....