Hallemos las constantes de Antoine para el Benceno

Constantes de Antoine para el Benceno

Los datos de presión de vapor del Benceno a diferentes temperaturas estan dadas en la siguiente tabla. Determine las correspondientes constantes de Antoine.

Temperatura(°C)Presioˊn(mmHg)Temperatura(°C)Presioˊn(mmHg)56.67381.1451.11502.6745.56651.6140.0837.7834.441049.8128.891313.5623.331623.8517.781975.5112.222378.896.672870.181.113428.704.444033.7610.004747.4315.565537.6721.116412.6526.677384.8932.228481.2537.789670.6943.3311015.2848.8912411.58\begin{array}{c|c|c|c} Temperatura(°C) & Presión(mmHg) & Temperatura(°C) & Presión(mmHg)\\ \hline -56.67 & 381.14 & -51.11 & 502.67\\ -45.56 & 651.61& -40.0 & 837.78\\ -34.44 & 1049.81& -28.89 & 1313.56\\ -23.33 & 1623.85& -17.78 & 1975.51\\ -12.22 & 2378.89& -6.67 & 2870.18 \\ -1.11 & 3428.70 & 4.44 & 4033.76 \\ 10.00 & 4747.43 & 15.56 & 5537.67 \\ 21.11 & 6412.65 & 26.67 & 7384.89 \\ 32.22 & 8481.25 & 37.78 & 9670.69 \\ 43.33 & 11015.28 & 48.89 & 12411.58 \\ \end{array}

Fuente: cheegineering

La Ecuación de Antoine tiene la forma:

log10P=ABT+C\log_{10} P = A-\frac{B}{T+C}

Reordenando la ecuación para realizar una regresión multilineal.

Tlog10P+Clog10P=AT+ACBT \cdot \log_{10}P +C\cdot \log_{10}P =A\cdot T+A\cdot C-B

log10P=A+ACBTClog10PT\log_{10}P=A+\frac{A\cdot C-B}{T}-\frac{C\cdot \log_{10}P}{T}

Usando constantes y variables auxiliares.

constantes auxiliares   b0=A\space \space b_0=A ;   b1=ACB\space \space b_1=A\cdot C-B ;   b2=C\space \space b_2=-C

y las variables auxiliares   y=log10P\space \space y=\log_{10}P;   x1=1T\space \space x_1=\frac{1}{T};   x2=log10PT\space \space x_2=\frac{\log_{10}P}{T}.

Llegamos a esta ecuación que es una ecuación que usaremos para realizar la refresión multilineal.

y=b0+b1x1+b2x2y=b_0+b_1 x_1+b_2 x_2

Algo de teoría para regresiones multilineales

Se puede demostrar que las constantes de cualquier regresión multilineal por mínimos cuadrados pueden hallarse a partir de la siguiente relación matricial:

[NX1X2Xk]×[NTX1TX2TXkT]×[b0b1b2bk]=[NX1X2Xk]×[YT]     (A)\begin{bmatrix} N \\ X_1 \\ X_2\\ \vdots \\ X_k \end{bmatrix} \times \begin{bmatrix} N^T & X_1^T & X_2^T & \cdots & X_k^T \end{bmatrix} \times \begin{bmatrix} b_0 \\ b_1 \\ b_2 \\ \vdots \\ b_k \end{bmatrix} = \begin{bmatrix} N \\ X_1 \\ X_2\\ \vdots \\ X_k \end{bmatrix} \times \begin{bmatrix} Y^T \end{bmatrix}\space\space\space\space\space (A)

Donde: kk: número de variables;   n\space\space n: número de datos que se tiene de cada variable.

La simbología para la transpueta de XX es XTX^T Nótese que la XX es un vector fila y XTX^T es un vector columna, y así para las demás variables

Los vectores anteriormente mencionados se componen de los datos experimentales que se tiene para realizar la regresión, que tenemos a excepción de NN.

N=(1,1,...,1)nunos N = \overbrace {(1, 1, ... , 1)}^ {n \hspace{1em}unos} \

X1=(x11,x12,...,x1n)X_1=(x_{11}, x_{12}, ... , x_{1n})

