Skip to content
cfd-lab:~/zh/posts/2026-06-30-van-der-waals…online
NOTE #090DAY TUE 유체역학DATE 2026.06.30READ 4 min readWORDS 2,138#Fluid-Mechanics#Equation-of-State#Van-der-Waals#Compressibility#Supercritical

理想气体开始说谎的地方 — 压缩因子 Z 与 van der Waals 状态方程

用压缩因子、对应态原理和 van der Waals 环看实际气体

把 100 个大气压、200 K 的氮气用理想气体定律算密度,会比真实值偏差四分之一以上。压力温度都一样,分子却彼此吸引,还占据自己的体积。这篇文章讲三件事:如何用一个数(压缩因子 ZZ)抓住这种偏差,van der Waals 怎样用两个常数模拟实际气体,以及临界点之下出现的 S 形曲线如何把液体和气体分开。最后我们会看到,这一切如何直接影响火箭喷注器的超临界流动和 CFD 网格。

100 个大气压的氮气比理想气体重#

理想气体定律 Pv=RTPv = RT 把分子看成点,忽略分子间的力。对稀薄气体很准,因为分子彼此相距很远。

升高压力就不行了。分子拥挤在一起。微弱的吸引力(van der Waals 力)把分子拉近,使体积缩小。同时,分子自身的体积也不再可忽略。

这两个效应方向相反。吸引使体积缩小,有限大小使体积膨胀。哪一个占上风,由温度和压力决定。所以"实际气体比理想气体重还是轻"会随条件而翻转。

压缩因子 Z — 把偏差收进一个数#

这种偏差被收进了一个数,就是压缩因子。

Z=PvRT=vactualvidealZ = \frac{Pv}{RT} = \frac{v_\text{actual}}{v_\text{ideal}}

PP 是压力,vv 是摩尔体积,RR 是气体常数,TT 是温度。Z=1Z=1 即理想气体。ZZ 离 1 越远,偏差越大。

Z<1Z<1 表示吸引占优:分子相互拉拢,实际体积小于理想值。Z>1Z>1 表示有限体积占优:分子相互排斥,体积变大。上面的氮气例子中 Z0.79Z \approx 0.79,所以真实密度是理想值的 1/0.791.271/0.79 \approx 1.27 倍。

对应态原理:所有气体彼此相似的坐标#

每种气体的 ZZ 曲线各不相同。但把压力和温度分别除以各自的临界值,曲线几乎重叠成一条。

PR=PPc,TR=TTcP_R = \frac{P}{P_c}, \qquad T_R = \frac{T}{T_c}

PcP_cTcT_c 是临界压力和临界温度。对应态原理(principle of corresponding states)这样说:在相同的对比压力 PRP_R 和对比温度 TRT_R 下,几乎所有气体的 ZZ 几乎相同。

无论氮气、甲烷还是二氧化碳,在 TR=1.5T_R=1.5PR=2P_R=2 处都有相近的 ZZ。决定行为的不是种类,而是相对临界点的位置。正是这种普适性,使一张广义图表能覆盖众多气体。

van der Waals:用两个常数模拟分子#

1873 年,van der Waals 给理想气体定律加了两项修正。

(P+av2)(vb)=RT\left(P + \frac{a}{v^2}\right)(v - b) = RT

a/v2a/v^2 是分子间吸引带来的压力下降;密度越高(体积越小)它越强。bb 是分子自身占据的体积,于是自由空间缩小为 vbv-b

两个常数在临界点确定。临界点处 PPvv 等温线经过一个拐点,斜率和曲率同时为零。

(Pv)Tc=0,(2Pv2)Tc=0\left(\frac{\partial P}{\partial v}\right)_{T_c} = 0, \qquad \left(\frac{\partial^2 P}{\partial v^2}\right)_{T_c} = 0

解出这两个条件,就得到常数和临界压缩因子。

a=27R2Tc264Pc,b=RTc8Pc,Zc=PcvcRTc=38a = \frac{27 R^2 T_c^2}{64 P_c}, \qquad b = \frac{R T_c}{8 P_c}, \qquad Z_c = \frac{P_c v_c}{R T_c} = \frac{3}{8}

