非理想気体の状態方程式
概要
仕事で非理想気体の状態方程式を調べる機会があったので、様々な状態方程式をまとめておきます。
以下の英語での情報をもとに書いています。
ここに書いたのはほんの一部です⋯。また、固体の状態方程式は省略しています。
残念ながら元論文は読めていません。
式の比較
van der Waals (1873)
となる。
Berthelot (1899)
van der Waalsの状態方程式に温度依存性を加えたものをClausiusが提唱。それを簡略化した形。
Dieterici (1899)
指数関数を用いて補正項をいれた方程式。
Redlich–Kwong (1949)
圧力補正項の温度依存性を、温度の平方根の形で入れた式。
この辺りから、定数を臨界圧力・温度で表すための計算が自分には苦しくなってくる⋯。
Redlich–Kwong-Soave (1972)
Redlich–Kwongの式に偏心因子
Peng–Robinson (1976)
定数
Pythonで図示
これだけだとエンジニアのための新しい情報共有コミュニティの記事としてふさわしくないので
せっかくなのでPythonで図示してみましょう。温度は一定にして、H
ただし状態方程式は一部のものに絞ります。
自分が書いたコードがこれです。
各パラメーターは臨界圧力・温度を使って計算した値を使っているので、このやり方だと臨界点以外では実験値と一致しないと思います。
import numpy as np
import matplotlib.pyplot as plt
from scipy import constants
molar_mass_air = 28.96 * 10 ** (-3) # kg mol^{-1}
molar_mass_H2O = 18.02 * 10 ** (-3) # kg mol^{-1}
Rg = constants.gas_constant # J K^{-1} mol^{-1}
omega_H2O = 0.344
Tc_H2O = 647.14 # (K)
Pc_H2O = 22.060 * 10 ** 6 # (Pa)
# van der Waals
a_Waals_H2O = (27 * (Rg ** 2) / 64) * (Tc_H2O ** 2) / Pc_H2O # a m^6 mol^{-2}
b_Waals_H2O = (Rg / 8) * Tc_H2O / Pc_H2O # m^3 mol^{-1}
# Berthelot
a_Berth_H2O = (27 * (Rg ** 2) / 64) * (Tc_H2O ** 3) / Pc_H2O # K Pa m^6 mol^{-2}
b_Berth_H2O = (Rg / 8) * Tc_H2O / Pc_H2O # m^3 mol^{-1}
# Dieterici
a_Diete_H2O = (4 * (Rg ** 2) * (Tc_H2O ** 2)) / (np.exp(2) * Pc_H2O) # Pa m^6 mol^{-2}
b_Diete_H2O = (Rg / np.exp(2)) * Tc_H2O / Pc_H2O # mol^{-1}
# Redlich-Kwong
a_RK_H2O = (1 / (9 * (2 ** (1/3) - 1))) * (Rg ** 2) * (Tc_H2O ** (5/2)) / Pc_H2O # K^{1/2} Pa m^6 mol^{-2}
b_RK_H2O = ((2 ** (1/3) - 1) / 3) * Rg * Tc_H2O / Pc_H2O # m^3 mol^{-1}
# Peng-Robinson
a_PR_H2O = 0.45724 * Rg ** 2 * Tc_H2O ** 2 / Pc_H2O # Pa m^6 mol^{-2}
b_PR_H2O = 0.07780 * Rg * Tc_H2O / Pc_H2O # m^3 mol^{-1}
def P_ideal(Vm, T):
return Rg * T / Vm
def P_Waals(Vm, T, a=a_Waals_H2O, b=b_Waals_H2O):
return Rg * T / (Vm - b) - a / Vm ** 2
def P_Berth(Vm, T, a=a_Berth_H2O, b=b_Berth_H2O):
return Rg * T / (Vm - b) - a / (T * Vm ** 2)
def P_Diete(Vm, T, a=a_Diete_H2O, b=b_Diete_H2O):
return (Rg * T / (Vm - b)) * np.exp(- a / (Vm * Rg * T))
def P_RK(Vm, T, a=a_RK_H2O, b=b_RK_H2O):
return Rg * T / (Vm - b) - a / (T ** (1/2) * Vm * (Vm + b))
def P_PR(Vm, T, a=a_PR_H2O, b=b_PR_H2O, omega=omega_H2O):
def alpha(T):
return (1 + (0.37464 + 1.54226 * omega - 0.26992 * omega ** 2) * (1 - np.sqrt(T/647.14))) ** 2
alpha = alpha(T)
return Rg * T / (Vm - b) - a * alpha / (Vm * (Vm + b) + b * (Vm - b))
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
Vm = np.linspace(max(b_Waals_H2O, b_Berth_H2O, b_Diete_H2O, b_RK_H2O, b_PR_H2O) + 10 ** -9, 0.005, 10000)
ax.plot(10 ** 3 * Vm, 10 ** (-6) * P_ideal(Vm, 400), label='ideal gas')
ax.plot(10 ** 3 * Vm, 10 ** (-6) * P_Waals(Vm, 400), label='van der Waals')
ax.plot(10 ** 3 * Vm, 10 ** (-6) * P_Berth(Vm, 400), label='Berth')
ax.plot(10 ** 3 * Vm, 10 ** (-6) * P_Diete(Vm, 400), label='Diete')
ax.plot(10 ** 3 * Vm, 10 ** (-6) * P_RK(Vm, 400), label='Redlich-Kwong')
ax.plot(10 ** 3 * Vm, 10 ** (-6) * P_PR(Vm, 400), label='Peng-Robinson')
ax.legend()
ax.set_title('H$_2$O, 400 K')
ax.set_xlabel('$V_m$ ($×10^{-3}$ m$^{3}$ /mol)')
ax.set_ylabel('$P$ (MPa)')
ax.set_xlim(0, 1)
ax.set_ylim(0, 15)
ax.grid()
plt.show()
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
Vm = np.linspace(max(b_Waals_H2O, b_Berth_H2O, b_Diete_H2O, b_RK_H2O, b_PR_H2O) + 10 ** -9, 0.005, 10000)
ax.plot(10 ** 3 * Vm, 10 ** (-6) * P_ideal(Vm, 2000), label='ideal gas')
ax.plot(10 ** 3 * Vm, 10 ** (-6) * P_Waals(Vm, 2000), label='van der Waals')
ax.plot(10 ** 3 * Vm, 10 ** (-6) * P_Berth(Vm, 2000), label='Berth')
ax.plot(10 ** 3 * Vm, 10 ** (-6) * P_Diete(Vm, 2000), label='Diete')
ax.plot(10 ** 3 * Vm, 10 ** (-6) * P_RK(Vm, 2000), label='Redlich-Kwong')
ax.plot(10 ** 3 * Vm, 10 ** (-6) * P_PR(Vm, 2000), label='Peng-Robinson')
ax.legend()
ax.set_title('H$_2$O, 2000 K')
ax.set_xlabel('$V_m$ ($×10^{-3}$ m$^{3}$ /mol)')
ax.set_ylabel('$P$ (MPa)')
ax.set_xscale('log')
ax.set_yscale('log')
ax.set_xlim(10 ** 3 * max(b_Waals_H2O, b_Berth_H2O, b_Diete_H2O, b_RK_H2O, b_PR_H2O), 10 ** -1)
ax.set_ylim(100, 10000)
ax.grid()
plt.show()
で結果がこちら。
低温低圧領域ではこうなりました。どれも定性的には同じく
高温高圧領域ではこうなりました。
Redlich-Kwong式とPeng-Robinson式は理想気体の式とvan der Waalsの式の中間の値になっています。
雑感
他にも数多の状態方程式があり、数えきれません。
有名なものだとBenedict–Webb–Rubinの状態方程式というのがあるけれど、パラメーターが8個もあるわりには劇的に精度が上がるわけでもないようなので省略しました。
現代でも色々な方々が状態方程式の改良を続けていますが、パラメーターの数が多すぎては現実的には役に立たないので、結局Redlich–KwongやPeng–Robinsonの状態方程式が使われているようです。
他にはどんな状態方程式があるのか、気になります。
詳しい方がいたら教えてもらえると嬉しいです。
参考文献
- William John Macquorn Rankine, "On the Geometrical Representation of the Expansive Action of Heat, and the Theory of Thermo-Dynamic Engines", Philosophical Transactions of the Royal Society of London 144 pp. 115-175 (1854).
- J. D. van der Waals, "Over de Continuiteit van den Gasen Vloeistoftoestand", doctoral thesis, Leiden, A,W, Sijthoff (1873).
- R. Clausius, "Über das Verhalten der Kohlensäure in Bezug auf Druck, Volumen und Temperatur", Annalen der Physik und Chemie 9 pp. 337-357 (1880).
- D. J. Berthelot, "Sur Une Méthode Purement Physique Pour La Détermination des Poids Moléculaires des Gaz et des Poids Atomiques de Leurs Éléments", J. Phys., 8 pp. 263-274 (1899).
- C. Dieterici, Ann. Phys. Chem. Wiedemanns Ann. 69, 685 (1899).
- A. Wohl, "Investigation of the condition equation", Zeitschrift für Physikalische Chemie (Leipzig) 87 pp. 1-39 (1914).
- W. P. Boynton and Arthur Bramley, "A Modification of Van Der Waals' Equation", Physical Review 20 pp. 46-50 (1922).
- James A. Beattie and Oscar C. Bridgeman, "A New Equation Of State For Flueds. I. Application To Gaseous Ethyl Ether And Carbon Dioxide", Journal of the American Chemical Society 49 pp. 1665 - 1667 (1927).
- Otto Redlich and J. N. S. Kwong, "On the Thermodynamics of Solutions. V. An Equation of State. Fugacities of Gaseous Solutions", Chemical Reviews 44 pp. 233-244 (1949).
- Giorgio Soave, "Equilibrium constants from a modified Redlich-Kwong equation of state", Chemical Engineering Science 27 pp. 1197-1203 (1972).
- Ding-Yu Peng and Donald B. Robinson, "A New Two-Constant Equation of State", Industrial & Engineering Chemistry Fundamentals 15 pp. 59-64 (1976).
Discussion