理想气体开始说谎的地方 — 压缩因子 Z 与 van der Waals 状态方程
用压缩因子、对应态原理和 van der Waals 环看实际气体
把 100 个大气压、200 K 的氮气用理想气体定律算密度,会比真实值偏差四分之一以上。压力温度都一样,分子却彼此吸引,还占据自己的体积。这篇文章讲三件事:如何用一个数(压缩因子 )抓住这种偏差,van der Waals 怎样用两个常数模拟实际气体,以及临界点之下出现的 S 形曲线如何把液体和气体分开。最后我们会看到,这一切如何直接影响火箭喷注器的超临界流动和 CFD 网格。
100 个大气压的氮气比理想气体重#
理想气体定律 把分子看成点,忽略分子间的力。对稀薄气体很准,因为分子彼此相距很远。
升高压力就不行了。分子拥挤在一起。微弱的吸引力(van der Waals 力)把分子拉近,使体积缩小。同时,分子自身的体积也不再可忽略。
这两个效应方向相反。吸引使体积缩小,有限大小使体积膨胀。哪一个占上风,由温度和压力决定。所以"实际气体比理想气体重还是轻"会随条件而翻转。
压缩因子 Z — 把偏差收进一个数#
这种偏差被收进了一个数,就是压缩因子。
是压力, 是摩尔体积, 是气体常数, 是温度。 即理想气体。 离 1 越远,偏差越大。
表示吸引占优:分子相互拉拢,实际体积小于理想值。 表示有限体积占优:分子相互排斥,体积变大。上面的氮气例子中 ,所以真实密度是理想值的 倍。
对应态原理:所有气体彼此相似的坐标#
每种气体的 曲线各不相同。但把压力和温度分别除以各自的临界值,曲线几乎重叠成一条。
、 是临界压力和临界温度。对应态原理(principle of corresponding states)这样说:在相同的对比压力 和对比温度 下,几乎所有气体的 几乎相同。
无论氮气、甲烷还是二氧化碳,在 、 处都有相近的 。决定行为的不是种类,而是相对临界点的位置。正是这种普适性,使一张广义图表能覆盖众多气体。
van der Waals:用两个常数模拟分子#
1873 年,van der Waals 给理想气体定律加了两项修正。
是分子间吸引带来的压力下降;密度越高(体积越小)它越强。 是分子自身占据的体积,于是自由空间缩小为 。
两个常数在临界点确定。临界点处 – 等温线经过一个拐点,斜率和曲率同时为零。
解出这两个条件,就得到常数和临界压缩因子。
这里 是与气体种类无关的常数。实际气体的 约为 0.27〜0.29,所以 van der Waals 在数量上偏高,但定性图像完全正确。
用对比变量重写,常数 、 就消失了。
这一行就是对应态原理的方程形式。临界点被钉在 。
临界点之下的 S 形曲线与 Maxwell 作图#
当 ,等温线单调下降。升高压力体积缩小,这是符合直觉的曲线。
当 ,曲线起伏。出现一个 S 形环。中间一段满足 :升高压力体积反而增大,这在力学上不稳定。实际物质会直接跳过这一段。
取而代之的是一条水平线连接液体和气体。这条线的高度就是饱和压力。位置由 Maxwell 等面积作图(equal-area rule)确定:选取水平线从环上截出的上下两块面积相等的高度。这个条件等价于液体和气体的 Gibbs 自由能相等。这是两相能够共存的唯一压力。
在下面的模拟里亲自动手吧。把对比温度滑块拖到 1 以下,环就长大,Maxwell 作图会涂出两块等面积的区域(粉色和青色)并画出饱和压力。
Z(sat. vapor) = 0.633 · Z(sat. liquid) = 0.163
把 降到 0.85,饱和气体和饱和液体之间 的差距急剧拉开。液体侧的 跌到 0.1 以下,因为分子几乎相触,吸引压倒一切。把 推向 1,两个 汇成一点——这正是临界点处液体与气体不再有区别的时刻。
用 Python 求解 Z#
把 van der Waals 方程对 整理,会得到一个三次方程。只要有实际气体的临界常数,就能在任意 、 求解 。
import numpy as np
R = 8.314 # J/(mol·K)
def vdw_constants(Tc, Pc):
"""由临界常数求 van der Waals a, b。"""
a = 27.0 * R**2 * Tc**2 / (64.0 * Pc)
b = R * Tc / (8.0 * Pc)
return a, b
def vdw_compressibility(P, T, Tc, Pc):
"""Z^3 - (1+B)Z^2 + A Z - A B = 0 的物理根。"""
a, b = vdw_constants(Tc, Pc)
A = a * P / (R * T)**2 # 吸引项的无量纲大小
B = b * P / (R * T) # 有限体积项的无量纲大小
coeffs = [1.0, -(1.0 + B), A, -A * B]
roots = np.roots(coeffs)
real = roots[np.abs(roots.imag) < 1e-8].real
real = real[real > B] # 只有 v > b ⇒ Z > B 才是物理的
return real.max(), real.min(), real.size
# 氮气: Tc = 126.2 K, Pc = 3.39 MPa, M = 28 g/mol
Tc, Pc, M = 126.2, 3.39e6, 0.028
P, T = 1.0e7, 200.0 # 100 bar, 200 K
Z_gas, Z_liq, n = vdw_compressibility(P, T, Tc, Pc)
rho_ideal = P * M / (R * T) # 理想气体密度
rho_real = rho_ideal / Z_gas # 实际密度
print(f"根的个数 = {n}, Z = {Z_gas:.4f}")
print(f"理想气体 密度 = {rho_ideal:6.1f} kg/m^3")
print(f"实际 密度 = {rho_real:6.1f} kg/m^3 ({100*(rho_real/rho_ideal-1):+.0f}%)")运行结果如下。
根的个数 = 1, Z = 0.7905
理想气体 密度 = 168.4 kg/m^3
实际 密度 = 213.0 kg/m^3 (+27%)由于 ,处于超临界区。只有一个实根,没有液体/气体之分。即便如此,用理想气体算出的密度仍比真实值小 27%——开篇那句"四分之一以上"的误差就在这里。
超临界喷注与 CFD — 状态方程为什么会撼动网格#
这并不只停留在黑板上。液体火箭发动机的燃烧室通常在高于推进剂临界压力的条件下工作。当 LOX(液氧)或低温氮气射流喷入这样的燃烧室,不会形成熟悉的液滴。
因为表面张力消失了。越过临界点,液体与气体的界面瓦解。射流不再碎裂成液滴,而是密度梯度像梳齿一样展开,与周围混合。这就是超临界(或跨临界)喷注,是下一代发动机设计中的核心流动现象。
这里状态方程会撼动网格,因为密度与压力、温度非线性地绑在一起。若 CFD 求解器假设理想气体,会把射流密度算错几十个百分点,随之动量通量 和混合长度也整体偏掉。所以实际代码采用实际气体模型——cubic EOS(Peng–Robinson、SRK)或 NASG(Noble–Abel Stiffened Gas)。压缩因子 正是这些模型在每个网格单元里求解的量。
值得记住的#
- 压缩因子 用一个数抓住实际气体偏离理想的程度。 表示吸引占优, 表示有限体积占优。
- van der Waals 方程仅凭吸引()和分子体积()两个常数,就定性地再现了临界点、环和相变。在对比变量下普适化为 。
- 临界点之外,超临界流动在没有表面张力的情况下混合,用 CFD 求解它需要的是实际状态方程,而非理想气体,且要在每个网格单元里求解。
如果对您有帮助,请分享。