Top Banner
DEPARTAMENTO DE INGENIERÍA QUÍMICA UNIVERSIDAD DE ALICANTE REACTORES QUÍMICOS. RESOLUCION DE PROBLEMAS CON ORDENADOR Manuel Rodríguez Pastor Rev: Junio 2002
21
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Tema

DEPARTAMENTO DE INGENIERÍA QUÍMICA

UNIVERSIDAD DE ALICANTE

REACTORES QUÍMICOS.

RESOLUCION DE PROBLEMAS CON ORDENADOR

Manuel Rodríguez Pastor Rev: Junio 2002

Page 2: Tema

2

Dentro de la denominación de Reactores Químicos se encuentra un área de conocimiento que normalmente es considerada únicamente como una asignatura mas. Sin embargo, debemos observar esta asignatura desde un visto de vista mas amplio y considerarla como conocimientos básicos que debemos dominar para la mejor asimilación de otras asignaturas y áreas de conocimiento (como pueden ser la simulación, operaciones de separación que incluyan la posibilidad de reacción química entre componentes, transporte reactivo de sustancias, simulación medioambiental, etc.

Mientras que en otras partes de la asignatura (teoría y problemas) se explican las bases y se realizan simplificaciones en los problemas que permiten la resolución mediante relaciones (mas o menos) simples de todas las variables implicadas y se introducen términos como el grado de conversión y los factores de expansión, en esta parte de la asignatura se realizan estudios de simulación sin limitación de ningún tipo y sin tener que asumir simplificaciones para la resolución de los problemas. No nos limitaremos a problemas de una sola reacción química o a sistemas en que el estudio de la evolución 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

Se estudiaran dos tipos de problemas fundamentalmente: estudios de simulación en los cuales se estudiaran como evolucionan las concentraciones (o caudales molares) con el tiempo o la longitud y problemas de determinación de constantes cinéticas basándonos en datos experimentales.

En todo caso, debemos tener en cuenta que los estudios que realizaremos partirán 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 energía cuando el sistema no sea isotermo.

Puesto que los estudios de simulación serian intratables mediante el tratamiento con cálculos clásicos con calculadora, todos los problemas se solucionaran mediante la implantación 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 utilización no es demasiado compleja. Es necesario señalar que se debe repasar los apuntes de estas asignaturas antes del desarrollo de estos problemas.

Page 3: Tema

3

En el presente tema realizaremos un breve desarrollo de las instrucciones y estructuras que se utilizaran en la resolución de los problemas planteados. Asimismo, debemos señalar una metodología muy importante para el estudio de esta parte de la asignatura de Reactores Químicos y es que a programar se aprende programando, por lo cual el estudiante debe en lo posible intentar la resolución de los problemas por su cuenta.

En este tema de introducción a esta parte de la asignatura veremos en primer lugar una breve introducción sobre la definición y utilización de variables y de las diferentes estructuras de programación que podemos incluir dentro de un programa, para posteriormente comentar brevemente la metodología de resolución de problemas mediante la técnica de refinamientos sucesivos. A continuación se explicara la forma convencional de plantear un problema que incluya ecuaciones diferenciales y de problemas de optimización.

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 programación se llaman identificadores a los nombres usados para identificar cada elemento del programa. En la mayoría de los lenguajes de programación de alto nivel (MATLAB incluido) los identificadores son una palabra formada con caracteres alfabéticos o numéricos seguidos, sin espacios en blanco ni signos de puntuación intercalados, y que debe comenzar por una letra. Pueden usarse las 52 letras mayúsculas y minúsculas del alfabeto inglés, y los dígitos decimales del 0 al 9. Como precauciones deben tenerse en cuenta las siguientes consideraciones: • Evitar el uso de caracteres especiales. No deben aparecer caracteres especiales, como

son el punto, la coma, la ñ, vocales acentuadas, espacios en blanco, etc • La mayoría de lenguajes de programación diferencia entre mayúsculas y minúsculas. • No se pueden utilizar palabras reservadas, como instrucciones, comandos o funciones. Ampliando estos conceptos, debemos señalar 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 mayúsculas y minúsculas, por lo que deberemos prestar especial atención a este hecho. Si en algún 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.

Page 4: Tema

4

Finalmente, para evitar hacer referencia a palabras reservadas, podemos utilizar una característica señalada anteriormente. En MATLAB todas las funciones están definidas y se hace referencia a ellas en minúsculas, por lo que definiendo todas las variables con el primer carácter en mayúsculas evitaremos estos problemas. Un ejemplo de esto puede ser la definición de una variable con el nombre “error”, que por otra parte no es un identificador extraño para una variable. En MATLAB existe una función 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 números 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';

La introducción de números dentro de una variable es más sencilla y solo debemos poner después del signo igual el numero que queremos almacenar. Si ponemos una expresión, dentro de la variable se almacenara el valor numérico del resultado: A=543; B=5+2/8; C=A+B;

Señalaremos que MATLAB no diferencia entre variables que almacenen números enteros, vectores, matrices, números 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 definición (como podría ser el $ de BASIC para texto o la definición 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 líneas 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 quisiéramos definir una matriz, con diferentes filas, las distintas filas de esta matriz deben ser separadas por un punto y coma (;),

Page 5: Tema

5

A=[1 2 3; 4 5 6; 7 8 9]

A =

1 2 3

4 5 6

7 8 9

1.2. Definición de vectores y matrices.

Existen algunos métodos que simplifican la definición de vectores y matrices, en forma de funciones implementadas en MATLAB. Solo señalaremos en este apartado los mas simples, recordando al alumno la existencia de materiales didácticos mas especificos del manejo de MATLAB.

Para definir un vector que vaya desde 0 hasta 100 y que contenga 200 puntos podemos utilizar la función linspace de acuerdo con el ejemplo siguiente: Tiempo=linspace(0,100,200)

Esta instrucción creara un vector fila que cumple lo dicho anteriormente y lo almacenara dentro de la variable Tiempo.

Si conociéramos 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 función: Tiempo=0:1:200

Esta instrucción creara un vector fila que ira desde 0 hasta 200 y sus diferentes elementos se diferenciaran en una unidad. Si señalamos 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) à crea un vector de 1 fila y dos columnas llenas de unos

B=zeros(3,6) à crea un vector de 3 filas y 6 columnas llena de ceros

Page 6: Tema

6

1.3. Referencia a elementos de una matriz o un vector.

Para hacer referencia a un elemento de un vector o una matriz debe ponerse entre paréntesis el (o los números) que identifiquen esa posición:

A(5) à hace referencia al elemento 5 del vector A

A(2,5) à hace referencia al elemento que se encuentra en la 2 fila y quinta columna

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.

1.4. Operaciones matemáticas entre matrices.

MATLAB puede operar con matrices por medio de operadores y por medio de funciones. Los operadores matriciales de MATLAB son los siguientes:

+ adición o suma - sustracción o resta * multiplicación ‘ traspuesta ^ potenciación / división-izquierda \ división-derecha .* producto elemento a elemento ./ división elemento a elemento .^ elevar a una potencia elemento a elemento

Estos operadores se aplican también 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 tamaño. Si los operadores no se usan de modo correcto se obtiene un mensaje de error. Los operadores anteriores se pueden aplicar también de modo mixto, es decir con un operando escalar y otro matricial. En este caso la operación 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.

Supongamos que tenemos dos vectores:

Page 7: Tema

7

» A=linspace(0,10,5)

A =

0 2.5000 5.0000 7.5000 10.0000

» B=sin(A)

B =

0 0.5985 -0.9589 0.9380 -0.5440

Si queremos calcular un nuevo vector que corresponda a A/B, pero sin que sea una división matricial (es decir, [0/0, 2.5/0.5985, 5/-0.9589, ...]), debemos utilizar la división 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 programación, un subprograma es una parte de un programa que se desarrolla por separado y se utiliza invocándolo mediante un nombre simbólico. Desde el punto de vista de una buena metodología de programación, el mecanismo de subprograma debe utilizarse para fragmentos del programa que tengan un cierto sentido en sí mismos. Si se hace así, podríamos 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: • En programas complejos: Si el programa se escribe todo seguido resulta muy complicado

de entender, porque se difumina la visión de su estructura global entre la gran cantidad de operaciones que forman el código del programa. Aislando ciertas partes como subprogramas separados se reduce la complejidad de la visión global del programa.

• Cuando se repiten operaciones análogas: Definiendo esa operación como subprograma

separado, su código se escribirá sólo una vez, aunque luego se use en muchos puntos del programa. El tamaño total del programa será menor que si se escribiera el código completo de la operación cada vez que se necesita.

La técnica de refinamientos sucesivos sugiere descomponer las operaciones complejas de un programa en otras más simples. En sucesivos pasos de refinamiento, cada operación se vuelve

Page 8: Tema

8

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 básicas de MATLAB. Podemos ver ahora sobre un ejemplo cómo es el programa resultante si las operaciones intermedias se definen como subprogramas en MATLAB. Por ejemplo, consideremos un programa para calcular el perímetro del triángulo formado por tres puntos (A, B y C). Los primeros pasos del refinamiento serían los siguientes: Calcular e imprimir el perímetro --- > Leer las coordenadas de los vértices Calcular el perímetro Imprimir el perímetro A su vez, la operación de calculo del perímetro se puede descomponer en una secuencia de calculo de las distancias de un punto a otro para los tres puntos del triángulo. Calcular el perímetro ----> 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 parecería 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 matemática establecida. A continuación se estudian las dos formas fundamentales de subprogramas en programación imperativa: Funciones y Procedimientos, y su manejo utilizando el lenguaje MATLAB. 3. FUNCIONES Cuando se diseña y desarrolla un programa aparecen con frecuencia operaciones significativas que dan como resultado un valor simple y único en función de ciertos parámetros. Por ejemplo: Potencia: x n Volumen de un cubo: Lado3 Area de un triángulo: (Base * Altura) / 2 Distancia entre dos puntos: ((x1 - x2)2 + (y1 -y2)2)1/2

Estas operaciones se pueden considerar subprogramas y más exactamente funciones. Una función es un tipo de subprograma que calcula como resultado un valor simple y único a partir

Page 9: Tema

9

de otros valores dados como argumentos. En líneas generales, una función se asemeja bastante a la idea matemática de función F(x, y, ... ), con argumentos x, y,

3.1. Definición de funciones El primer paso en el manejo de una función es declarar su interfaz. Esta declaración incluye su nombre, los argumentos que necesita (teniendo en cuenta cuales deben ser cadenas de texto y cuales números), y los resultados que proporciona. En MATLAB se define una función en un m-file escribiendo en este la cabecera de función de la siguiente forma: function [Variables de salida] = nombre (Variables de entrada) La declaración se inicia con la palabra clave function y a continuación, entre corchetes, las variables que contendrán el resultado, separadas por comas. Seguidamente, un nombre identificador de la función (que debe coincidir obligatoriamente con el nombre del fichero en algunas versiones de MATLAB) y a continuación la lista de los argumentos, entre paréntesis, y separados por el carácter de coma (,). Las cabeceras de las funciones para los ejemplos anteriores podrían ser: function x2=potencia(x) function V=volumen(lado) ...... function S=Area(Base, Altura) ...... Estas cabeceras representan la interfaz entre la definición de la función y su utilización posterior. Los nombres de los argumentos son formales, esto quiere decir que no son variables del programa, sino sólo nombres simbólicos que sirven para formalizar la definición posterior de la función, permitiendo hacer referencia a los argumentos en la definición de los cálculos. La definición completa de una función 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 función estará constituida por una secuencia de sentencias. Por ejemplo, la definición completa de las funciones anteriores se realizaría 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;

Page 10: Tema

10

3.2. Uso de funciones Para usar una función en los cálculos de un programa se invoca dicha función escribiendo su nombre y a continuación, entre paréntesis, los valores concretos de los argumentos, separados por comas. Esta invocación de la función representa un valor del tipo de la función, que podrá ser usado como operando en una expresión aritmética, o en general en cualquier parte del programa en que sea válido escribir una expresión de ese tipo. Al invocar una función es obligatorio que los valores suministrados para los argumentos correspondan en número y tipo con los argumentos en la definición. La correspondencia de tipo significa que el tipo del argumento en la invocación sea compatible en asignación con el tipo de argumento formal. El efecto de la invocación de una función puede describirse en forma simplificada de la siguiente manera: 1) Se evalúan las expresiones de los valores de los argumentos. 2) Se asignan dichos valores a los correspondientes argumentos formales. 3) Se ejecuta el código de la definición de la función, hasta alcanzar una sentencia de fin. 4) El valor retornado se usa en el punto donde se invocó la función. 4. GRÁFICOS BIDIMENSIONALES MATLAB utiliza un tipo especial de ventanas para realizar las operaciones gráficas. Ciertos comandos abren una ventana nueva y otros dibujan sobre la ventana activa, bien sustituyendo lo que hubiera en ella, bien añadiendo nuevos elementos gráficos a un dibujo anterior. Todo esto se verá con más detalle en las siguientes secciones.

