В статье приведён пример использования класса Region4 для расчёта теплофизических свойств влажного пара (область 4 на рисунке ниже). Region4 использует ранее созданные классы SaturanionCurve [2], Region1 [3] и Region2 [4] (скачать архив классов).
Источник: [1]
from region4 import Region4
# Создаём объект Область 4
r4 = Region4()
# Допустимый диапазон значений температур, К
r4.T_min, r4.T_max
(273.15, 623.15)
# Допустимый диапазон значений давлений, Па
r4.p_min, r4.p_max
(611.212677, 16529164.252604477)
# Объект Область 4 содержит объекты Областей 1, 2 и объект линии насыщения
sc = r4.sc # линия насыщения
r1 = r4.region1 # объект Область 1 (вода)
r2 = r4.region2 # объект Область 2 (перегретый пар)
# Методы класса Region4
help(r4)
Help on Region4 in module region4 object: class Region4(paramsin.ParamsIn) | Класс содержит методы для расчёта теплофизических свойств влажного пара (область 4) | | Method resolution order: | Region4 | paramsin.ParamsIn | builtins.object | | Methods defined here: | | Tp_in(self, T, p) | T и p являются взаимозависимыми параметрами для Области 4. | Реализован с целью совместимости интерфейса с интерфейсом Области 1, 2 | return: False | | __init__(self) | Инициализация параметров | | dh_p(self, p) | Расчёт скрытой теплоты парообразования (h'' - h') | p: давление, Па | return: скрытая теплота парообразования, Дж/кг | | ds_p(self, p) | Расчёт значения s'' - s' | p: давление, Па | return: значение s'' - s', Дж/кг/К | | props_p(self, p) | Расчёт теплофизических свойств кипящей воды и сухого насыщенного пара при давлении p | p: давление, Па | return: кортеж двух словарей: 0 - кипящая вода, 1 - сухой насыщенный пар | | props_ph(self, p, h) | Расчёт теплофизических свойств влажного пара по давлению и энтальпии | p: давление, Па | h: энтальпия, Дж/кг | return: словарь с вычисленными значениями теплофизических свойств | | props_ps(self, p, s) | Расчёт теплофизических свойств влажного пара по давлению и энтропии | p: давление, Па | s: энтропия, Дж/кг/К | return: словарь с вычисленными значениями теплофизических свойств | | props_px(self, p, x) | Расчёт теплофизических свойств влажного пара по давлению и степени сухости | p: давление, Па | x: степень сухости влажного пара x=[0; 1] | return: словарь с вычисленными значениями теплофизических свойств | | px_in(self, p, x) | Проверка нахождения пары параметров p, x в пределах области | p: давление, Па | x: степень сухости x = [0; 1] | return: True если точка находится внутри области, False в противном случае | | tp_in(self, t, p) | t и p являются взаимозависимыми параметрами для Области 4. | Реализован с целью совместимости интерфейса с интерфейсом Области 1, 2 | return: False | | x_in(self, x) | Проверка корректности значения степени сухости | x: степень сухости x = [0; 1] | return: True если значение корректное, False в противном случае | | ---------------------------------------------------------------------- | Methods inherited from paramsin.ParamsIn: | | T_in(self, T) | Проверка нахождения значения температуры внутри допустимого диапазона | T: температура, К | return: True если температура находится внутри допустимого диапазона, False в противном сучае | | p_in(self, p) | Проверка нахождения значения давления внутри допустимого диапазона | p: давление, Па | return: True если давление находится внутри допустимого диапазона, False в противном сучае | | ph_in(self, p, h) | Проверка нахождения пары параметров [p, h] в пределах области | p: давление, Па | h: энтальпия, Дж/кг | return: True если точка находится внутри области, False в противном сучае | | ps_in(self, p, s) | Проверка нахождения пары параметров [p, s] в пределах области | p: давление, Па | s: энтропия, Дж/кг/К | return: True если точка находится внутри области, False в противном сучае | | t_in(self, t) | Проверка нахождения значения температуры внутри допустимого диапазона | t: температура, C | return: True если температура находится внутри допустимого диапазона, False в противном сучае | | ---------------------------------------------------------------------- | Data descriptors inherited from paramsin.ParamsIn: | | __dict__ | dictionary for instance variables (if defined) | | __weakref__ | list of weak references to the object (if defined) | | ---------------------------------------------------------------------- | Data and other attributes inherited from paramsin.ParamsIn: | | sc = <saturationcurve.SaturationCurve object>
Воспользуемся классом Region4
для создания таблицы значений температуры насыщения водяного пара и скрытой теплоты парообразования при различных значениях абсолютного давления.
import numpy as np
ps = np.linspace(2,25,231) # p = [2; 25] кПа с шагом 0,1 кПа
rs = np.zeros_like(ps) # массив значений скрытой теплоты парообразования, кДж/кг
ts = np.zeros_like(ps) # массив значений температуры насыщения, С
for i, p in enumerate(ps):
p *= 1e3 # перевод в Па
ts[i] = r4.sc.t_p(p)
rs[i] = r4.dh_p(p)
#Округляем полученные значения до одного знака после запятой
rs = np.around(rs/1e3, 1) # перевод из Па в кПа
ts = np.around(ts, 1)
import pandas as pd
table = pd.DataFrame({'p, кПа': ps, 't, C': ts, 'r, кДж/кг': rs})
table
p, кПа | t, C | r, кДж/кг | |
---|---|---|---|
0 | 2.0 | 17.5 | 2459.5 |
1 | 2.1 | 18.3 | 2457.6 |
2 | 2.2 | 19.0 | 2455.9 |
3 | 2.3 | 19.7 | 2454.2 |
4 | 2.4 | 20.4 | 2452.6 |
... | ... | ... | ... |
226 | 24.6 | 64.6 | 2346.4 |
227 | 24.7 | 64.7 | 2346.2 |
228 | 24.8 | 64.8 | 2346.0 |
229 | 24.9 | 64.9 | 2345.7 |
230 | 25.0 | 65.0 | 2345.5 |
231 rows × 3 columns
#Сохраняем таблицу в файл в фомате html
#table.to_html('latent_heat.html', index=False)
#Таблицу см в [5]
Уделная теплота (Дж/кг), выделяемая при конденсации сухого насыщенного пара, равна $q = dh = ds\cdot T$, где $dh = h'' - h'$; $ds = s'' - s'$; $h',\ s'$ - энтальпия (Дж/кг) и этропия (Дж/кг/К) кипящей воды при абсолютном давлении $p$ (Па); $h'',\ s''$ - энтальпия и этропия сухого перегретого пара при абсолютном давлении $p$ ; $T$ - температура насыщения водяного пара (К) при абсолютном давлении $p$.
Определим удельную теплоту конденсации при заданном давлении $p$ двумя способами и сравним результаты расчёта.
p = 1e5 # даление при котором происходит конденсация пара, Па
dh = r4.dh_p(p) # скрытая теплота парообразования
ds = r4.ds_p(p) # разница энтропий сухого перегретого пара и кипящей воды
T = r4.sc.T_p(p) # температура насыщения, К
(dh - ds * T) / dh * 100 # относительное отклонение, %
0.0005067417996188124
x = 0.3 # степень сухости влажного пара
props_px = r4.props_px(p, x) # результаты расчёта основным методом (база для сравнения)
props_ph = r4.props_ph(p, props_px['h']) # метод props_ph
props_ps = r4.props_ps(p, props_px['s']) # метод props_ps
props = {'props_ph': props_ph, 'props_ps': props_ps}
#Вычисление относительных отклонений от результатов расчёта props_px
errs = dict()
for method in props.keys():
errs[method] = dict()
for key in props_px.keys():
errs[method][key] = (props[method][key] - props_px[key]) / props_px[key] * 100
props_px # результаты расчёта основного метода
{'T': 372.7559186113376, 'p': 100000.0, 'h': 1094690.432321006, 's': 3119.4341139630233, 'cp': 3574.0860091484556, 'cv': 3104.5988717126897, 'v': 0.5089369603582141, 'u': 1043796.7362851847, 'w': 1223.43261040559, 'x': 0.3}
T - температура, К; p - абсолютное давление, Па; h - удельная энтальпия, Дж/кг; s - удельная энтропия, Дж/кг/К; cp - удельная изобарная теплоёмкость, Дж/кг/К; cv - удельная изохорная теплоёмкость, Дж/кг/К; v - удельный объём, м3/кг; u - удельная внутренняя энергия, Дж/кг; w - скорость звука, м/с; x - степень сухости.
table_err = pd.DataFrame(errs)
table_err # относительные отклонения от результата вычислений props_px, %
props_ph | props_ps | |
---|---|---|
T | 0.000000e+00 | 0.000000e+00 |
p | 0.000000e+00 | 0.000000e+00 |
h | 0.000000e+00 | 0.000000e+00 |
s | -1.457788e-14 | 0.000000e+00 |
cp | 1.272346e-14 | 0.000000e+00 |
cv | 1.464754e-14 | 1.464754e-14 |
v | -2.181455e-14 | 2.181455e-14 |
u | -2.230613e-14 | 0.000000e+00 |
w | 0.000000e+00 | 0.000000e+00 |
x | -1.850372e-14 | 1.850372e-14 |
Инженерные расчёты на Python, С.В. Медведев, 2020-2021
Использование Python и Jupyter Notebook для инженерных расчётов, С.В. Медведев, 2020-2021