X2=(x21,x22,...,x2n)X_2=(x_{21}, x_{22}, ... , x_{2n})

......

Xk=(xk1,xk2,...,xkn)X_k=(x_{k1}, x_{k2}, ... , x_{kn})

Y=(y1,y2,...,yn)Y=(y_1, y_2, ... , y_n)

Simplificando la ecuación (A)(A):

[NTX1TX2TXkT]×[b0b1b2bk]=[YT]\begin{bmatrix} N^T & X_1^T & X_2^T & \cdots & X_k^T \end{bmatrix}\times \begin{bmatrix} b_0 \\ b_1 \\ b_2 \\ \vdots \\ b_k \end{bmatrix}= \begin{bmatrix} Y^T \end{bmatrix}

[b0b1b2bk]=[NTX1TX2TXkT]1[YT]     (B) \begin{bmatrix} b_0 \\ b_1 \\ b_2 \\ \vdots \\ b_k \end{bmatrix} = \begin{bmatrix} N^T & X_1^T & X_2^T & \cdots & X_k^T \end{bmatrix}^{-1} \begin{bmatrix} Y^T \end{bmatrix} \space\space\space\space\space(B)

La expresión (B)(B) es mucho más manejable y programable en python.

Para determinar el grado de correlación podemos usar la siguiente fórmula conocida como el coeficiente de determinación que es muy usado para verifcar el grado de ajuste en regresiones multilineales.

R2=i=1n(y^iyˉ)i=1n(yiyˉ)R^2 =\frac{\displaystyle\sum_{i=1}^{n}(\hat{y}_i-\bar{y})}{\displaystyle\sum_{i=1}^{n}(y_i - \bar{y})}

Siendo:

y=log10Py =\log_{10}P
yiy_i: corresponde a logaritmo de cada una de las presiones en nuestros datos
yˉ\bar{y}: promedio de los logaritmos de las presiones de los datos
y^i\hat{y}_i: es el valor que obtenemos al aplicar nuestra fórmula de regresión con los valores x1ix_{1i} y x2ix_{2i}

Programando la solución con python

Codificando con python tenemos:
Para replicar el ejercicio en python puede descargar el archivo de datos del benceno aquí recuerde guardarlo con ‘datos_antoine.csv’ que es el mismo que usamos en el código.

import numpy as np
import csv
import matplotlib.pyplot as plt

P, T = [], []

with open("datos_antoine.csv", "r") as f:
reader = csv.DictReader(f)

for line in reader:
P.append(float(line["P"].replace(",", ".")))
T.append(float(line["T"].replace(",", ".")))

presion = np.array(P)
temp = np.array(T)

y = np.log10(presion)
x1 = 1 / temp
x2 = y * x1

n = len(T)
N = np.ones(n)
M = np.array([N, x1, x2])
b = np.linalg.pinv(M.T) @ y

A = b[0]
C = -b[2]
B = A * C - b[1]

# Resultado 6.867533528904103 832.260320713445 250.84525032625817
print(A, B, C)

data_temp = np.linspace(-60, 80, 100)
data_pres = 10**(A - B / (data_temp + C))

font = {'family': 'serif',
'color': 'xkcd:dark red',
'weight': 'normal',
'size': 12,
}

plt.plot(data_temp, data_pres, "-", label="Regresion",
color='xkcd:dark gray', alpha=0.7, zorder=2)
plt.gca().spines['top'].set_visible(False)
plt.gca().spines['right'].set_visible(False)

plt.scatter(T, P, marker="x", color='red', label="Datos experimentales")
plt.xlabel("Temperatura (°C)", labelpad=10, fontdict=font)
plt.ylabel("Presión (mmHg)", labelpad=10, fontdict=font)
plt.yticks(rotation=45)
plt.title("Curva de presión vs temperatura \npara el Benceno",
fontdict=font, pad=20)
plt.legend(loc=2, fontsize=10)
plt.show()

Las constante de para el benceno son A = 6.8675, B = 832.2603 °C y C = 250.8452 °C

La gráfica correspondiente es:

Gráfica resultante