При тепловых расчётах котла-утилизатора необходимо знать значения энтальпии выхлопных газов (продуктов сгорания топлива в ГТУ) при различных значениях температуры.
В данной статье рассматриваются два термодинамических параметра газов: энтальпия $h,\ Дж/кг$, и энтропия $s,\ Дж/(кг\cdot К)$ для условий идеального газа, т.к. газовая смесь при атмосферном давлении обладает свойствами идеального газа.
Вещество | Обозначение | Доля по массе | Доля по объёму |
---|---|---|---|
Азот | N2 | 75,51% | 78,09% |
Кислород | O2 | 23,15% | 20,95% |
Аргон | Ar | 1,29% | 0,93% |
Углекислый газ | CO2 | 0,05% | 0,03% |
воздух_сух_мас = {'N2': 0.75512, 'O2': 0.2315, 'Ar': 0.01292, 'CO2': 0.00046, 'H2O': 0.}
$$c_p = R\left(\frac{f}{2} + 1 \right)$$ где $h$ - энтальпия, Дж/кг; $s$ - энтропия, Дж/кг/К; $c_p$ - удельная теплоёмкость при постоянном давлении, Дж/кг/К; $T_0$ = 273,15 K; $p_0$ = 101325 Па; $R = R_{\mu} / \mu$ - газовая постоянная вещества, Дж/кг/К; $R_{\mu}$ = 8,314 462 618 153 24 - универсальная газовая постоянная, Дж/моль/К; $\mu$ - молярная масса вещества, г/моль; $f$ - число степеней свободы у молекулы вещества (3 у одноатомной молекулы, 5 - у двухатомной, 6 у трёхатомной и многоатомной).
Как видно из приведённых вые формул при $p = p_0$ энтальпия и энтропия идеального газа пропорциональны удельной теплоёмкости $c_p$. Таким образом, отношения значений как энтальпии так и энтропии двух смесей газов равны отношениям значений их теплоёмкостей при постоянном давлении.
T_0 = 273.15; p_0 = 101325; R = 8.31446261815324
# Молярные массы компонентов воздуха, г/моль
H = 1; C = 12; N = 14; O = 16; Ar = 40
молярные_массы = {'N2': N*2, 'O2': O*2, 'Ar': Ar, 'CO2': C+O*2, 'H2O': H*2+O}
компоненты = list(воздух_сух_мас.keys())
# Газовые постоянные компонентов воздуха, Дж/кг/К
Rs = {key: R / молярные_массы[key] * 1e3 for key in компоненты}
Rs
{'N2': 296.9450935054728, 'O2': 259.82695681728876, 'Ar': 207.861565453831, 'CO2': 188.9650595034827, 'H2O': 461.9145898974022}
fs = {'N2': 5, 'O2': 5, 'Ar': 3, 'CO2': 6, 'H2O': 6}
# Удельные теплоёмкости
cps = {key: Rs[key] * (fs[key]/2 + 1) for key in компоненты}
cps
{'N2': 1039.3078272691548, 'O2': 909.3943488605107, 'Ar': 519.6539136345775, 'CO2': 755.8602380139308, 'H2O': 1847.6583595896088}
from math import log # натуральный логорифм
def fh (компонент, T, p = None):
"""
компонент: однокомпонентный газ
return: энтальпия однокомпонентного газа, Дж/кг
"""
return cps[компонент] * T
def fs (компонент, T, p = p_0):
"""
компонент: однокомпонентный газ
return: энтропия однокомпонентного газа, Дж/кг/К
"""
return cps[компонент] * log(T/T_0) + Rs[компонент] * log(p/p_0)
"""
смесь: словарь вида {'компонент': массовая доля, ...}
T: температура смеси, К
p: давление смеси, Па
"""
def fcp_смесь(смесь):
"""
return: теплоёмкость смеси, Дж/кг/К
"""
res = 0.
for компонент in смесь:
res += смесь[компонент] * cps[компонент]
return res
def fh_смесь(смесь, T):
"""
return: этальпия смеси, Дж/кг
"""
return __ff(смесь, 'h', T)
def fs_смесь(смесь, T, p = p_0):
"""
return: энтропия смеси, Дж/кг/К
"""
return __ff(смесь, 's', T, p)
def __ff(смесь, парам, T, p = p_0):
"""
return: этальпия смеси, Дж/кг при парам = 'h', в противном случае - энтропия смеси, Дж/кг/К
"""
if парам == 'h': f = fh
else: f = fs
res = 0.
for компонент in смесь:
res += смесь[компонент] * f(компонент, T, p)
return res
Из [1] возьмём состав выхлопных газов при различных значениях коэффициента избытка воздуха
выхл_газы_мас= \
{'1': {'N2': 0.7094755746502647,
'H2O': 0.12781962940205416,
'CO2': 0.15056576582732759,
'Ar': 0.012139030120353618,
'O2': 0.0},
'2': {'N2': 0.7293448763973329,
'H2O': 0.06876374532588475,
'CO2': 0.07761337577910656,
'Ar': 0.0124789911577677,
'O2': 0.11179901133990798},
'3': {'N2': 0.7362176194747642,
'H2O': 0.04833645886998503,
'CO2': 0.052379321756048064,
'Ar': 0.012596582852545236,
'O2': 0.15047001704665744},
'4': {'N2': 0.7397027932355494,
'H2O': 0.03797776482918392,
'CO2': 0.03958311186305883,
'Ar': 0.012656213699283958,
'O2': 0.1700801163729239},
'5': {'N2': 0.7418097811012561,
'H2O': 0.03171533886520038,
'CO2': 0.031847067458349136,
'Ar': 0.012692263973710446,
'O2': 0.18193554860148406},
'Воздух RH=60%': {'N2': 0.7503591478682237,
'O2': 0.2300404475202535,
'Ar': 0.012838542470676784,
'CO2': 0.0004570998093275015,
'H2O': 0.006304762331518536}}
# Добавим сухой воздух
выхл_газы_мас.update({'Сухой воздух': воздух_сух_мас})
# Определяем теплоёмкость смесей
cps_смесь = [fcp_смесь(выхл_газы_мас[key]) for key in выхл_газы_мас]
cps_смесь
[1093.645294879416, 1051.8847581099742, 1037.4398901601307, 1030.1148855455808, 1025.68649921582, 1007.7177678647006, 1002.3885425623376]
import pandas as pd # для создания таблиц
df = pd.DataFrame({'К-нт избытка воздуха': (list(выхл_газы_мас.keys())),
'Теплоёмкость смеси, Дж/кг/К': list(map(lambda x: round(x,1), cps_смесь))})
formatters={'Теплоёмкость смеси, Дж/кг/К': '{:4.1f}'.format}
output = df.to_html(index=False, decimal=',', formatters = formatters)
from IPython.core.display import HTML
display(HTML(output))
К-нт избытка воздуха | Теплоёмкость смеси, Дж/кг/К |
---|---|
1 | 1093.6 |
2 | 1051.9 |
3 | 1037.4 |
4 | 1030.1 |
5 | 1025.7 |
Воздух RH=60% | 1007.7 |
Сухой воздух | 1002.4 |
# Отклонение значений энтальпии и энтропии выхлопных газов от
# значений сухого воздуха при различных значениях коэффициента избытка воздуха
errs = [(cp/cps_смесь[-1]-1)*100. for cp in cps_смесь[:-1]]
import numpy as np # для работы с массивами
n = len(errs)
ind = np.arange(n)
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize = (9, 5))
ax.bar(ind, errs)
ax.set_xticks(ind)
lbls = list(выхл_газы_мас.keys())[:-1]
ax.set_xticklabels(lbls);
ax.set_xlabel('Коэффициент избытка воздуха'); ax.set_ylabel('Отклонение, %')
ax.set_title('Отклонение значений энтальпии и энтропии выхлопных газов от \n'
'значений сухого воздуха при различных значениях коэффициента избытка воздуха')
ax.yaxis.grid(True, color = 'grey')
# Параметры воздуха из справочника [2]
from scipy.interpolate import interp1d #интерполяция/экстраполяция
Ts_справ = np.linspace(250, 900, 14)
ts_справ = Ts_справ - 273.15
hs_справ = np.array([250., 300.3, 350.7, 401.2, 452.1, 503.4, 555.2, 607.5,
660.3, 713.8, 767.9, 822.5, 877.7, 933.5])
ss_справ = np.array([6.688, 6.871, 7.026, 7.161, 7.282, 7.389, 7.488,
7.579, 7.664, 7.743, 7.817, 7.888, 7.955, 8.019])
f_s = interp1d(Ts_справ, ss_справ, kind='cubic')
ss_справ -= f_s(273.15) # при t = 0 s = 0
вел_справ = [hs_справ, ss_справ]
ts = np.linspace(0,600,21)
Ts = ts + 273.15
ffs = [fh_смесь, fs_смесь]
titles = ['Энтальпия','Энтропия']
y_labels = ["$h,\,кДж/кг$", "$s,\,кДж/кг\cdot К$"]
fig, axes = plt.subplots(1, 2, figsize = (16, 5))
fig.suptitle ("Зависимость параметров выхлопных газов от температуры при различных значениях " +
"коэффициента избытка воздуха", fontsize=14)
axes[1].set_ylim(0, 1.3)
for i, ax in enumerate(axes):
ax.grid(); ax.set_xlim(ts[0],ts[-1])
ax.set_xlabel('$t,\, \degree C$')
ax.set_ylabel(y_labels[i])
ax.set_title(titles[i])
for j, смесь in enumerate(выхл_газы_мас.keys()):
results = list(map(lambda T: ffs[i](выхл_газы_мас[смесь], T)/1000, Ts))
ax.plot(ts, results, label=смесь)
ax.plot(ts_справ, вел_справ[i], 'o', label = 'Воздух из [2]')
ax.legend()
Инженерные расчёты на Python, С.В. Медведев, 2020-2021
Использование Python и Jupyter Notebook для инженерных расчётов, С.В. Медведев, 2020-2021