4.1. Funciones gráficas 2D elementales MATLAB dispone de cuatro funciones básicas para crear gráficos 2-D. Estas funciones se diferencian principalmente por el tipo de escala que utilizan en los ejes de abscisas y de ordenadas. Estas cuatro funciones son las siguientes: plot() crea un gráfico a partir de vectores y/o columnas de matrices, con escalas lineales sobre ambos ejes. loglog() ídem con escala logarítmica en ambos ejes semilogx() ídem con escala lineal en el eje de ordenadas y logarítmica en el eje de abscisas semilogy() ídem con escala lineal en el eje de abscisas y logarítmica en el eje de

ordenadas En lo sucesivo se hará referencia casi exclusiva a la primera de estas funciones (plot). Las demás se pueden utilizar de un modo similar.

Page 11: Tema

11

Existen además otras funciones orientadas a añadir títulos al gráfico, a cada uno de los ejes, a dibujar una cuadrícula auxiliar, a introducir texto, ete. Estas funciones son las siguientes: title('título') añade un título al dibujo xlabel('tal') añade una etiqueta al eje de abscisas. Con xlabel off desaparece ylabel('cual') añade 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 ratón: el cursor cambia de forma y se

espera un clic para introducir el texto en esa posición legend() define rótulos para las distintas líneas o ejes utilizados en la figura. Para

