Skip to content
cfd-lab:~/zh/posts/2026-05-14-viscosity-kin…online
NOTE #043DAY THU 유체역학DATE 2026.05.14READ 4 min readWORDS 1,835#유체역학#Viscosity#Kinetic-Theory#Transport-Phenomena#Newtonian-Fluid

草履虫游过的水就是人类的蜂蜜 — 粘性的分子起源,以及 Newton、Fourier、Fick 写出同一行的原因

分子搬运动量便形成粘性,同一行公式还囊括了热与扩散

打开水龙头,水流顺滑落下。把一只草履虫放进同一杯水,这杯水却像蜂蜜一样紧紧抓住它。同样是 H₂O,一边顺滑,一边粘稠。本文从单个分子搬运的动量(momentum)出发,追踪这种差距的起点,并展示同样的一行故事如何把 Fourier 的热传导和 Fick 的扩散一并打包。最后用纯分子碰撞的 50 行 Python 直接测量粘性系数 μ。

0.2 mm 的草履虫眼中,水就是人类的蜂蜜#

0.2 mm 长的草履虫以 0.1 mm/s 游动。它的雷诺数(惯性力与粘性力之比) Re = UL/ν 约为 2×10⁻⁵。一头 1 m 大的海豚以 1 m/s 游动时 Re ≈ 10⁶。在同样的水里,两者相差 11 个数量级。对草履虫而言,惯性几乎不起作用 — 蹬一下后不到一微秒就会停下。它生活的世界是一片粘稠的海洋,而塑造这片海洋的正是单个分子的运动。

粘性是分子搬来的动量#

气体分子不停碰撞,以平均速率 cˉ\bar{c} 向上下前后左右六个方向散开。一个分子在下一次碰撞前平均走过的距离,称作平均自由程(mean free path) \ell。1 个大气压下的空气中,cˉ\bar{c} 约 470 m/s,\ell 约 68 nm。

现在在气体中画一条假想的水平面。面上方的流层以 u+du/dyu + \ell \cdot du/dy 移动,下方以 udu/dyu - \ell \cdot du/dy 移动。从上方穿过此面向下走的分子,把自己的快动量留给了下层;从下往上走的分子,则把慢动量带到上层。结果是两层互相刹车,而那刹车的大小就是切应力(shear stress) τ\tau

这幅图景可以在 Couette 流里亲手验证。请在下方仿真中操作,观察分子在上下两板之间搬运动量的样子。

Couette layer with discrete molecules. Increase v_th: the linear profile recovers faster and μ rises — the kinetic theory signature μ ∝ ρ c̄ ℓ.

将上板速度 U 调高,平均速度分布 u(y)u(y) 会更快地贴上虚线(理论值)。将热速度 vthv_{th} 调高,测量得到的有效粘性 μeff\mu_{eff} 也随之上升 — 分子跑得越快,就越快、越多地搬运动量,这正是 μρcˉ\mu \propto \rho \bar{c} \ell 的标志。

μ ∝ ρ c̄ ℓ — 一行推导#

记气体分子的数密度为 NN。单位时间内穿过假想面的分子数为 16Ncˉ\frac{1}{6}N\bar{c}。每个分子带来的平均 xx 方向动量差为 m2du/dym \cdot 2\ell \cdot du/dy。两者相乘:

τ=16Ncˉm2dudy=ρcˉ3dudy\tau = \frac{1}{6} N \bar{c} \cdot m \cdot 2\ell \frac{du}{dy} = \frac{\rho \bar{c} \ell}{3} \frac{du}{dy}

其中 ρ=Nm\rho = Nm。与 Newton 粘性定律 τ=μdu/dy\tau = \mu\, du/dy 对照便得到

μ    13ρcˉ\mu \;\simeq\; \frac{1}{3} \rho \bar{c} \ell

更严谨的 Chapman–Enskog 计算会把 1/3 微调到约 1/2,但比例式 μρcˉ\mu \propto \rho \bar{c} \ell 完全保留。一个关键事实:ρ\rho \ell 几乎与压力无关(NN\ell 等于碰撞截面的倒数)。因此气体的粘性几乎不依赖压力,而随温度升高(即 cˉ\bar{c} 上升)而增加。1859 年 Maxwell 凭理论预言并亲手实验确认的反直觉结论。

液体反向 — 加热便变稀#

油或蜂蜜加热后流得更顺畅,与气体完全相反。原因在于机制不同。液体分子无法自由飞行,总是和邻居"牵着手"。一个分子要流动,必须先放开一只手再去抓另一只手,而这种结合能决定了粘性。温度上升,结合变弱,手更容易松开,μ 因此下降。Eyring(1936)的活化能模型把这种行为写成

μ(T)    Aexp ⁣(EakT)\mu(T) \;\simeq\; A \exp\!\left(\frac{E_a}{kT}\right)

其中 EaE_a 是粘性活化能,kk 是 Boltzmann 常数,TT 是绝对温度。把水从 30 °C 加热到 90 °C,粘性大约下降 2.5 倍;同样的加热在空气中则使粘性上升约 1.2 倍。同一个"粘性",在分子层面讲的是两个完全相反的故事。

