Documentos de Académico
Documentos de Profesional
Documentos de Cultura
UNIVERSIDAD DE ALICANTE
REACTORES QUMICOS.
RESOLUCION DE PROBLEMAS CON ORDENADOR
Mientras que en otras partes de la asignatura (teora y problemas) se explican las bases y se
realizan simplificaciones en los problemas que permiten la resolucin mediante relaciones (mas
o menos) simples de todas las variables implicadas y se introducen trminos como el grado de
conversin y los factores de expansin, en esta parte de la asignatura se realizan estudios de
simulacin sin limitacin de ningn tipo y sin tener que asumir simplificaciones para la
resolucin de los problemas. No nos limitaremos a problemas de una sola reaccin qumica o
a sistemas en que el estudio de la evolucin de todos los compuestos implicados se deban
reducir al estudio de un nico compuesto denominado clave.
Sin embargo, antes de continuar debemos remarcar un aspecto a menudo olvidado por los
alumnos (y en ocasiones por los profesores). Las simplificaciones reducen en gran medida los
problemas, pero debemos llevar cuidado y realizar solo las simplificaciones adecuadas en
base a dos puntos:
a) Simplifican el calculo y no tienen efectos sobre el resultado final (o el efecto se
considera despreciable)
b) Queremos ver el resultado en esta vida
En todo caso, debemos tener en cuenta que los estudios que realizaremos partirn siempre de
balances de materia para todos los compuestos implicados (exceptuando los compuestos
cuyo comportamiento pueda ser directamente relacionado con el comportamiento de otros
compuestos implicados) y balances de energa cuando el sistema no sea isotermo.
Puesto que los estudios de simulacin serian intratables mediante el tratamiento con clculos
clsicos con calculadora, todos los problemas se solucionaran mediante la implantacin de los
problemas que resolveremos en programas de ordenador. Para esta asignatura se ha elegido
el programa MATLAB, ya utilizado en asignaturas anteriores y cuya utilizacin no es
demasiado compleja. Es necesario sealar que se debe repasar los apuntes de estas
asignaturas antes del desarrollo de estos problemas.
En este tema de introduccin a esta parte de la asignatura veremos en primer lugar una breve
introduccin sobre la definicin y utilizacin de variables y de las diferentes estructuras de
programacin que podemos incluir dentro de un programa, para posteriormente comentar
brevemente la metodologa de resolucin de problemas mediante la tcnica de refinamientos
sucesivos. A continuacin se explicara la forma convencional de plantear un problema que
incluya ecuaciones diferenciales y de problemas de optimizacin.
1. VARIABLES Y VECTORES
La manera de hacer referencia a los diferentes elementos que intervienen en un programa es
darle un nombre particular a cada uno. En programacin se llaman identificadores a los
nombres usados para identificar cada elemento del programa.
En la mayora de los lenguajes de programacin de alto nivel (MATLAB incluido) los
identificadores son una palabra formada con caracteres alfabticos o numricos seguidos, sin
espacios en blanco ni signos de puntuacin intercalados, y que debe comenzar por una letra.
Pueden usarse las 52 letras maysculas y minsculas del alfabeto ingls, y los dgitos decimales
del 0 al 9.
Como precauciones deben tenerse en cuenta las siguientes consideraciones:
Ampliando estos conceptos, debemos sealar que en MATLAB podemos usar 31 caracteres
para definir una variable. En el identificador asignado a una variable, dentro de estos 31
caracteres deben tenerse en cuenta lo dicho anteriormente..
MATLAB distingue entre maysculas y minsculas, por lo que deberemos prestar especial
atencin a este hecho. Si en algn momento del desarrollo de un programa, cuando lo
ejecutamos aparece el mensaje ??? Undefined function or variable .... es
porque (con casi total seguridad) estamos haciendo referencia a una variable que no existe, y
que implica en el caso de que el programa este bien elaborado en lo restante que hemos
cometido un error gramatical al hacer referencia a una variable.
Finalmente, para evitar hacer referencia a palabras reservadas, podemos utilizar una
caracterstica sealada anteriormente. En MATLAB todas las funciones estn definidas y se
hace referencia a ellas en minsculas, por lo que definiendo todas las variables con el primer
carcter en maysculas evitaremos estos problemas. Un ejemplo de esto puede ser la
definicin de una variable con el nombre error, que por otra parte no es un identificador
extrao para una variable. En MATLAB existe una funcin denominada error que se utiliza
para detener un programa y devolver un mensaje.
1.1. Tipos de variables
En MATLAB existen dos tipos de variables, siempre identificadas por un nombre. Estas
variables pueden almacenar nmeros o texto.
Para introducir un texto en una variable este texto debe ir entre comillas simples (tecla al lado
del cero). En el editor de MATLAB en sus versiones posteriores a la 5.3 esto aparecer en
color rojo. Como ejemplo, para almacenar dentro de la variable Nombre el texto p38 lo
haremos como sigue:
Nombre='p38';
Sealaremos que MATLAB no diferencia entre variables que almacenen nmeros enteros,
vectores, matrices, nmeros complejos, etc. Dentro de la variable podemos almacenar un
numero o un vector de 8 elementos (o los que sean) sin incluir ninguna diferencia en su
definicin (como podra ser el $ de BASIC para texto o la definicin de la clase
correspondiente en C++):
D=32:
E=[1, 2, 3, 4, 5, 6, 7, 8];
La nica diferencia, como se puede observar en las lneas anteriores, es que para definir un
vector (fila) los distintos elementos deben ser incluidos entre corchetes y separados por comas
o espacios en blanco.
Si quisiramos definir una matriz, con diferentes filas, las distintas filas de esta matriz deben ser
separadas por un punto y coma (;),
A=[1 2 3; 4 5 6; 7 8 9]
A =
1
Para definir un vector que vaya desde 0 hasta 100 y que contenga 200 puntos podemos
utilizar la funcin linspace de acuerdo con el ejemplo siguiente:
Tiempo=linspace(0,100,200)
Esta instruccin creara un vector fila que cumple lo dicho anteriormente y lo almacenara
dentro de la variable Tiempo.
Si conociramos el espaciado entre los puntos solo debemos indicar el primer punto, el
espaciado y el ultimo punto separados por dos puntos cada uno de ellos y sin hacer referencia
a ninguna funcin:
Tiempo=0:1:200
Esta instruccin creara un vector fila que ira desde 0 hasta 200 y sus diferentes elementos se
diferenciaran en una unidad. Si sealamos otro espaciado como por ejemplo 0.5, los
elementos se diferenciaran en ese espaciado:
Tiempo=0:0.5:200
Si queremos crear matrices podemos utilizar las funciones ones o zeros, que crearan matrices
con un numero determinado de filas y columnas llenas de unos o ceros respectivamente.
A=ones(1,2)
B=zeros(3,6)
A(2,5)
Para hacer referencia a rango de elementos podemos usar el operador dos puntos (:). As,
A(:,5) hace referencia a todas las filas de la columna 5 y A(100,:) hace referencia a todas
las columnas de la fila 100.
^
/
\
.*
./
.^
adicin o suma
sustraccin o resta
multiplicacin
traspuesta
potenciacin
divisin-izquierda
divisin-derecha
producto elemento a elemento
divisin elemento a elemento
elevar a una potencia elemento a elemento
Estos operadores se aplican tambin a las variables o valores escalares, aunque con algunas
diferencias. Todos estos operadores son coherentes con las correspondientes operaciones
matriciales: no se puede por ejemplo sumar matrices que no sean del mismo tamao. Si los
operadores no se usan de modo correcto se obtiene un mensaje de error. Los operadores
anteriores se pueden aplicar tambin de modo mixto, es decir con un operando escalar y otro
matricial. En este caso la operacin con el escalar se aplica a cada uno de los elementos de la
matriz.
Es muy importante en este punto hacer especial hincapi en las tres operaciones elemento a
elemento. Debemos tener en cuenta que estas operaciones hacen que MATLAB se parezca
mas a MS EXCEL.
A=linspace(0,10,5)
A =
0
2.5000
5.0000
7.5000
10.0000
0.5985
-0.9589
0.9380
-0.5440
B=sin(A)
B =
0
Si queremos calcular un nuevo vector que corresponda a A/B, pero sin que sea una divisin
matricial (es decir, [0/0, 2.5/0.5985, 5/-0.9589, ...]), debemos utilizar la divisin elemento a
elemento:
A./B
Warning: Divide by zero.
ans =
NaN
4.1773
-5.2142
7.9957
-18.3816
2. CONCEPTO DE SUBPROGRAMA
Un subprograma, como su nombre indica, es una parte de un programa. Como mecanismo de
programacin, un subprograma es una parte de un programa que se desarrolla por separado y
se utiliza invocndolo mediante un nombre simblico.
Desde el punto de vista de una buena metodologa de programacin, el mecanismo de
subprograma debe utilizarse para fragmentos del programa que tengan un cierto sentido en s
mismos. Si se hace as, podramos decir que, al igual que un programa sirve para resolver un
problema, un subprograma sirve para resolver un subproblema.
El empleo de subprogramas, desarrollando por separado ciertas partes del programa, resulta
especialmente ventajoso en los casos siguientes:
a descomponer hasta que todo el programa se puede escribir utilizando las sentencias
disponibles en el lenguaje empleado.
Hasta el momento hemos continuado los refinamientos hasta llegar a las sentencias bsicas de
MATLAB. Podemos ver ahora sobre un ejemplo cmo es el programa resultante si las
operaciones intermedias se definen como subprogramas en MATLAB.
Por ejemplo, consideremos un programa para calcular el permetro del tringulo formado por
tres puntos (A, B y C).
Los primeros pasos del refinamiento seran los siguientes:
Calcular e imprimir el permetro --- >
Leer las coordenadas de los vrtices
Calcular el permetro
Imprimir el permetro
A su vez, la operacin de calculo del permetro se puede descomponer en una secuencia de
calculo de las distancias de un punto a otro para los tres puntos del tringulo.
Calcular el permetro ---->
Calcular la distancia desde el punto A al B
Calcular la distancia desde el punto B al C
Calcular la distancia desde el punto C al A
Con lo cual parecera adecuado construir un subprograma al cual si le proporcionamos las
coordenadas de los dos puntos nos devuelva la distancia entre ellos de acuerdo con la formula
matemtica establecida.
A continuacin se estudian las dos formas fundamentales de subprogramas en programacin
imperativa: Funciones y Procedimientos, y su manejo utilizando el lenguaje MATLAB.
3. FUNCIONES
Cuando se disea y desarrolla un programa aparecen con frecuencia operaciones significativas
que dan como resultado un valor simple y nico en funcin de ciertos parmetros. Por
ejemplo:
Potencia:
Volumen de un cubo:
Area de un tringulo:
Distancia entre dos puntos:
xn
Lado3
(Base * Altura) / 2
((x1 - x2)2 + (y1 -y2)2)1/2
de otros valores dados como argumentos. En lneas generales, una funcin se asemeja
bastante a la idea matemtica de funcin F(x, y, ... ), con argumentos x, y,
La declaracin se inicia con la palabra clave function y a continuacin, entre corchetes, las
variables que contendrn el resultado, separadas por comas. Seguidamente, un nombre
identificador de la funcin (que debe coincidir obligatoriamente con el nombre del fichero en
algunas versiones de MATLAB) y a continuacin la lista de los argumentos, entre parntesis,
y separados por el carcter de coma (,).
Las cabeceras de las funciones para los ejemplos anteriores podran ser:
function x2=potencia(x)
function V=volumen(lado)
......
function S=Area(Base, Altura)
......
Estas cabeceras representan la interfaz entre la definicin de la funcin y su utilizacin
posterior. Los nombres de los argumentos son formales, esto quiere decir que no son
variables del programa, sino slo nombres simblicos que sirven para formalizar la definicin
posterior de la funcin, permitiendo hacer referencia a los argumentos en la definicin de los
clculos.
La definicin completa de una funcin se compone de la cabecera, seguida de un cuerpo que
tiene la misma estructura que un bloque de programa completo. La parte principal de la
funcin estar constituida por una secuencia de sentencias.
Por ejemplo, la definicin completa de las funciones anteriores se realizara de la siguiente
forma:
function x2=potencia(x)
x2=x*x;
function V=volumen(lado)
V=lado*lado*lado;
......
function S=area(lado,altura)
S=(base*altura)/2;
4. GRFICOS BIDIMENSIONALES
MATLAB utiliza un tipo especial de ventanas para realizar las operaciones grficas. Ciertos
comandos abren una ventana nueva y otros dibujan sobre la ventana activa, bien sustituyendo
lo que hubiera en ella, bien aadiendo nuevos elementos grficos a un dibujo anterior. Todo
esto se ver con ms detalle en las siguientes secciones.
En lo sucesivo se har referencia casi exclusiva a la primera de estas funciones (plot). Las
dems se pueden utilizar de un modo similar.
10
Existen adems otras funciones orientadas a aadir ttulos al grfico, a cada uno de los ejes, a
dibujar una cuadrcula auxiliar, a introducir texto, ete. Estas funciones son las siguientes:
title('ttulo')
aade un ttulo al dibujo
xlabel('tal')
aade una etiqueta al eje de abscisas. Con xlabel off desaparece
ylabel('cual')
aade una etiqueta al eje de ordenadas. Con ylabel off desaparece
text(x,y,'texto') introduce 'texto' en el lugar especificado por las coordenadas x e y.
gtext('tcxto')
introduce texto con ayuda del ratn: el cursor cambia de forma y se
espera un clic para introducir el texto en esa posicin
legend()
define rtulos para las distintas lneas o ejes utilizados en la figura. Para
ms detalle, consultar el He1p
grid
activa la inclusin de una cuadrcula en el dibujo. Con grid off
desaparece la cuadrcula
1
1
1.5
2.5
3.5
4.5
El resultado de este comando es que se abre una ventana mostrando el grfico de la figura
anterior. Por defecto, los distintos puntos del grfico se unen con una lnea continua. Tambin
por defecto, el color que se utiliza para la primera lnea es el azul.
La funcin plot() permite tambin dibujar mltiples curvas introduciendo varias parejas de
vectores como argumentos. En este caso, cada uno de los segundos vectores se dibujan en
ordenadas como funcin de los valores del primer vector de la pareja, que se representan en
11
abscisas. Si el usuario no decide otra cosa, para las sucesivas lneas se utilizan colores que son
permutaciones cclicas del azul, verde, rojo, cian, magenta, amarillo y negro. Obsrvese bien
cmo se dibujan el seno y el coseno en el siguiente ejemplo:
x=0:pi/25:6*pi;
Y=sin(x); Z=cos(x);
plot(x,Y,x,Z)
1
0.8
0.6
0.4
0.2
0
-0.2
-0.4
-0.6
-0.8
-1
0
10
12
14
16
18
20
Color
Yellow
Magenta
cyan
red
green
blue
white
black
Smbolo
:
-.
--
Estilo de lnea
lneas continuas
lneas a puntos
lneas a barra-punto
lneas a trazos
Smbolo
.
o
x
+
+
s
d
^
v
>
<
p
h
Marcadores (markers)
puntos
crculos
marcas en x
marcas en +
marcas en *
marcas cuadradas (square)
marcas en diamante (diamond)
tringulo apuntando arriba
tringulo apuntando abajo
tringulo apuntando a la dcha
tringulo apuntando a la izda
estrella de 5 puntas
estrella de seis puntas
12
13
y1 = 5; y 2 = 2; y 3 = 10
14
function F=prueba(x,y)
%
%
%
%
F(1)=2*y(2)-0.1*y(1)+y(3);
F(2)=-2*y(2)+0.1*y(1)+y(3);
F(3)=-2*y(2)-0.1*y(1)-y(3);
% En estos momentos el vector F es un vector fila y
% el vector F debe ser columna para solucionarlo lo trasponemos
F=F';
Para resolver el problema, solo nos resta incluir en un programa o a travs de la lnea de
comandos las siguientes ordenes:
% Programa de ejecucin del ejemplo del Tema
A='prueba';
X0=0;
XF=10;
Y0=[5 2 10];
%
%
%
%
[X,Y]=ode113(A,[X0 XF],Y0);
plot(X,Y)
Tras la ejecucin, escribiendo en la lnea de comandos el nombre del programa donde hemos
almacenado este texto (ej1.m) sin el .m, obtenemos un dibujo con la representacin de la
evolucin de estas variables y almacenadas en la variable X la evolucin de la variable
independiente en un vector columna y en la matriz Y la evolucin de las distintas variables
dependientes en distintas columnas.
15
14
12
10
-2
0
[X Y]
ans =
0
0.0024
0.0073
0.0170
0.0365
0.0754
0.1532
0.3089
0.4646
0.6203
0.7760
0.9317
1.0873
1.2430
1.3987
1.7101
1.9903
2.2705
2.5227
2.7749
3.0271
3.2793
3.5315
3.7837
4.0359
4.2881
4.5403
4.7926
5.0448
5.2970
5.5492
5.0000
5.0328
5.0984
5.2294
5.4903
6.0064
7.0078
8.8348
10.3648
11.5659
12.4418
13.0183
13.3336
13.4310
13.3544
12.8382
12.1376
11.3534
10.6460
9.9713
9.3447
8.7698
8.2442
7.7629
7.3193
6.9082
6.5247
6.1652
5.8266
5.5071
5.2050
2.0000
2.0157
2.0467
2.1069
2.2202
2.4195
2.7190
2.9947
2.9580
2.7245
2.3814
1.9922
1.6004
1.2342
0.9099
0.4103
0.1239
-0.0391
-0.1112
-0.1375
-0.1372
-0.1233
-0.1049
-0.0864
-0.0707
-0.0583
-0.0491
-0.0427
-0.0382
-0.0351
-0.0329
10.0000
9.9647
9.8942
9.7532
9.4714
8.9106
7.8078
5.7334
3.9038
2.3604
1.1099
0.1363
-0.5898
-1.1044
-1.4452
-1.7466
-1.7465
-1.6207
-1.4681
-1.3132
-1.1735
-1.0552
-0.9586
-0.8807
-0.8174
-0.7650
-0.7201
-0.6806
-0.6444
-0.6106
-0.5786
16
10
5.8014
6.0536
6.5580
6.9836
7.4091
7.8347
8.2603
8.6858
9.1114
10.0000
4.9192
4.6487
4.1506
3.7716
3.4269
3.1137
2.8291
2.5705
2.3356
1.9120
-0.0312
-0.0297
-0.0271
-0.0249
-0.0228
-0.0208
-0.0189
-0.0172
-0.0156
-0.0127
-0.5481
-0.5188
-0.4641
-0.4220
-0.3834
-0.3484
-0.3165
-0.2875
-0.2612
-0.2138
6. OPTIMIZACION DE FUNCIONES
Para obtener los parmetros cinticos de un problema normalmente dispondremos de datos
experimentales y querremos comprobar, en primer lugar si se ajustan bien a una cintica
determinada y de forma simultanea a esto, cual es el valor de los parmetros cinticos (orden,
volar de constantes cinticas y/o factores preexponenciales) que mejor representan el
problema.
Para ello usaremos la funcin fmins, disponible en MATLAB y que minimiza un funcin de
varias variables. El uso de esta funcin es muy sencillo:
x = fmins('f',x0)
devuelve un vector x que es un mnimo local de f(x) cercano al punto inicial x0. Esta claro que
f(x) debe de ser una funcin escalar de un vector. Veamos un ejemplo.
Una serie de experimentos nos ha proporcionado la evolucin de la concentracin de 1
compuesto con el tiempo en un RDTA isotermo. Desconocemos el orden de la reaccin, su
constante cintica y el factor preexponencial siendo conocida la temperatura a la cual se
desarrolla la reaccin.
Los datos experimentales se muestran en la tabla siguiente
Tiempo (s)
1.0
2.0
3.0
4.0
5.0
6.0
7.0
8.0
9.0
10.0
11.0
12.0
13.0
Ca (mol/L)
10.0
9.5
9.1
8.8
8.4
8.1
7.8
7.5
7.3
7.0
6.8
6.6
6.4
17
14.0
15.0
16.0
17.0
18.0
19.0
20.0
21.0
22.0
23.0
24.0
25.0
6.2
6.0
5.9
5.7
5.6
5.4
5.3
5.2
5.0
4.9
4.8
4.7
Calculamos un vector
diferencia entre los valores
teoricos y los experimentales
18
CAexp=[10 9.5 9.1 8.8 8.1 7.8 7.5 7.3 7.0 6.8 6.6 6.4 6.2 6.0 5.9 5.7
5.6 5.4 5.3 5.2 5.0 4.9 4.8 4.7 4.6]';
% Reasignamos las constantes, pero antes las definimos como globales,
para que puedan ser
% utilizadas por el fichero funcion
global K0 E N
K0=X(1);
E=X(2);
N=X(3);
% Preparando la aplicacion del ODE113
PuntoInicial=0;
PuntoFinal=25;
Ca0=10;
[T,CAteo]=ode113('f_ej3',Tiempo,Ca0);
% Hacemos la representacion
figure(1)
plot(Tiempo,CAexp,Tiempo,CAteo)
title('Ejemplo de optimizacion')
xlabel('Tiempo (s)')
ylabel('Ca (mol/L)')
legend('CAexp','CAteo')
grid
function E=f_ej2(X)
%
%
%
%
Fichero de funcion
X(1) Corresponde a
X(2) Corresponde a
X(3) Corresponde a
19
function F=f_ej3(t,Ca)
% Fichero de funcion del ejemplo 2. Integracion
% Definimos las variables como globales, para que puedan ser
utilizadas por el fichero funcion
global K0 E N
F=-K0*exp(-E/298)*Ca^N;
2.1086
0.0023
Ca (mol/L)
10
15
20
25
Tiempo (s)
Hasta aqu se ha desarrollado una breve explicacin de los apartados que se consideran mas
importantes y cuyo recuerdo era imprescindible para la resolucin de los diferentes problemas
que veremos en la asignatura. A partir de ahora realizaremos una serie de problemas que
20
incluyen casi todos los aspectos posibles en la simulacin de sistemas que incluyen reaccin
qumica.
21