Unidad 2.0
Unidad 2.0
Unidad 2.0
Laboratorios de
Termodinámica
Química II
LABORATORIO 0: INTRODUCCIÓN A USO DE
SOFTWARE EN TERMODINÁMICA QUÍMICA
Introducción
En termodinámica química el cálculo es una tarea que se lleva a cabo permanentemente, por lo que cualquier
herramienta que nos facilite la tarea que necesitamos llevar a cabo será de gran utilidad de manera que se
reduzca el tiempo en la realización de cálculo o manejo de datos, con el fin de tener más tiempo disponible
para otras tareas que lo requieran, por supuesto que se debe hacer una inversión inicial de tiempo para poder
llevar esto a cabo. Entonces el objetivo de utilizar software en termodinámica es con el fin de facilitarnos las
tareas para el momento en que tengamos que hacer manejo de datos, presentación de resultados,
visualización de datos o tendencias, etc.
La herramienta que se utilizará para tal fin es scilab. Scilab es un software para análisis numérico, con un
lenguaje de programación de alto nivel para cálculo científico. Es desarrollado por Scilab Enterprises, bajo la
licencia CeCILL, compatible con la General Public License (GNU); es decir es un software libre.
Las características de Scilab incluyen análisis numérico, visualización 2-D y 3-D, optimización, análisis
estadístico, diseño y análisis de sistemas dinámicos, procesamiento de señales, Java, C y C++. Mientras que
la herramienta Xcos permite una interfaz gráfica para el diseño de modelos.
Objetivo
A continuación, se trabajarán las nociones básicas del uso de scilab para el cálculo, manipulación y
representación datos. Entre las capacidades que se esperan desarrollar en esta sesión de práctica son las
siguientes:
Funciones
Matrices
Solución de ecuaciones
Tablas de datos
Gráficos
Elementos de programación
Práctica
Para el desarrollo efectivo de esta sesión de práctica es preciso la revisión previa de los contenidos de los
archivos 1_conceptos_basicos.sce, 2_creacion_programas.sce, 3_manejo_funciones.sce.
A. Funciones
En programación, una función es una sección de un programa que calcula un valor de manera independiente
al resto del programa.
Los parámetros, que son los valores que recibe la función como entrada;
El código de la función, que son las operaciones que hace la función;
El resultado (o valor de retorno), que es el valor final que entrega la función.
Ejemplo 1
Estos comandos en rojo enmarcan el inicio y el final de la función, todas las operaciones matemáticas
requeridas se deben definir dentro del marco de estos comandos.
[psat]=Psat(A,B,C,T)
[psat] Indica la variable de salida, es decir, la variable donde se almacenará el valor que se espera obtener
de las operaciones realizadas por la función, si así se requiere, se pueden utilizar tantas variables de salida
como valores o cálculos intermedios se necesiten visualizar.
Psat() Es el nombre de la función, es importante recordar que scilab puede hacer distinción entre minúsculas
y mayúsculas.
(A,B,C,T) Son los argumentos de entrada. Estos argumentos son los valores o datos que se requieren
ingresar a fin de desarrollar las operaciones necesarias. Para este ejemplo en cuestión estos parámetros
representan las constantes de Antoine (A, B, C) para sustancia en específico y la temperatura (T) a la cual
se quiere evaluar la presión de saturación.
lnPsat=A-(B/(T-273.15+C))
psat=(exp(lnPsat)/100.0)
Las líneas anteriores contienen la variable lnPsat en la cual se almacena el resultado de la operación definida
que sigue al signo igual, esta es una variable interna pues no se muestra en el resultado final.
La variable psat es la misma variable de salida. En este apartado del código se define su valor en función de
las operaciones que suceden al signo igual (=), y por lo tanto almacena el valor que se espera como resultado.
Otra forma de definir funciones es a través de la definición de funciones de línea. Continuando con el ejemplo
1, este también se puede escribir como aparece a continuación.
deff('[P]=f(A,B,C,T)',' P=[exp(A-(B/(T-273.15+C)))/100]')
La fila de código anterior tiene la función P que es función de A,B,C y T. La función deff( ) se puede usar para
definir funciones de secuencias de instrucciones escritas en cadenas de texto, como funciones numéricas,
su secuencia es deff(' [variables de salida] =f(parámetros) ','variable salida=función').
B. Matrices
A continuación, se presentan los elementos básicos de trabajo con matrices en scilab. El manejo de las
matrices es importante pues son formas de manipular grandes cantidades de datos.
Ejemplo 2
En este ejemplo se muestra como se almacenan una serie de valores en forma matricial en la variable a. La
matriz en scilab se define como los valores dentro de los corchetes [ ]. Scilab identifica como elemento de
una fila matriz a cada valor separado por un espacio sencillo. El símbolo punto y coma (;) le indica a scilab
el inicio de una nueva fila de valores. Es importante recordar que para definir una matriz de m filas todas ellas
deben de contener la misma cantidad de elementos o columnas n.
En scilab también es posible crear matrices automáticas con elementos igualmente espaciados. En la imagen
siguiente se puede observar cómo se crea una matriz de 1x1 conteniendo un rango igualmente espaciado de
temperaturas y otra matriz de 3x10 automáticamente.
Para el caso cada fila generada tiene la siguiente sintaxis [i:di:n] en la cual cada termino se interpreta de la
siguiente forma: i indica el primer elemento de la fila, en el ejemplo el primer elemento es 1. di indica el
espaciamiento entre cada elemento de la fila para el caso mostrado la diferencia entre cada elemento es 1.
n es el valor máximo que puede tomar el último elemento de la fila, es importante tomar en cuenta que el
último elemento de la matriz puede ser igual o no a este, en función del valor de di.
Cuando se utiliza este comando, la cantidad de columnas que se generan automáticamente serán función de
de di y n. Cada fila puede definirse de manera independiente con sus propios valores [i:di:n], no obstante se
debe asegurar que en cada fila se generen la misma cantidad de elementos o columnas.
En el manejo de datos en frecuentemente necesario conocer las dimensiones de las matrices con las que se
trabajan, en la figura siguiente se muestran los comados que se utilizan para tal fin:
La sintaxis mostrada en la figura muestra el uso del comando size(), este comando se utiliza cuando lo que
se requiere es conocer las dimensiones de una matriz. Dichos valores se pueden almacenar en diferentes
variables tal como se muestra. En ejemplo de la matriz T, la cual es unidimensional se puede observar que
la cantidad de columnas que conforman el vector se almacena en el primer elemento (m) de la matriz que se
utiliza como variable de almacenamiento [m n] y el segundo término n es la variable en la cual se almacena
el valor correspondiente a la cantidad de filas que conforma la matriz.
Otro comando que brinda otra propiedad de dimensión o tamaño de una matriz es el comando length(). Este
comando se utiliza cuando lo que interesa conocer es la cantidad total de elementos que se almacenan en
una determinada matriz. Básicamente brinda el producto m x n.
En la figura anterior se muestra el ejemplo aplicado a la matriz a definida al principio de esta sección. La
matriz a tiene un “tamaño” de 2x3, y que por ende tiene una “longitud” de 6 elementos.
C. Solución de ecuaciones.
Ecuaciones Lineales
Este apartado estará basado solamente para darle solución a todas las ecuaciones de tipo lineal ya sea de
dos o tres sistemas de ecuaciones. Supongamos que se tiene dos sistemas de ecuaciones linealmente
independientes de la siguiente manera:
5𝑥 + 3𝑦 − 6 = 0
−10𝑥 + 2𝑦 − 3 = 0
En este ejemplo se utilizará el apartado B debido a que se necesita transformar la ecuación en forma matricial
de la siguiente manera: [M N; O P] donde “M” y “N” representan los coeficientes de la primer ecuación que
acompaña la variable; “O” y “P” representan los coeficientes de la segunda ecuación.
Cabe destacar que la matriz puede agrandarse a medida se tenga “n” variables en una sola ecuación siempre
y cuando el orden de los exponentes de la variable sea uno.
Introducimos los datos en el editor del programa tal como aparece en la figura:
Se observa que se ha creado dos matrices, en el primer caso, la matriz tiene los valores correspondiente a
las variables de cada ecuación, en el segundo caso se incluye los valores que no están acompañado de
alguna variable; el (;) en una matriz indica el fin de una ecuación dando espacio para el siguiente conjunto de
datos correspondiente a la segunda ecuación.
Para solucionar la matriz se utiliza el comando linsolve(M, N); se debe de tener en cuenta que el argumento
de la función debe nombrarse exactamente como se nombró la matriz, es decir si se utiliza cualquier variable
mayúscula y dentro del argumento de la función digitan una variable minúscula, el programa les informará de
un error de variable.
En la imagen anterior se muestran dos resultados el primer resultado corresponde a la variable X y el último
dato corresponde a la variable Y.
Linsolve[A, B]: variable de salida que se utiliza para solucionar ecuaciones lineales cuyas funciones sean
matriciales.
Una función interna para encontrar raíces de polinomios de grado n es hacer uso de la función interna
poly([an,…,a2,a1],'variable','coeff').
Ejemplo 3
Programación de la ecuación de estado cúbica genérica de RK para el cálculo del volumen de un vapor
sobrecalentado.
eq=poly([a1,a2,a3,a4],'V','coeff')
r=roots(eq);
V=real(r(1));
eq: Variable donde se almacena la ecuación polinómica a partir de la función interna poly, r: Vector que
captura las raíces presentes en el polinomio a través de la función interna roots , V: Variable que captura la
raíz de interés.
Ecuaciones no lineales
En ocasiones las ecuaciones a resolver no son ecuaciones lineales y para ello recurrimos al uso de otras
funciones internas como fsolve() cuya sintaxis es la siguiente.
x: La respuesta final.
Ejemplo 4
Programación de la correlación del DIPPR para encontrar Temperatura de saturación conocida la Presión de
vapor.
D. Tablas de datos.
Para imprimir tablas de datos podemos hacer uso de diferentes funciones internas una forma sencilla de
hacerlo es a través de llenado de matrices con la función for.
Ejemplo 5
Tabla con las columnas X, Y, Z donde Z e Y son funciones de X almacenadas en la matriz T [X,Y,Z],
E. Gráficos.
Los gráficos pueden construirse ya sea a partir de datos guardados en matrices o a través de ecuaciones.
Ejemplo 6
Si queremos graficar la tabla de datos que generamos en el ejemplo 5 solo debemos agregar un ploteador
plot(x, y) de puntos a nuestro código.
Dado que plot(x,y,”color”) debemos llamar a las columnas de nuestra matriz o tabla de datos. En donde X
es la variable independiente almacenada en la columna 1 de la matriz T[ ], podemos ver el comportamiento
de diferentes variables que son funciones de la misma por lo que podemos graficarlas en un mismo eje de
ordenadas. xlabel(“Nombre del eje”).
Ejemplo 7
En el caso que sean ecuaciones explicitas de la variable independiente, podemos definir un rango para las
abscisas, y definir la o las ecuaciones de una vez en el plot(x, [y1, y2, … , yn]) de puntos para las ordenadas.
else
end
Ejemplo 8
Esta función se usa principalmente en la validación de datos, para el caso si la variable v_error es menor a
0.005 hace una impresión en pantalla que dice verdadero, en esta porción podría implementarse una línea
de código que realice una función a partir de los datos validados.
Por consiguiente si la variable que se está validando no cumple dicha condición se ejecuta la impresión en
pantalla falso.
Estructura while
end
Ejemplo 9
El uso de esta forma estructurada radica en la solución de problemas cuya solución no es directa es decir
que debe realizarse a través de procesos iterativos; Un ejemplo práctico es el caso del uso del método de
Newthon Rhapson.
Estructura do while
end
Ejemplo 10
De manera semejante a la estructura while opera la estructura do while solo que en envés de validar la
variable hasta un valor de referencia y encontrar una solución el do while realiza repetidas veces la misma
operación hasta el valor límite de ejecución.
Estructura case
Ejemplo 11
El uso de esta estructura nos facilita la ejecucción de una acción cuando existen varias entre las que se deben
permitir hacer pero solo se debe ejecutar una en particular, es decir debemos hacer varias validaciones entre
las opciones que se tienen para lo cual en ves de usar muchas estructuras if en cascada mejor lo hacemos
a través de una sola estructura case.