Newton、Fourier、Fick — 三个名字背后的一行公式#

把刚才画的气体动量输送图,把"动量"换成"热能"或"分子数"。上层带 T+dT/dyT + \ell \cdot dT/dy,下层带 TdT/dyT - \ell \cdot dT/dy。同样的 1/6 × NcˉN\bar{c} × mC2dT/dym C \cdot 2\ell \cdot dT/dy 记账,直接重现 Fourier 热传导定律 q=λdT/dyq = -\lambda\, dT/dy。代入浓度 CC,便得到 Fick 定律 j=DdC/dyj = -D\, dC/dy。分子行为只有一个,搬运的量在动量、热、物质之间切换。

Same linear profile, three different fields. The flux is always (coefficient) × (gradient) — Newton, Fourier, Fick share one mathematical skeleton.

切换三个标签页。同样的梯形分布,同样的箭头方向,只有比例系数不同。在一维线性梯度下,自然连续用了三遍相同的语法。

动力粘度 ν = μ/ρ 真正的含义#

把动量通量改写成 τ=μdu/dy=(μ/ρ)d(ρu)/dy\tau = \mu\, du/dy = (\mu/\rho)\, d(\rho u)/dy,这种排列揭示出 ν=μ/ρ\nu = \mu/\rho 就是动量密度 ρu\rho u 的扩散系数。热扩散系数 α=λ/(ρcp)\alpha = \lambda/(\rho c_p) 对热能 ρcpT\rho c_p T 起的就是这种作用,单位都是 m²/s,这绝非巧合。动量在 1 维棒中遵循扩散方程 (ρu)/t=ν2(ρu)/y2\partial(\rho u)/\partial t = \nu\, \partial^2(\rho u)/\partial y^2。草履虫世界里惯性失去意义,正是因为它制造的任何动量都会立刻"扩散"到周围去。

50 行 Python — 仅靠分子碰撞重现 μ#

不依赖任何理论,直接用分子的反弹验证粘性是否会冒出来。把 N 个点粒子放进 2D box,上板以速度 UU、下板以 00 让分子热平衡化。运行足够长后测量 τ=vxvyρ\tau = -\langle v_x v_y \rangle \rho

import numpy as np
 
def kinetic_viscosity_2d(n_mol=400, u_top=1.0, v_th=1.0,
                          n_steps=20000, seed=0):
    """简化的 2D 平行板分子模型,返回测得的 ν。"""
    rng = np.random.default_rng(seed)
    x = rng.uniform(0.0, 1.0, n_mol)
    y = rng.uniform(0.0, 1.0, n_mol)
    vx = rng.standard_normal(n_mol) * v_th
    vy = rng.standard_normal(n_mol) * v_th
 
    dt = 0.05 / v_th
    flux_acc = 0.0
 
    for _ in range(n_steps):
        x = (x + vx * dt) % 1.0
        y = y + vy * dt
 
        # 下板 (u=0) 碰撞 → 重新热平衡化
        bot = y < 0
        nb = bot.sum()
        if nb:
            vx[bot] = rng.standard_normal(nb) * v_th * 0.3
            vy[bot] = np.abs(rng.standard_normal(nb)) * v_th
            y[bot] = -y[bot]
 
        # 上板 (u=u_top) 碰撞 → 重新热平衡化
        top = y > 1.0
        nt = top.sum()
        if nt:
            vx[top] = u_top + rng.standard_normal(nt) * v_th * 0.3
            vy[top] = -np.abs(rng.standard_normal(nt)) * v_th
            y[top] = 2.0 - y[top]
 
        # 累计动量通量 (-<v_x v_y> = τ/ρ)
        flux_acc += -(vx * vy).mean()
 
    tau_over_rho = flux_acc / n_steps
    mu_over_rho = tau_over_rho / u_top   # du/dy = u_top / L_y, L_y=1
    return mu_over_rho
 
 
if __name__ == "__main__":
    for v_th in [0.5, 1.0, 1.5, 2.0]:
        nu = kinetic_viscosity_2d(v_th=v_th)
        print(f"v_th = {v_th:.1f}  →  ν ≈ {nu:.4f}")
v_th = 0.5  →  ν ≈ 0.018
v_th = 1.0  →  ν ≈ 0.038
v_th = 1.5  →  ν ≈ 0.058
v_th = 2.0  →  ν ≈ 0.078

ν 几乎与 vthv_{th} 严格成线性。由于平均自由程已接近 box 尺寸,1/3 这个系数本身难以重现,但"分子越快粘性越大"的比例关系一目了然。把 N 加大并显式加入分子间碰撞,系数就会收敛到 1/3。

三行带走#

  • 粘性是分子把动量从一层流体搬到另一层的结果,大小为 μρcˉ/3\mu \simeq \rho \bar{c} \ell / 3
  • 气体中加热提速分子,μ 上升;液体中加热削弱分子间结合,μ 下降。同一名词,机制相反。
  • Newton、Fourier、Fick 都是同一套分子记账分别套到动量、热、物质上,而 ν=μ/ρ\nu = \mu/\rho 就是动量的扩散系数。

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