más detalle, consultar el He1p grid activa la inclusión de una cuadrícula en el dibujo. Con grid off

desaparece la cuadrícula

4.2. Función plot Esta es la función clave de todos los gráficos 2-D en MATLAB. Ya se ha dicho que el elemento básico de los gráficos bidimensionales es el vector. Se utilizan también cadenas de 1, 2 ó 3 caracteres para indicar colores y tipos de línea. La función plot(), en sus diversas variantes, no hace otra cosa que dibujar vectores. Un ejemplo muy sencillo de esta función, en el que se le pasa un único vector como argumento, es el siguiente:

1 1.5 2 2.5 3 3.5 4 4.5 51

2

3

4

5

6

7

El resultado de este comando es que se abre una ventana mostrando el gráfico de la figura anterior. Por defecto, los distintos puntos del gráfico se unen con una línea continua. También por defecto, el color que se utiliza para la primera línea es el azul. La función plot() permite también dibujar múltiples curvas introduciendo varias parejas de vectores como argumentos. En este caso, cada uno de los segundos vectores se dibujan en ordenadas como función de los valores del primer vector de la pareja, que se representan en

Page 12: Tema

12

abscisas. Si el usuario no decide otra cosa, para las sucesivas líneas se utilizan colores que son permutaciones cíclicas del azul, verde, rojo, cian, magenta, amarillo y negro. Obsérvese bien cómo 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)