这里 Zc=3/8=0.375Z_c = 3/8 = 0.375 是与气体种类无关的常数。实际气体的 ZcZ_c 约为 0.27〜0.29,所以 van der Waals 在数量上偏高,但定性图像完全正确。

用对比变量重写,常数 aabb 就消失了。

PR=8TR3vR13vR2P_R = \frac{8 T_R}{3 v_R - 1} - \frac{3}{v_R^2}

这一行就是对应态原理的方程形式。临界点被钉在 (vR,PR,TR)=(1,1,1)(v_R, P_R, T_R) = (1, 1, 1)

临界点之下的 S 形曲线与 Maxwell 作图#

TR>1T_R > 1,等温线单调下降。升高压力体积缩小,这是符合直觉的曲线。

TR<1T_R < 1,曲线起伏。出现一个 S 形环。中间一段满足 (P/v)T>0(\partial P/\partial v)_T > 0:升高压力体积反而增大,这在力学上不稳定。实际物质会直接跳过这一段。

取而代之的是一条水平线连接液体和气体。这条线的高度就是饱和压力。位置由 Maxwell 等面积作图(equal-area rule)确定:选取水平线从环上截出的上下两块面积相等的高度。这个条件等价于液体和气体的 Gibbs 自由能相等。这是两相能够共存的唯一压力。

在下面的模拟里亲自动手吧。把对比温度滑块拖到 1 以下,环就长大,Maxwell 作图会涂出两块等面积的区域(粉色和青色)并画出饱和压力。

saturation pressure P_r,sat = 0.647
Z(sat. vapor) = 0.633  ·   Z(sat. liquid) = 0.163

TRT_R 降到 0.85,饱和气体和饱和液体之间 ZZ 的差距急剧拉开。液体侧的 ZZ 跌到 0.1 以下,因为分子几乎相触,吸引压倒一切。把 TRT_R 推向 1,两个 ZZ 汇成一点——这正是临界点处液体与气体不再有区别的时刻。

用 Python 求解 Z#

把 van der Waals 方程对 ZZ 整理,会得到一个三次方程。只要有实际气体的临界常数,就能在任意 PPTT 求解 ZZ

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%)

由于 TR=200/126.21.59T_R = 200/126.2 \approx 1.59,处于超临界区。只有一个实根,没有液体/气体之分。即便如此,用理想气体算出的密度仍比真实值小 27%——开篇那句"四分之一以上"的误差就在这里。

超临界喷注与 CFD — 状态方程为什么会撼动网格#

这并不只停留在黑板上。液体火箭发动机的燃烧室通常在高于推进剂临界压力的条件下工作。当 LOX(液氧)或低温氮气射流喷入这样的燃烧室,不会形成熟悉的液滴。

因为表面张力消失了。越过临界点,液体与气体的界面瓦解。射流不再碎裂成液滴,而是密度梯度像梳齿一样展开,与周围混合。这就是超临界(或跨临界)喷注,是下一代发动机设计中的核心流动现象。

这里状态方程会撼动网格,因为密度与压力、温度非线性地绑在一起。若 CFD 求解器假设理想气体,会把射流密度算错几十个百分点,随之动量通量 ρu2\rho u^2 和混合长度也整体偏掉。所以实际代码采用实际气体模型——cubic EOS(Peng–Robinson、SRK)或 NASG(Noble–Abel Stiffened Gas)。压缩因子 ZZ 正是这些模型在每个网格单元里求解的量。

值得记住的#

  • 压缩因子 Z=Pv/RTZ = Pv/RT 用一个数抓住实际气体偏离理想的程度。Z<1Z<1 表示吸引占优,Z>1Z>1 表示有限体积占优。
  • van der Waals 方程仅凭吸引(a/v2a/v^2)和分子体积(bb)两个常数,就定性地再现了临界点、环和相变。在对比变量下普适化为 Zc=3/8Z_c = 3/8
  • 临界点之外,超临界流动在没有表面张力的情况下混合,用 CFD 求解它需要的是实际状态方程,而非理想气体,且要在每个网格单元里求解。

如果对您有帮助,请分享。