O arquivo termodinâmico com os dados de Poiling et al. (2001) pode ser baixado clicando aqui, conforme discutido na página anterior.
Considere por exemplo o 'eixo' adotado por Poiling, Prauznitz, O'Connell (2001):
Os dados apresentados por Poiling et al. (2010) compreendem as seguintes informações para o cálculo das reações padrão levando à gás ideal a 298 K e 1 atm:
nº | Símbolo | Nome | CAS | $$ \Delta h_{form}^{\tiny{\ominus}} $$ | $$ \Delta g_{form}^{\tiny{\ominus}} $$ | $$ \Delta h_{b} $$ | $$ \Delta h_{m} $$ | $$ v_{liq} \left(\frac{cm^3}{mol}\right) $$ | $$ T_{liq} (K) $$ | $$ Dipolo (Debye) $$ |
---|---|---|---|---|---|---|---|---|---|---|
1 | Ar | argon | 7440-37-1 | 0.0 | 0.0 | 6.43 | nan | 29.1 | 90.0 | 0.0 |
2 | Br2 | bromine | 7726-95-6 | 30.91 | 3.13 | 58.8 | nan | 51.51 | 298.15 | 0.0 |
3 | BrD | deuterium_bromide | 13536-59-9 | -37.12 | -53.79 | nan | nan | nan | nan | nan |
4 | BrF3 | bromine_trifluoride | 7787-71-5 | -255.64 | -229.51 | 47.57 | nan | 48.84 | 298.15 | 1.1 |
5 | BrF5 | bromine_pentafluoride | 7789-30-2 | -428.86 | -351.65 | 30.6 | nan | 71.02 | 298.15 | 1.5 |
entalpias (h) e energias livres (g) em kJ/(mol * K)
subescritos - $ _{form} $ - de formação gás ideal a 298.15 K e 1 atm $ _b, _m $ - ebulição e fusão, respectivamente
A questão é que, diferente da entalpia e energia livre de Gibbs, as entropias têm uma escala absoluta, e deveriam a princípio serem adotadas a partir de um valor comum à todos os simuladores. Não é o que ocorre, infelizmente. Contudo, aqui, buscaremos usar a escala absoluta da entropia, tomando dados, sobretudo, a partir do site NIST.
Os valores de entalpia padrão para a base de Poiling et al. (2001) estão ilustrados a seguir
Composto | Fase | $$ s^{\tiny{\ominus}} \ \frac{J}{(mol*K)} $$ |
---|---|---|
Ar | {g} | 154.84 |
Cl2 | {g} | 223.08 |
D2 | {g} | 144.96 |
F2 | {g} | 202.8 |
He | {g} | 126.15 |
H2 | {g} | 130.68 |
Kr | {g} | 164.08 |
Ne | {g} | 146.33 |
N2 | {g} | 191.61 |
O2 | {g} | 205.15 |
Rn | {g} | 176.23 |
T2 | {g} | nan |
Xe | {g} | 169.68 |
Al | {s} | 28.27 |
As | {s} | nan |
B | {s} | 5.9 |
C | {s} | 5.833 |
I2 | {s} | 116.14 |
P | {s} | 41.09 |
S | {s} | 32.054 |
Se | {s} | nan |
Si | {s} | 18.82 |
Ti | {s} | 30.72 |
U | {s} | 50.2 |
Br2 | {l} | 152.21 |
Hg | {l} | 76.0 |
Vejamos um exemplo de como o cálculo pode ser feito para o propano gasoso.
Calcule a entropia padrão do propano na fase gás (condições padrão 298.15K e 1 atm). O CAS do propano é igual a 74-98-6.
Solução
Primeiramente vamos extrair da tabela do Prauznitz a entlapia e energia livre de formação.
import pandas as pd
Dd = pd.read_excel(r'DadosPrauznitz.xlsx', sheet_name='VariacoesFase')
DdPropano = Dd[Dd['CAS']=='74-98-6']
DdPropano
nº | Símbolo | Nome | CAS | dHform (kJ/mol/K) | dGform (kJ/mol/K) | dHb (kJ/mol/K) | dHm (kJ/mol/K) | Vliq (cm³/mol) | T liq K | Dipolo (Debye) | |
---|---|---|---|---|---|---|---|---|---|---|---|
90 | 95 | C3H8 | propane | 74-98-6 | -104.68 | -24.29 | 19.04 | 3.53 | 74.87 | 233.15 | 0.0 |
Assim, para cálculo das propriedades de fase para o propano por exemplo, teríamos:
$$ 3 \ C_{(s)} + 4 \ H_{2 \ (g)} \rightarrow C_3H_{8 \ (g)}, \ \Delta h_{form}^{\tiny{\ominus}}, g_{form}^{\tiny{\ominus}} $$O cálculo da entropia do propano, neste caso, pode ser feito como:
$$ \Delta h_{form}^{\tiny{\ominus}} = \Delta g_{form}^{\tiny{\ominus}} + \cdot \Delta s_{form}^{\tiny{\ominus}} \cdot T^{\tiny{\ominus}} $$Logo:
$$ \Delta s_{form}^{\tiny{\ominus}} = \frac{ \Delta h_{form}^{\tiny{\ominus}} - \Delta g_{form}^{\tiny{\ominus}} }{T^{\tiny{\ominus}} } $$Partindo do eixo de referência, $ C_{(s)} $, $H_{2, \ (g)} $, temos:
$$ s_{C3H8 \ (g) }^{\tiny{\ominus}} = 3 \cdot s_{C \ (s) }^{\tiny{\ominus}} + 4 \cdot s_{H2 \ (g) }^{\tiny{\ominus}} + \Delta s_{form}^{\tiny{\ominus}} $$Substituindo valores:
# Entalpia e energia livre de formação (multiplica-se por 1000 para passar para J/(mol*K))
dh_form = DdPropano['dHform (kJ/mol/K)'].values[0]*1000
dg_form = DdPropano['dGform (kJ/mol/K)'].values[0]*1000
T = 298.15
ds_form = (dh_form - dg_form)/T
print('entropia de formação=', ds_form, 'J/(mol*s)')
entropia de formação= -269.62938118396784 J/(mol*s)
Tendo os valores tabelados de entropia para o $ C_{(s)} $ e $ H_{2, (g)} $ como 5.833 e 130.68 J/(mol * K), tem-se:
sC = 5.833
sH2 = 130.68
sProp = (3*sC + 4*sH2) + ds_form
print(sProp)
270.5896188160322
O valor acima resulta me $ 270.58 \frac{ J}{ (mol\cdot K} $. O valor tabelado do site Wikipedia) é de $ 269.91 \frac{ J}{ (mol\cdot K} $, indicando boa concordância dos dados.
Podemos efetuar as contas para todos os compostos tabelados no livro de Poiling et al. (2001). O código a seguir efetua estas operações.
# Função que decompõe um composto químico em seus elementos
def obtemcomposicao(formulas,especies):
ne = len(especies)
comp = []
for formula in formulas:
nf = len(formula)
composicao= [formula]
for esp in especies:
nl = len(esp)
k = 0
while k < nf-nl+1:
if esp == formula[k:k+nl]:
formula = formula[:k]+formula[(k+(nl-1)+1):]
nf = nf - nl
num = ''
if k==nf:
num = float(1)
composicao.append([esp,num])
break
while formula[k].isdigit() and k<nf:
num = num + formula[k]
formula = formula[:k]+formula[(k+1):]
nf = nf - 1
if k==nf:
break
if num =='':
num = 1
num = float(num)
composicao.append([esp,num])
else:
k = k +1
comp.append(composicao)
return comp
# Importação de pacotes
import pandas as pd
import numpy as np
# Leitura de dados
Dd = pd.read_excel(r'DadosPrauznitz.xlsx', sheet_name='VariacoesFase')
# Fórmulas qúimicas
formulas = Dd['Símbolo'].values
# em caso de elementos iniciando com mesma letra, os com uma letra apenas devem vir depois. Ex, Ne, N
especies = ['Ar','Al','As','Br','B','Cl','C','D','F','Kr','He','Hg','H','I','Ne','N','O','P','Rn','Se','Si','S','Ti','T','U','Xe']
especies = sorted(especies)
especies.reverse()
# Obtém a composição elementar de todos os compostos
comp = obtemcomposicao(formulas,especies)
# padrões de gás ideal (GI), sólidos cristalinos (SC) e líquidos saturados (LS)
GI = ['Ar', 'Cl2', 'D2', 'F2', 'He', 'H2', 'Kr', 'Ne', 'N2', 'O2', 'Rn', 'T2', 'Xe']
SC = ['Al', 'As', 'B', 'C', 'I2', 'P', 'S', 'Se', 'Si', 'Ti', 'U' ]
LS = ['Br2', 'Hg']
# reune os padrões
padroes = GI+SC+LS
# obtém a composição dos padrões
formulas_padroes = obtemcomposicao(padroes,especies)
# Dados de entropia NIST
entropiapadrao_GI ={'Ar':154.84,'Cl2':223.08,'D2':144.96,'F2':202.80,'He':126.15,'H2':130.68,
'Kr':164.08,'Ne':146.33,'N2':191.61,'O2':205.15,'Rn':176.23,'T2':None,'Xe':169.68}
entropiapadrao_SC = {'Al':28.27,'As':None,'B':5.90,'C':5.833,'I2':116.14 ,'P':41.09,'S':32.054,
'Se':None,'Si':18.82,'Ti':30.72,'U':50.20}
entropiapadrao_LS = {'Br2':152.21 ,'Hg': 76.0}
# reune os dicionários
d = dict(entropiapadrao_GI)
d.update(entropiapadrao_SC)
d.update(entropiapadrao_LS)
# número de compostos químicos
K = len(formulas)
entropia = []
# percorre os compostos
for k in range(K):
P = len(formulas_padroes)
formula = formulas[k]
coef = []
J = len(comp[k])
s = (Dd['dHform (kJ/mol/K)'][k]-Dd['dGform (kJ/mol/K)'][k])/298.15*1000
for j in range(J-1):
for p in range(P):
if comp[k][j+1][0]==formulas_padroes[p][1][0]:
especie = formulas_padroes[p][1][0]
aux = comp[k][j+1][1]/formulas_padroes[p][1][1]
coef.append(str(aux)+formulas_padroes[p][0])
nome = formulas_padroes[p][0]
valor = d.get(nome)
if valor!=None and s!=None:
s = s + aux*valor
else:
s = None
break
entropia.append([comp[k][0],s])
pd.DataFrame(entropia,columns=['Composto','Entropia(J/(mol*K))'])
Composto | Entropia(J/(mol*K)) | |
---|---|---|
0 | Ar | 154.840000 |
1 | Br2 | 245.384577 |
2 | BrD | 204.496454 |
3 | BrF3 | 292.664551 |
4 | BrF5 | 324.141391 |
... | ... | ... |
453 | Rn | 176.230000 |
454 | S | 167.824585 |
455 | Se | NaN |
456 | T2 | NaN |
457 | Xe | 169.680000 |
458 rows × 2 columns
O código a seguir acrescenta à tabela de dados a coluna entropia, e gera o arquivo em Excel, com o nome DadosComEntropia.xlsx
.
# captura os valores de entropia
x = [e[1] for e in entropia]
# se o sistema contém ainda apenas 11 colunas
# (a entropia não foi acrescentada), acrescenta
# a entropia aos dodos e gera um arquivo de Excel)
if len(Dd.columns) == 11:
Dd.insert(11, "EntropiaPadrao (J/mol*K)", x, True)
Dd.to_excel('DadosComEntropia.xlsx', index=False)
O arquivo com os dados de entropia padrão pode ser baixado clicando aqui.