0 2 4 6 8 10 12 14 16 18 20-1

-0.8

-0.6

-0.4

-0.2

0

0.2

0.4

0.6

0.8

1

4.3. Estilos de línea y marcadores en la función plot En la sección anterior se ha visto cómo la tarea fundamental de la función plot() era dibujar los valores de un vector en ordenadas, frente a los valores de otro vector en abscisas. En el caso general esto exige que se pasen como argumentos un par de vectores. En realidad, el conjunto básico de argumentos de esta función es una tripleta formada por dos vectores y una cadena de 1, 2 ó 3 caracteres que indica el color y el tipo de línea o de marker. En la tabla siguiente se pueden observar las distintas posibilidades.

Símbolo Color Símbolo Marcadores (markers) y Yellow . puntos m Magenta o círculos c cyan x marcas en x r red + marcas en + G green + marcas en * B blue s marcas cuadradas (square) W white d marcas en diamante (diamond) k black ̂ triángulo apuntando arriba

v triángulo apuntando abajo Símbolo Estilo de línea > triángulo apuntando a la dcha

- líneas continuas < triángulo apuntando a la izda : líneas a puntos p estrella de 5 puntas -. líneas a barra-punto h estrella de seis puntas -- líneas a trazos

Page 13: Tema

13

4.4. Control de los ejes También en este punto MATLAB tiene sus opciones por defecto, que en algunas ocasiones puede interesar cambiar. El comando básico es el comando axis. Por defecto, MATLAB ajusta la escala de cada uno de los ejes de modo que varíe entre el mínimo y el máximo valor de los vectores a representar. Este es el llamado modo "auto", o modo automático. Para definir de modo explícito los valores máximo y mínimo según cada eje, se utiliza el comando: axis([xmin, xmax, ymin, ymax]) mientras que : axis(‘auto’) devuelve el escalado de los ejes al valor por defecto o automático. Otros posibles usos de este comando son los siguientes: v=axis devuelve un vector v con los valores [xmin, xmax, ymin, ymax] axis(axis) mantiene los ejes en sus actuales valores, de cara a posibles

