PARCIALES
CAPITULO 5
EJERCICIO 5.1:
Flujo dinámico en un tanque puede ser modelado haciendo un balance de masa sobre el
fluido en el tanque (Figura 5.10). La naturaleza del resultado ODE-IVP depende del
modelo utilizado para la válvula de salida. Si una válvula lineal es
Asumido, entonces el modelo ODE es lineal. Una descripción más precisa de la válvula
hace que el flujo de salida sea una función no lineal de la altura. Ambos casos se
consideran en lo que sigue.
Balance de masa:
𝑑(𝑚𝑎𝑠𝑎 𝑒𝑛 𝑡𝑎𝑛𝑞𝑢𝑒 𝑎 𝑐𝑢𝑎𝑙𝑞𝑢𝑖𝑒𝑟 𝑡𝑖𝑒𝑚𝑝𝑜)
= 𝑒𝑛𝑡𝑟𝑎𝑑𝑎 − 𝑠𝑎𝑙𝑖𝑑𝑎 + 𝑔𝑒𝑛𝑒𝑟𝑎𝑐𝑖𝑜𝑛
𝑑𝑡
Asuma un componente puro (único) de fluido de densidad constante:
𝑑𝜌𝑉
= 𝐹𝑒𝑛𝑡𝑟𝑎 − 𝐹𝑠𝑎𝑙𝑒
𝑑𝑡
Donde:
𝝆 = 𝒅𝒆𝒏𝒔𝒊𝒅𝒂𝒅
𝑽 = 𝒗𝒐𝒍𝒖𝒎𝒆𝒏
𝑭 = 𝒓𝒂𝒛𝒐𝒏 𝒅𝒆 𝒇𝒍𝒖𝒋𝒐 𝒅𝒆 𝒎𝒂𝒔𝒂
𝑑ℎ 𝐹𝑒𝑛𝑡𝑟𝑎 − 𝐶, ℎ
=
𝑑𝑡 𝜌𝐴
𝟏⁄
b. Una función de h, como 𝑭𝒔𝒂𝒍𝒆 = 𝑪, 𝒉 𝟐 y el modelo se convierte en:
𝑑ℎ 𝐹𝑒𝑛𝑡𝑟𝑎 − 𝐶, √ℎ
=
𝑑𝑡 𝜌𝐴
𝑭𝒆𝒏𝒕𝒓𝒂 sufre un cambio en el tiempo 0+ a 𝟏𝟒𝟎𝟎 𝒍𝒃/𝒉 hasta el tiempo 10h, después de lo
cual retorna a 𝟏𝟎𝟎𝟎 𝒍𝒃/𝒉.
a. Resolver el lineal ODE (𝑭𝒔𝒂𝒍𝒆 𝒑𝒓𝒐𝒑𝒐𝒓𝒄𝒊𝒐𝒏𝒂𝒍 𝒂 𝒉) usando el método de Euler,
empezar con una ∆𝒕 𝒅𝒆 𝟎. 𝟓 𝒚 𝒅𝒆𝒏𝒖𝒆𝒗𝒐 𝒄𝒐𝒏 ∆𝒕 = 𝟎. 𝟎𝟓 para determinar una ∆𝒕.
Use IF function para generar los valores adecuados para 𝑭𝒆𝒏𝒕𝒓𝒂.
𝟏⁄
b. Repita la parte a para el caso no lineal (𝑭𝒔𝒂𝒍𝒆 𝒑𝒓𝒐𝒑𝒐𝒓𝒄𝒊𝒐𝒏𝒂𝒍 𝒂 𝒉 𝟐 ).
Análisis y ecuaciones:
𝐹𝑒𝑛𝑡𝑟𝑎 puede ser:
𝑑ℎ 𝐹𝑒𝑛𝑡𝑟𝑎 − 𝐶, ℎ
=
𝑑𝑡 𝜌𝐴
1⁄
Una función de h, como 𝐹𝑠𝑎𝑙𝑒 = 𝐶, ℎ 2 y el modelo se convierte en:
𝑑ℎ 𝐹𝑒𝑛𝑡𝑟𝑎 − 𝐶, √ℎ
=
𝑑𝑡 𝜌𝐴
Para (a):
Código Matlab:
% Ejercicio 5.1 libro chNumerical Methods for Chemical Engineer.
clear all
clc
disp('**************************************************************')
disp('* UNIVERSIDAD NACIONAL DE TRUJILLO *')
disp('* FACULTAD DE INGENIERIA QUIMICA *')
disp('* ESCUELA PROFESIONAL DE INGENIERA QUIMICA *')
disp('*CURSO: METODOS NUMERICOS *')
disp('*Libro: Numerical Methods for Chemical Engineer.- capitulo 5 *')
disp('*DOCENTE: Dr. Guillermo Evangelista Benites *')
disp('*Aumno: Javier Loredo Luna Victoria *')
disp('**************************************************************')
disp(' ')
%% INGRESO DE DATOS1
xf=1; % valor al cual se desea conocer la func.
h=0.5;
xo=0; yo=4; %condicion inicial
i=0;
fprintf('\n\n\n\t\t\t\t MÉTODO DE RUNGE-KUTTA (RK-4)')
fprintf('\n\t\t\t\t===================================\n')
fprintf('\n\t\t\t\t\tpara dt = 0.5\n')
fprintf('\t\t\t\t------------------------------\n')
fprintf('\t\t\t \ti \t t(i) \tH(i) \n')
fprintf('\t\t\t\t------------------------------\n')
fprintf('\t\t\t \t%2d \t%6.4f \t%8.6f\n',i,xo,yo)
N=(xf-xo)/h;
if xf==0
f=inline('0*x+1000/(3.1416*62.5*9)-
250/(3.1416*62.5*9)*y','x','y');
elseif xf>0 & xf<=10
f=inline('0*x+1400/(3.1416*62.5*9)-
250/(3.1416*62.5*9)*y','x','y');
elseif xf>10
f=inline('0*x+1000/(3.1416*62.5*9)-
250/(3.1416*62.5*9)*y','x','y');
end
x1=zeros(1,length(N));
x1(1,1)=xo;
y1=zeros(1,length(N));
y1(1,1)=yo;
while i<N
k1=f(xo,yo);
k2=f(xo+h/2,yo+h*k1/2);
k3=f(xo+h/2,yo+h*k2/2);
k4=f(xo+h,yo+h*k3);
yo=yo+h/6*(k1+2*k2+2*k3+k4);
xo=xo+h;
i=i+1;
fprintf('\t\t\t \t%2d \t%6.4f \t%8.6f\n',i,xo,yo)
x1(1,i+1)=xo;
y1(1,i+1)=yo;
end
fprintf('\t\t\t\t-----------------------------\n')
xx=0:h:xf;
[T,Y]=ode45(f,xx,4);
x_analit=Y(end);
ERP=(abs(yo-x_analit))/x_analit*100;
fprintf('\t\t\t\t El error = %6.4e\n',ERP)
subplot(2,2,1);
plot(x1,y1,'ro-')
xlabel('t'); ylabel('H')
title('dt=0.5');grid
hold on
plot(T,Y,'b')
legend('Runge-kuta','ode45')
%=======================================
xf=1; % valor al cual se desea conocer la func.
h=0.05;
xo=0; yo=4; %condicion inicial
i=0;
fprintf('\n\n\t\t\t\t\tpara dt = 0.05\n')
fprintf('\t\t\t\t------------------------------\n')
fprintf('\t\t\t \ti \t t(i) \tH(i) \n')
fprintf('\t\t\t\t------------------------------\n')
fprintf('\t\t\t \t%2d \t%6.4f \t%8.6f\n',i,xo,yo)
N=(xf-xo)/h;
if xf==0
f=inline('0*x+1000/(3.1416*62.5*9)-
250/(3.1416*62.5*9)*y','x','y');
elseif xf>0 & xf<=10
f=inline('0*x+1400/(3.1416*62.5*9)-
250/(3.1416*62.5*9)*y','x','y');
elseif xf>10
f=inline('0*x+1000/(3.1416*62.5*9)-
250/(3.1416*62.5*9)*y','x','y');
end
x1=zeros(1,length(N));
x1(1,1)=xo;
y1=zeros(1,length(N));
y1(1,1)=yo;
while i<N
k1=f(xo,yo);
k2=f(xo+h/2,yo+h*k1/2);
k3=f(xo+h/2,yo+h*k2/2);
k4=f(xo+h,yo+h*k3);
yo=yo+h/6*(k1+2*k2+2*k3+k4);
xo=xo+h;
i=i+1;
fprintf('\t\t\t \t%2d \t%6.4f \t%8.6f\n',i,xo,yo)
x1(1,i+1)=xo;
y1(1,i+1)=yo;
end
fprintf('\t\t\t\t-----------------------------\n')
xx=0:h:xf;
[T,Y]=ode45(f,xx,4);
x_analit=Y(end);
ERP=(abs(yo-x_analit))/x_analit*100;
fprintf('\t\t\t\t El error = %6.4e\n',ERP)
subplot(2,2,2);
plot(x1,y1,'ro-')
xlabel('t'); ylabel('H')
title('dt=0.05');grid
hold on
plot(T,Y,'b')
legend('Runge-kuta','ode45')
%=================================================
xf=1; % valor al cual se desea conocer la func.
h=0.05;
xo=0; yo=4; %condicion inicial
i=0;
fprintf('\n\n\t\t\t\t\tpara dt = 0.005\n')
fprintf('\t\t\t\t------------------------------\n')
fprintf('\t\t\t \ti \t t(i) \tH(i) \n')
fprintf('\t\t\t\t------------------------------\n')
fprintf('\t\t\t \t%2d \t%6.4f \t%8.6f\n',i,xo,yo)
N=(xf-xo)/h;
if xf==0
f=inline('0*x+1000/(3.1416*62.5*9)-
250/(3.1416*62.5*9)*y','x','y');
elseif xf>0 & xf<=10
f=inline('0*x+1400/(3.1416*62.5*9)-
250/(3.1416*62.5*9)*y','x','y');
elseif xf>10
f=inline('0*x+1000/(3.1416*62.5*9)-
250/(3.1416*62.5*9)*y','x','y');
end
x1=zeros(1,length(N));
x1(1,1)=xo;
y1=zeros(1,length(N));
y1(1,1)=yo;
while i<N
k1=f(xo,yo);
k2=f(xo+h/2,yo+h*k1/2);
k3=f(xo+h/2,yo+h*k2/2);
k4=f(xo+h,yo+h*k3);
yo=yo+h/6*(k1+2*k2+2*k3+k4);
xo=xo+h;
i=i+1;
fprintf('\t\t\t \t%2d \t%6.4f \t%8.6f\n',i,xo,yo)
x1(1,i+1)=xo;
y1(1,i+1)=yo;
end
fprintf('\t\t\t\t-----------------------------\n')
xx=0:h:xf;
[T,Y]=ode45(f,xx,4);
x_analit=Y(end);
ERP=(abs(yo-x_analit))/x_analit*100;
fprintf('\t\t\t\t El error = %6.4e\n',ERP)
subplot(2,2,3);
plot(x1,y1,'ro-')
xlabel('t'); ylabel('H')
title('dt=0.005');grid
hold on
plot(T,Y,'b')
legend('Runge-kuta','ode45')
disp('El valor para dt = 0.005')
Resultados:
Para (b):
Código Polymath:
A = 3.1416 * D ^ 2 / 4 # area
D = 6 # diametro del cilindro
t(0) = 0
t(f) = 0.85
Cv = 250 # valor para enunciado a
F = 1400 # para el valor de 0<t<=10
p = 62.5 # densidad del fluido
d(h)/d(t) = (F - Cv * sqrt(h)) / (p * A) # ecuacion para enunciado a
h(0) = 4
Resultados:
Usando el software Polymath para resolver sistemas de ecuaciones diferenciales se obtienen los
siguientes resultados:
Código Matlab:
% Ejercicio 5.1 libro chNumerical Methods for Chemical Engineer.
clear all
clc
disp('**************************************************************')
disp('* UNIVERSIDAD NACIONAL DE TRUJILLO *')
disp('* FACULTAD DE INGENIERIA QUIMICA *')
disp('* ESCUELA PROFESIONAL DE INGENIERA QUIMICA *')
disp('*CURSO: METODOS NUMERICOS *')
disp('*Libro: Numerical Methods for Chemical Engineer.- capitulo 5 *')
disp('*DOCENTE: Dr. Guillermo Evangelista Benites *')
disp('*Aumno: Javier Loredo Luna Victoria *')
disp('**************************************************************')
disp(' ')
%% INGRESO DE DATOS1
xf=1; % valor al cual se desea conocer la func.
h=0.5;
xo=0; yo=4; %condicion inicial
i=0;
fprintf('\n\n\n\t\t\t\t MÉTODO DE RUNGE-KUTTA (RK-4)')
fprintf('\n\t\t\t\t===================================\n')
fprintf('\t\t\t\t\tpara dt = 0.5\n')
fprintf('\n\t\t\t\t------------------------------\n')
fprintf('\t\t\t \ti \t t(i) \tH(i) \n')
fprintf('\t\t\t\t------------------------------\n')
fprintf('\t\t\t \t%2d \t%6.4f \t%8.6f\n',i,xo,yo)
N=(xf-xo)/h;
if xf==0
f=inline('0*x+1000/(3.1416*62.5*9)-
500/(3.1416*62.5*9)*y^0.5','x','y');
elseif xf>0 & xf<=10
f=inline('0*x+1400/(3.1416*62.5*9)-
500/(3.1416*62.5*9)*y^0.5','x','y');
elseif xf>10
f=inline('0*x+1000/(3.1416*62.5*9)-
500/(3.1416*62.5*9)*y^0.5','x','y');
end
x1=zeros(1,length(N));
x1(1,1)=xo;
y1=zeros(1,length(N));
y1(1,1)=yo;
while i<N
k1=f(xo,yo);
k2=f(xo+h/2,yo+h*k1/2);
k3=f(xo+h/2,yo+h*k2/2);
k4=f(xo+h,yo+h*k3);
yo=yo+h/6*(k1+2*k2+2*k3+k4);
xo=xo+h;
i=i+1;
fprintf('\t\t\t \t%2d \t%6.4f \t%8.6f\n',i,xo,yo)
x1(1,i+1)=xo;
y1(1,i+1)=yo;
end
fprintf('\t\t\t\t-----------------------------\n')
xx=0:h:xf;
[T,Y]=ode45(f,xx,4);
x_analit=Y(end);
ERP=(abs(yo-x_analit))/x_analit*100;
fprintf('\t\t\t\t El error = %6.4e\n',ERP)
subplot(1,2,1);
plot(x1,y1,'ro-')
xlabel('t'); ylabel('H')
title('dt=0.5');grid
hold on
plot(T,Y,'b')
legend('Runge-kuta','ode45')
%=======================================
xf=1; % valor al cual se desea conocer la func.
h=0.05;
xo=0; yo=4; %condicion inicial
i=0;
fprintf('\n\t\t\t\t\tpara dt = 0.05\n')
fprintf('\t\t\t\t------------------------------\n')
fprintf('\t\t\t \ti \t t(i) \tH(i) \n')
fprintf('\t\t\t\t------------------------------\n')
fprintf('\t\t\t \t%2d \t%6.4f \t%8.6f\n',i,xo,yo)
N=(xf-xo)/h;
if xf==0
f=inline('0*x+1000/(3.1416*62.5*9)-
500/(3.1416*62.5*9)*y^0.5','x','y');
elseif xf>0 & xf<=10
f=inline('0*x+1400/(3.1416*62.5*9)-
500/(3.1416*62.5*9)*y^0.5','x','y');
elseif xf>10
f=inline('0*x+1000/(3.1416*62.5*9)-
500/(3.1416*62.5*9)*y^0.5','x','y');
end
x1=zeros(1,length(N));
x1(1,1)=xo;
y1=zeros(1,length(N));
y1(1,1)=yo;
while i<N
k1=f(xo,yo);
k2=f(xo+h/2,yo+h*k1/2);
k3=f(xo+h/2,yo+h*k2/2);
k4=f(xo+h,yo+h*k3);
yo=yo+h/6*(k1+2*k2+2*k3+k4);
xo=xo+h;
i=i+1;
fprintf('\t\t\t \t%2d \t%6.4f \t%8.6f\n',i,xo,yo)
x1(1,i+1)=xo;
y1(1,i+1)=yo;
end
fprintf('\t\t\t\t-----------------------------\n')
xx=0:h:xf;
[T,Y]=ode45(f,xx,4);
x_analit=Y(end);
ERP=(abs(yo-x_analit))/x_analit*100;
fprintf('\t\t\t\t El error = %6.4e\n',ERP)
subplot(1,2,2);
plot(x1,y1,'ro-')
xlabel('t'); ylabel('H')
title('dt=0.05');grid
hold on
plot(T,Y,'b')
legend('Runge-kuta','ode45')
disp('el valor adecuado para dt = 0.05')
Resultados:
Usando el software MATLAB para resolver sistemas de ecuaciones diferenciales se obtienen los
siguientes resultados:
Graficas
EJERCICIO 5.2:
Resolver el ODEs del ejercicio 5.1 usando el método de Runge-Kutta de segundo orden.
Encontrar valores aceptables para h cuando se usa el método de Runge-Kutta de
segundo orden.
Solución
Para hallar el valor correcto de h se probó valores de 0.03, 0.02, 0.01, para luego
comparar con ODE23 de MatLab. Dando como valor correcto h=0.02 ya que dio la solución
del problema en menos iteraciones, dado que el algoritmo de Runge-Kutta de segundo
orden genera más iteraciones que el de cuarto orden para poder obtener el valor de la
solución de las EDOs.
%% INGRESO DE DATOS1
%Prueba con h=0.03
xf=1; % valor al cual se desea conocer la func.
h=0.03;%Variando h
xo=0; yo=4; %condicion inicial
i=0;
fprintf('\n\n\n\t\t\t\t MÉTODO DE RUNGE-KUTTA (RK-2)')
fprintf('\n\t\t\t\t===================================\n')
fprintf('\n\t\t\t\t\tpara dt = 0.03\n')
fprintf('\t\t\t\t------------------------------\n')
fprintf('\t\t\t \ti \t t(i) \tH(i) \n')
fprintf('\t\t\t\t------------------------------\n')
fprintf('\t\t\t \t%2d \t%6.4f \t%8.6f\n',i,xo,yo)
N=(xf-xo)/h;
%Reemplazando los valores para obtener las funciones en inline()
if xf==0
f=inline('0*x+1000/(3.1416*62.5*9)-
250/(3.1416*62.5*9)*y','x','y');
elseif xf>0 & xf<=10
f=inline('0*x+1400/(3.1416*62.5*9)-
250/(3.1416*62.5*9)*y','x','y');
elseif xf>10
f=inline('0*x+1000/(3.1416*62.5*9)-
250/(3.1416*62.5*9)*y','x','y');
end
x1=zeros(1,length(N));
x1(1,1)=xo;
y1=zeros(1,length(N));
y1(1,1)=yo;
while i<N
k1=f(xo,yo);
k2=f(xo+h,yo+k1*h);
yo=yo+h/2*(k1+k2);
xo=xo+h;
i=i+1;
fprintf('\t\t\t \t%2d \t%6.4f \t%8.6f\n',i,xo,yo)
x1(1,i+1)=xo;
y1(1,i+1)=yo;
end
fprintf('\t\t\t\t-----------------------------\n')
xx=0:h:xf;
[T,Y]=ode23(f,xx,4);
x_analit=Y(end);
ERP=(abs(yo-x_analit))/x_analit*100;
fprintf('\t\t\t\t El error = %6.4e\n',ERP)
subplot(2,2,1);
plot(x1,y1,'ro-')
xlabel('t'); ylabel('H')
title('dt=0.03');grid
hold on
plot(T,Y,'b')
legend('Runge-kuta','ode23')
%=======================================
%Prueba con h=0.02
h=0.02;%Variando h
xo=0; yo=4; %condicion inicial
i=0;
fprintf('\n\n\t\t\t\t\tpara dt = 0.02\n')
fprintf('\t\t\t\t------------------------------\n')
fprintf('\t\t\t \ti \t t(i) \tH(i) \n')
fprintf('\t\t\t\t------------------------------\n')
fprintf('\t\t\t \t%2d \t%6.4f \t%8.6f\n',i,xo,yo)
N=(xf-xo)/h;
if xf==0
f=inline('0*x+1000/(3.1416*62.5*9)-
250/(3.1416*62.5*9)*y','x','y');
elseif xf>0 & xf<=10
f=inline('0*x+1400/(3.1416*62.5*9)-
250/(3.1416*62.5*9)*y','x','y');
elseif xf>10
f=inline('0*x+1000/(3.1416*62.5*9)-
250/(3.1416*62.5*9)*y','x','y');
end
x1=zeros(1,length(N));
x1(1,1)=xo;
y1=zeros(1,length(N));
y1(1,1)=yo;
while i<N
k1=f(xo,yo);
k2=f(xo+h,yo+k1*h);
yo=yo+h/2*(k1+k2);
xo=xo+h;
i=i+1;
fprintf('\t\t\t \t%2d \t%6.4f \t%8.6f\n',i,xo,yo)
x1(1,i+1)=xo;
y1(1,i+1)=yo;
end
fprintf('\t\t\t\t-----------------------------\n')
xx=0:h:xf;
[T,Y]=ode23(f,xx,4);
x_analit=Y(end);
ERP=(abs(yo-x_analit))/x_analit*100;
fprintf('\t\t\t\t El error = %6.4e\n',ERP)
subplot(2,2,2);
plot(x1,y1,'ro-')
xlabel('t'); ylabel('H')
title('dt=0.02');grid
hold on
plot(T,Y,'b')
legend('Runge-kuta','ode23')
%=================================================
%Prueba con h=0.01
h=0.01; %Variando h
xo=0; yo=4; %condicion inicial
i=0;
fprintf('\n\n\t\t\t\t\tpara dt = 0.01\n')
fprintf('\t\t\t\t------------------------------\n')
fprintf('\t\t\t \ti \t t(i) \tH(i) \n')
fprintf('\t\t\t\t------------------------------\n')
fprintf('\t\t\t \t%2d \t%6.4f \t%8.6f\n',i,xo,yo)
N=(xf-xo)/h;
if xf==0
f=inline('0*x+1000/(3.1416*62.5*9)-
250/(3.1416*62.5*9)*y','x','y');
elseif xf>0 & xf<=10
f=inline('0*x+1400/(3.1416*62.5*9)-
250/(3.1416*62.5*9)*y','x','y');
elseif xf>10
f=inline('0*x+1000/(3.1416*62.5*9)-
250/(3.1416*62.5*9)*y','x','y');
end
x1=zeros(1,length(N));
x1(1,1)=xo;
y1=zeros(1,length(N));
y1(1,1)=yo;
while i<N
k1=f(xo,yo);
k2=f(xo+h,yo+k1*h);
yo=yo+h/2*(k1+k2);
xo=xo+h;
i=i+1;
fprintf('\t\t\t \t%2d \t%6.4f \t%8.6f\n',i,xo,yo)
x1(1,i+1)=xo;
y1(1,i+1)=yo;
end
fprintf('\t\t\t\t-----------------------------\n')
xx=0:h:xf;
[T,Y]=ode23(f,xx,4);
x_analit=Y(end);
ERP=(abs(yo-x_analit))/x_analit*100;
fprintf('\t\t\t\t El error = %6.4e\n',ERP)
subplot(2,2,3);
plot(x1,y1,'ro-')
xlabel('t'); ylabel('H')
title('dt=0.01');grid
hold on
plot(T,Y,'b')
legend('Runge-kuta','ode23')
disp('El valor para dt = 0.005')
*Con h=0.03 = dt
# iteraciones= 50
Valor Final: 4.211071
Error: 6.7630e-06
disp(' x y');
𝒌𝟏 = 𝟏 𝒎𝒊𝒏−𝟏 , 𝒌𝟐 = 𝟎. 𝟓 𝒎𝒊𝒏−𝟏
La carga al reactor es todo el componente A, así que inicialmente, las concentraciones
dentro del reactor son
𝑪𝑨𝟎 = 𝟏 𝑪𝑩𝟎 = 𝟎 (𝒈𝒎𝒐𝒍/𝑳)
Un balance de masa de estado inestable en cada componente conduce al siguiente
conjunto de ODEs:
𝒅𝑪𝑨
= −𝒌𝟏 𝑪𝑨 + 𝒌𝟐 𝑪𝑩
𝒅𝒕
𝒅𝑪𝑩
= 𝒌𝟏 𝑪𝑨 − 𝒌𝟐 𝑪𝑩
𝒅𝒕
Resolver este sistema ODE-IVP utilizando el método de Euler en Excel con un paso de
tiempo de 0,1 min y repetir con un paso de tiempo de 0,01 min. Si se produce una
diferencia significativa (comparar los valores en un momento específico para ver si son
diferentes), repetir a con un paso de tiempo de 0,001, etc. hasta que se encuentre un
paso de tiempo satisfactorio. Integrar a tiempo = 2 min. Graficar la solución en cada
caso y compararlas. Reporte la diferencia porcentual en las soluciones a tiempo = 1 min.
Realice experimentos cambiando las constantes de velocidad en una de las soluciones
para ver cómo Excel recalcula inmediatamente las soluciones y actualiza la gráfica.
𝒅𝑪𝑨
= −𝒌𝟏 𝑪𝑨 + 𝒌𝟐 𝑪𝑩
𝒅𝒕
𝒅𝑪𝑩
= 𝒌𝟏 𝑪𝑨 − 𝒌𝟐 𝑪𝑩
𝒅𝒕
Código Matlab:
function z = E54(f,g,CA,CB,t,h)
u1=h*eval('f(t,CA,CB)');
v1=h*eval('g(t,CA,CB)');
u2=h*eval('f(t+h/2,CA+u1/2,CB+v1/2)');
v2=h*eval('g(t+h/2,CA+u1/2,CB+v1/2)');
u3=h*eval('f(t+h/2,CA+u2/2,CB+v2/2)');
v3=h*eval('g(t+h/2,CA+u2/2,CB+v2/2)');
u4=h*eval('f(t+h,CA+u3,CB+v3)');
v4=h*eval('g(t+h,CA+u3,CB+v3)');
f1=CA+(1/6)*(u1+2*u2+2*u3+u4);
g1=CB+(1/6)*(v1+2*v2+2*v3+v4);
z=[f1,g1];
clear all,clc
% k1=1;
% k2=0.5;
Eq=inline('[-1*x(1)+0.5*x(2);1*x(1)-0.5*x(2)]','t','x'); %ecuaciones de
diseño de reactor
[t,x]=ode23(Eq,[0:0.1:2],[1 0]); %dt=0.1
disp([t,x])
plot(t,x(:,1),'-r',t,x(:,2),'-b','LineWidth',2),grid on
title('Solución de un sistema de ecuaciones reactivas','Fontsize',15);
text(0.2,0.8,'CA');text(0.8,0.1,'CB');
xlabel('Tiempo');ylabel('Concentración');
Resultados:
PARA t = 0.1min.
𝐶𝐴 = 0.9071 𝑔𝑚𝑜𝑙/𝐿
𝐶𝐵 = 0.0929 𝑔𝑚𝑜𝑙/𝐿
EJERCICIO 5.6:
Resuelva los EDO del ejercicio 5.4 utilizando el programa de Euler VBA
como dan en el ejemplo 5.7. Use los pasos de tiempo de 0.1, 0.01 y 0.001
minutos, respectivamente y deducir cuál es el más apropiado para una
solución aceptable.
Solución:
fprintf('\n\n\n\t\t\t\t MÉTODO DE EULER ')
clear all; clc
syms x
syms y
x=0;xf=1;y=1;
h=0.1;
n=(xf-x)/h;
f=inline('-1*x+0.5*y','x','y');
disp('CONCENTRACION CA')
disp(' x y');
for i=1:n+1
y1=feval(f,x,y);
hy1=h*y1;
fprintf('\n');
fprintf('\n');
disp('concentracion de CB');
x=0;xf=2;y=1;
h=0.1;
n=(xf-x)/h;
f=inline('1*x-0.5*y','x','y');
disp(' x y');
for i=1:n+1
y1=feval(f,x,y);
hy1=h*y1;
x=0;xf=1;y=1;
h=0.1;
n=(xf-x)/h;
f=inline('-1*x+0.5*y','x','y');
disp('CONCENTRACION CA')
disp(' x y');
for i=1:n+1
y1=feval(f,x,y);
hy1=h*y1;
fprintf('\n');
fprintf('\n');
disp('concentracion de CB');
x=0;xf=2;y=1;
h=0.1;
n=(xf-x)/h;
f=inline('1*x-0.5*y','x','y');
disp(' x y');
for i=1:n+1
y1=feval(f,x,y);
hy1=h*y1;
Solución
Runge – Kutta en Matlab (Ode23)
clear all,clc
% k1=1;
% k2=0.5;
Eq=inline('[-1*x(1)+0.5*x(2);1*x(1)-0.5*x(2)]','t','x'); %ecuaciones de
diseño de reactor (se pueden cambiar para cualquier problema)
[t,x]=ode23(Eq,[0:0.1:2],[1 0]); %dt=0.1 (se puede cambiar para cualquier
problema)
disp([t,x])
plot(t,x(:,1),'-r',t,x(:,2),'-b','LineWidth',2),grid on
title('Solución de un sistema de ecuaciones reactivas','Fontsize',15);
text(0.2,0.8,'CA');text(0.8,0.1,'CB');
xlabel('Tiempo');ylabel('Concentración');
EJERCICIO 5.9:
Fermentación con Penicilina
Un modelo para un reactor discontinuo en el que la penicilina se produce por
fermentación se ha derivado de la siguiente manera (constantantinides et al.1970) para la
producción celular y la síntesis de penicilina, respectivamente:
𝑑𝑦1 𝑏1
= 𝑏1 𝑦1 − 𝑦1 2 𝑦1 (0) = 0.03
𝑑𝑡 𝑏2
𝑑𝑦2
= 𝑏3 𝑦1 𝑦2 (0) = 0.0
𝑑𝑡
Donde
𝑦1 =Concentración adimensional de la masa celular
𝑦2 =Concentración adimensional de la penicilina
𝑡 = tiempo adimensional, 0 ≤ 𝑡 ≤ 1
Los experimentos han determinado que:
𝑏1 = 13.1
𝑏2 = 0.94
𝑏3 = 1.71
SOLUCION
B.-Usando el método de Runge-Kutta 2° orden
Usando el software Polymath para resolver sistemas de ecuaciones diferenciales
se obtienen los siguientes resultados:
𝑦1 = 0.939942
𝑦2 = 1.184737
Grafica
EJERCICIO 5.10:
Cinética de Bioreacciones
El modelo "Monod" para la cinética de bioreacción puede expresarse como:
𝑑𝑠 𝑘𝑠𝑥
=−
𝑑𝑡 𝑘𝑠 + 𝑠
𝑠(0) = 𝑠0 𝑥(0) = 𝑥0
𝑑𝑥 𝑘𝑠𝑥
=𝑦 − 𝑏𝑥
𝑑𝑡 𝑘𝑠 + 𝑠
Donde:
𝑠 = Concentración de sustrato limitante del crecimiento (𝑀𝐿−3 )
𝑥 = 𝑐𝑜𝑛𝑐𝑒𝑛𝑡𝑟𝑎𝑐𝑖𝑜𝑛 𝑑𝑒 𝑏𝑖𝑜𝑚𝑎𝑠𝑎 (𝑀𝐿−3 )
𝑘 = 𝑉𝑒𝑙𝑜𝑐𝑖𝑑𝑑 𝑑𝑒 𝑐𝑜𝑚𝑠𝑢𝑚𝑜 𝑚𝑎𝑥𝑖𝑚𝑎 𝑑𝑒𝑙 𝑠𝑢𝑠𝑡𝑟𝑎𝑡𝑜(𝑇 −1 ) = 5
𝑘𝑠 = 𝐶𝑜𝑛𝑠𝑡𝑎𝑛𝑡𝑒 𝑑𝑒 𝑚𝑒𝑑𝑖𝑎 𝑠𝑎𝑡𝑢𝑟𝑎𝑐𝑖ó𝑛 𝑝𝑎𝑟𝑎 𝑒𝑙 𝑐𝑟𝑒𝑐𝑖𝑚𝑖𝑒𝑛𝑡𝑜(𝑀𝐿−3 ) = 20
𝑦 = 𝑐𝑜𝑒𝑓𝑖𝑐𝑖𝑒𝑛𝑡𝑒 𝑑𝑒 𝑟𝑒𝑛𝑑𝑖𝑚𝑖𝑒𝑛𝑡𝑜(𝑀𝑀−1 ) = 0.05
𝑏 = 𝑐𝑜𝑒𝑓𝑖𝑐𝑖𝑒𝑛𝑡𝑒 𝑑𝑒 𝑑𝑒𝑐𝑎𝑖𝑚𝑖𝑒𝑛𝑡𝑜 (𝑇 −1 ) = 0.01
Las condiciones iniciales son 𝑠0 = 1000 𝑦 𝑥0 = 100
SOLUCION
Para (a)
Usando el software MATLAB para resolver sistemas de ecuaciones diferenciales se
obtienen los siguientes resultados:
Grafica
f1=@(x,y) 0.05*x*y/(20+y);
f2=@(x,y) -5*y*x/(20+y);
[t,y,x]=euler(f1,f2,0,2,1000,100,15);
hold on
plot(t,x,'b')
plot(t,y,'r')
xlabel('t')
ylabel('x,s')
axis([0 2 0 1000])
title('sistema de ecuaciones diferenciales')
hold off
grid
tab=[t',y',x'];
fprintf('\t\tMETODO DE EULER\n')
fprintf('\t-----------------------------------\n')
fprintf('\t\t t s x\n')
fprintf('\t-----------------------------------\n')
fprintf('\t%8.4f %10.5f %10.5f\n',tab')
fprintf('\nse observa en la grafica que para un tiempo aproximadamente de
t=2h nos garantiza\n')
fprintf('una buena conversion de la biorreaccion.\n')
Para (b)
Usando el software MATLAB para resolver sistemas de ecuaciones diferenciales se
obtienen los siguientes resultados:
Grafica
y0(1)=100;
y0(2)=1000;
tspan=[0 2];
fg=@(t,y) [0.05*y(1)*y(2)/(20+y(2));-5*y(2)*y(1)/(20+y(2))];
[t,y]=ode23(fg,tspan,y0);
tab=[t,y];
fprintf('\t\tMETODO DE RUNGE-KUTTA 2° ORDEN\n')
fprintf('\t-----------------------------------\n')
fprintf('\t\t t x s\n')
fprintf('\t-----------------------------------\n')
fprintf('\t%8.4f %10.5f %10.5f\n',tab')
fprintf('\t-----------------------------------\n\n')
plot(t,y(:,1),'-r',t,y(:,2),'-b','LineWidth',1)
title('bioreaccion')
xlabel('Tiempo, t')
ylabel('Concentración,x, s')
fprintf('\nse observa en la grafica que para un tiempo aproximadamente de
t=2h nos garantiza\n')
fprintf('una buena conversion de la biorreaccion.\n')
EJERCICIO 5.11:
implementar el método de Runge-Kutta de cuarto orden para cualquier cantidad de
ODE-IVP simultáneos en VBA.
Lo único que un usuario debe cambiar para usar el programa es Subrountine para
calcular las funciones del "lado derecho" para las EDO. El usuario también debe
especificar los datos de entrada requeridos. Una interfaz de usuario sugerida asociada
con la hoja de cálculo de Excel que interactúa con el programa VBA es como se muestra
en el ejemplo 5.7. (The only thing a user must change to use the program is the
Subrountine to calculate the "right-hand side" functions for the EDOs. The user must
also specify the required input data. A suggested user interface associated with the
Excel spreadsheet that interacts with the VBA program is as shown in example 5.7.)
A continuación, se dan algunos consejos para ayudar a preparar el programa VBA.
Recuerde el algoritmo para usar el método de cuarto orden Runge.Kutta con solo un
EDO:
𝒌𝟐 𝒉
k2 = hf( yn + , t n +𝟐 )
𝟐
𝒌𝟐 𝒉
k3 = hf( yn + , t n +𝟐 )
𝟐
k4 = hf( yn + k3, tn + h )
𝟏
yn+1 = yn + 𝟔 [𝒌𝟏 + 𝟐𝒌𝟐 + 𝟐𝒌𝟑 + 𝒌𝟒 ]
Para generalizar esto a N EDO simultáneas, haga que cada k, y, y f una matriz con
subíndices de 1 a N. Aquí están las declaraciones ReDim sugeridas:
f=inline('[ingresar
ecuación]','x','y');
x1=zeros(1,length(N));
x1(1,1)=xo;
y1=zeros(1,length(N));
y1(1,1)=yo;
fprintf('\n\n\t\t\t\t\tpara dt = 0.05\n')
fprintf('\t\t\t\t------------------------------\n')
fprintf('\t\t\t \ti \t t(i) \tH(i) \n')
fprintf('\t\t\t\t------------------------------\n')
fprintf('\t\t\t \t%2d \t%6.4f \t%8.6f\n',i,xo,yo)
N=(xf-xo)/h;
while i<N
k1=f(xo,yo);
k2=f(xo+h/2,yo+h*k1/2);
k3=f(xo+h/2,yo+h*k2/2);
k4=f(xo+h,yo+h*k3);
yo=yo+h/6*(k1+2*k2+2*k3+k4);
xo=xo+h;
i=i+1;
fprintf('\t\t\t \t%2d \t%6.4f \t%8.6f\n',i,xo,yo)
x1(1,i+1)=xo;
y1(1,i+1)=yo;
end
BIBLIOGRAFIA
Chapra, S. y Canale, R. 2015. Métodos numéricos para ingenieros. Séptima
Edición.McGraw-Hill/Interamericana Editores, S.A. de C.V. México