nuevas gráficas añadidas con hold on axis('¡j') utiliza ejes de pantalla, con el origen en la esquina superior izda. y el eje j en dirección vertical descendente axis('xy') utiliza ejes cartesianos normales, con el origen en la esquina

inferior izda. y el eje y vertical ascendente axis('equal’) el escalado es igual en ambos ejes axis('square') la ventana será cuadrada axis('image') la ventana tendrá las proporciones de la imagen que se desea

representar en ella (por ejemplo la de una imagen bitinap que se desee importar) y el escalado de los ejes será coherente con dicha imagen

4.5. Control de ventanas gráficas: función figure Si se llama a la función figure sin argumentos, se crea una nueva ventana gráfica con el número consecutivo que le corresponda. El valor de retorno es dicho número. Por otra parte, el comando figure(n) hace que la ventana n pase a ser la ventana o figura activa. Si dicha ventana no existe, se crea una nueva ventana con el número consecutivo que le corresponda (que se puede obtener como valor de retorno del comando). La función close cierra la figura activa, mientras que close(n) cierra la ventana o figura número n. Si quisiéramos abrir varias ventanas donde poner gráficos, definimos la primera ventana, dibujamos el grafico, definimos la segunda, dibujamos los gráficos correspondientes y así todas las que queramos.

Page 14: Tema

14

5. SISTEMAS DE ECUACIONES DIFERENCIALES ACOPLADOS. Para la resolución de problemas que impliquen la integración numérica de sistemas de ecuaciones diferenciales en este curso utilizaremos la función ode113 existente en MATLAB. En este apartado veremos como utilizarla, los datos necesarios y los resultados que proporcionan. Un desarrollo mas amplio de este apartado se puede obtener escribiendo en la linea de comandos de MATLAB la instrucción “help ode113” y consultando toda la información relacionada. Esta función resuelve sistemas de ecuaciones diferenciales mediante un método de tamaño de paso variable y de orden variable, adaptándose a las variaciones que experimentan las variables. La línea de instrucción para utilizar la función ode113 es: [T,Y] = ode113('F',TSPAN,Y0) donde : T es un vector columna que incluye los valores de la variable independiente tras su integración Y es una matriz que contiene en sus columnas la variación de las distintas variables dependientes ‘F’ es el nombre del fichero que contiene las ecuaciones diferenciales y del que hablaremos mas adelante TSPAN es un vector con los valores de la X inicial y de la X final ([X0 XF]). Si quisiéramos los valores de las distintas variables dependientes para una serie de valores concretos de X, los indicaríamos en este vector ([X0 X1 X2 ... XF]) Y0 es un vector con los valores iniciales para todas las variables dependientes Las ecuaciones diferenciales se deben escribir en un fichero aparte, en el cual deberemos indicar como calcular los valores numéricos de las diferentes ecuaciones diferenciales y los valores obtenidos deben ser incluidos en un vector columna al final. Veamos un ejemplo para ilustrar todo lo dicho anteriormente. Consideremos el siguiente sistema de ecuaciones diferenciales con las condiciones iniciales indicadas:

10y;2y;5y0x

yy*1.0y*2dxdy

yy*1.0y*2dxdy

yy*1.0y*2dxdy

321

3123

3122

3121

====

−−−=

++−=

+−=

Page 15: Tema

15

Construiremos un fichero de MATLAB donde incluiremos las ecuaciones diferenciales. Para ello, debemos indicar como calcular los valores correspondientes de las diferentes pendientes:

3123

3122

3121

yy*1.0y*2Fyy*1.0y*2F

yy*1.0y*2F

−−−=++−=

+−=

El fichero quedara como sigue: function F=prueba(x,y) % F es un vector columna con las diferentes ecuaciones dif % x es la variable independiente, y debe ponerse en el encabezado % auqnue luego no aparezca en las ecuaciones diferenciales % y es un vector con las distintas variables dependientes. 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 través de la línea de comandos las siguientes ordenes: % Programa de ejecución del ejemplo del Tema A='prueba'; % Nombre del fichero que contiene el sistema de ec. X0=0; % Valor de la X inicial XF=10; % Valor de la X final Y0=[5 2 10]; % Vector con las X iniciales [X,Y]=ode113(A,[X0 XF],Y0); plot(X,Y) Tras la ejecución, escribiendo en la línea de comandos el nombre del programa donde hemos almacenado este texto (ej1.m) sin el .m, obtenemos un dibujo con la representación de la evolución de estas variables y almacenadas en la variable X la evolución de la variable independiente en un vector columna y en la matriz Y la evolución de las distintas variables dependientes en distintas columnas.

Page 16: Tema

16

0 1 2 3 4 5 6 7 8 9 10-2

0

2

4

6

8

10

12

14

» [X Y] ans = 0 5.0000 2.0000 10.0000 0.0024 5.0328 2.0157 9.9647 0.0073 5.0984 2.0467 9.8942 0.0170 5.2294 2.1069 9.7532 0.0365 5.4903 2.2202 9.4714 0.0754 6.0064 2.4195 8.9106 0.1532 7.0078 2.7190 7.8078 0.3089 8.8348 2.9947 5.7334 0.4646 10.3648 2.9580 3.9038 0.6203 11.5659 2.7245 2.3604 0.7760 12.4418 2.3814 1.1099 0.9317 13.0183 1.9922 0.1363 1.0873 13.3336 1.6004 -0.5898 1.2430 13.4310 1.2342 -1.1044 1.3987 13.3544 0.9099 -1.4452 1.7101 12.8382 0.4103 -1.7466 1.9903 12.1376 0.1239 -1.7465 2.2705 11.3534 -0.0391 -1.6207 2.5227 10.6460 -0.1112 -1.4681 2.7749 9.9713 -0.1375 -1.3132 3.0271 9.3447 -0.1372 -1.1735 3.2793 8.7698 -0.1233 -1.0552 3.5315 8.2442 -0.1049 -0.9586 3.7837 7.7629 -0.0864 -0.8807 4.0359 7.3193 -0.0707 -0.8174 4.2881 6.9082 -0.0583 -0.7650 4.5403 6.5247 -0.0491 -0.7201 4.7926 6.1652 -0.0427 -0.6806 5.0448 5.8266 -0.0382 -0.6444 5.2970 5.5071 -0.0351 -0.6106 5.5492 5.2050 -0.0329 -0.5786

Page 17: Tema

17

5.8014 4.9192 -0.0312 -0.5481 6.0536 4.6487 -0.0297 -0.5188 6.5580 4.1506 -0.0271 -0.4641 6.9836 3.7716 -0.0249 -0.4220 7.4091 3.4269 -0.0228 -0.3834 7.8347 3.1137 -0.0208 -0.3484 8.2603 2.8291 -0.0189 -0.3165 8.6858 2.5705 -0.0172 -0.2875 9.1114 2.3356 -0.0156 -0.2612 10.0000 1.9120 -0.0127 -0.2138 6. OPTIMIZACION DE FUNCIONES Para obtener los parámetros cinéticos de un problema normalmente dispondremos de datos experimentales y querremos comprobar, en primer lugar si se ajustan bien a una cinética determinada y de forma simultanea a esto, cual es el valor de los parámetros cinéticos (orden, volar de constantes cinéticas y/o factores preexponenciales) que mejor representan el problema. Para ello usaremos la función fmins, disponible en MATLAB y que minimiza un función de varias variables. El uso de esta función es muy sencillo: x = fmins('f',x0) devuelve un vector x que es un mínimo local de f(x) cercano al punto inicial x0. Esta claro que f(x) debe de ser una función escalar de un vector. Veamos un ejemplo. Una serie de experimentos nos ha proporcionado la evolución de la concentración de 1 compuesto con el tiempo en un RDTA isotermo. Desconocemos el orden de la reacción, su constante cinética y el factor preexponencial siendo conocida la temperatura a la cual se desarrolla la reacción. Los datos experimentales se muestran en la tabla siguiente

Tiempo (s) Ca (mol/L) 1.0 10.0 2.0 9.5 3.0 9.1 4.0 8.8 5.0 8.4 6.0 8.1 7.0 7.8 8.0 7.5 9.0 7.3 10.0 7.0 11.0 6.8 12.0 6.6 13.0 6.4

Page 18: Tema

18

14.0 6.2 15.0 6.0 16.0 5.9 17.0 5.7 18.0 5.6 19.0 5.4 20.0 5.3 21.0 5.2 22.0 5.0 23.0 4.9 24.0 4.8 25.0 4.7

La ecuación que regirá el cambio es:

2A0

A C*298E

expkdt

dC

−−=

La resolución del problema se realizara siguiendo el esquema:

Los ficheros necesarios serán los siguientes: % Fichero principal. Optimizacion % Definimos un vector inicial, pero teniendo en cuenta que este vector inicial % es solo un conjunto inicial de valores de K0,E y N para probar X0=[10 2000 1]; X=fmins('f_ej2',X0) % Con los valores obtenidos representamos para ver la bondad del ajuste % Introducimos los valores experimentales Tiempo=0:1:24;

Suponemos valores para K0, E y n

Calculamos como varia la concentracion de A de

acuerdo con estos valores

Calculamos un vector diferencia entre los valores

teoricos y los experimentales

Page 19: Tema

19

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 del ejemplo 2. Minimizacion % X(1) Corresponde a la constante K0 % X(2) Corresponde a la constante E % X(3) Corresponde a la constante n % Introducimos los valores experimentales Tiempo=0:1:24; 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);

Page 20: Tema

20

%Calculamos un vector error como diferencia de todos los valores al cuadrado E=sum((CAexp-CAteo).^2) 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; La solución que obtendríamos seria: X = 1.0e+003 * 0.0032 2.1086 0.0023 Y el ajuste se puede observar en la siguiente figura.

Hasta aquí se ha desarrollado una breve explicación de los apartados que se consideran mas importantes y cuyo recuerdo era imprescindible para la resolución de los diferentes problemas que veremos en la asignatura. A partir de ahora realizaremos una serie de problemas que

0 5 10 15 20 254

5

6

7

8

9

10Ejemplo de optimizacion

Tiempo (s)

Ca

(mol

/L)

CAexpCAteo

Page 21: Tema

21

incluyen casi todos los aspectos posibles en la simulación de sistemas que incluyen reacción química.