草履虫游过的水就是人类的蜂蜜 — 粘性的分子起源,以及 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 个数量级。对草履虫而言,惯性几乎不起作用 — 蹬一下后不到一微秒就会停下。它生活的世界是一片粘稠的海洋,而塑造这片海洋的正是单个分子的运动。
粘性是分子搬来的动量#
气体分子不停碰撞,以平均速率 向上下前后左右六个方向散开。一个分子在下一次碰撞前平均走过的距离,称作平均自由程(mean free path) 。1 个大气压下的空气中, 约 470 m/s, 约 68 nm。
现在在气体中画一条假想的水平面。面上方的流层以 移动,下方以 移动。从上方穿过此面向下走的分子,把自己的快动量留给了下层;从下往上走的分子,则把慢动量带到上层。结果是两层互相刹车,而那刹车的大小就是切应力(shear stress) 。
这幅图景可以在 Couette 流里亲手验证。请在下方仿真中操作,观察分子在上下两板之间搬运动量的样子。
将上板速度 U 调高,平均速度分布 会更快地贴上虚线(理论值)。将热速度 调高,测量得到的有效粘性 也随之上升 — 分子跑得越快,就越快、越多地搬运动量,这正是 的标志。
μ ∝ ρ c̄ ℓ — 一行推导#
记气体分子的数密度为 。单位时间内穿过假想面的分子数为 。每个分子带来的平均 方向动量差为 。两者相乘:
其中 。与 Newton 粘性定律 对照便得到
更严谨的 Chapman–Enskog 计算会把 1/3 微调到约 1/2,但比例式 完全保留。一个关键事实: 几乎与压力无关( 等于碰撞截面的倒数)。因此气体的粘性几乎不依赖压力,而随温度升高(即 上升)而增加。1859 年 Maxwell 凭理论预言并亲手实验确认的反直觉结论。
液体反向 — 加热便变稀#
油或蜂蜜加热后流得更顺畅,与气体完全相反。原因在于机制不同。液体分子无法自由飞行,总是和邻居"牵着手"。一个分子要流动,必须先放开一只手再去抓另一只手,而这种结合能决定了粘性。温度上升,结合变弱,手更容易松开,μ 因此下降。Eyring(1936)的活化能模型把这种行为写成
其中 是粘性活化能, 是 Boltzmann 常数, 是绝对温度。把水从 30 °C 加热到 90 °C,粘性大约下降 2.5 倍;同样的加热在空气中则使粘性上升约 1.2 倍。同一个"粘性",在分子层面讲的是两个完全相反的故事。
Newton、Fourier、Fick — 三个名字背后的一行公式#
把刚才画的气体动量输送图,把"动量"换成"热能"或"分子数"。上层带 ,下层带 。同样的 1/6 × × 记账,直接重现 Fourier 热传导定律 。代入浓度 ,便得到 Fick 定律 。分子行为只有一个,搬运的量在动量、热、物质之间切换。
切换三个标签页。同样的梯形分布,同样的箭头方向,只有比例系数不同。在一维线性梯度下,自然连续用了三遍相同的语法。
动力粘度 ν = μ/ρ 真正的含义#
把动量通量改写成 ,这种排列揭示出 就是动量密度 的扩散系数。热扩散系数 对热能 起的就是这种作用,单位都是 m²/s,这绝非巧合。动量在 1 维棒中遵循扩散方程 。草履虫世界里惯性失去意义,正是因为它制造的任何动量都会立刻"扩散"到周围去。
50 行 Python — 仅靠分子碰撞重现 μ#
不依赖任何理论,直接用分子的反弹验证粘性是否会冒出来。把 N 个点粒子放进 2D box,上板以速度 、下板以 让分子热平衡化。运行足够长后测量 。
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ν 几乎与 严格成线性。由于平均自由程已接近 box 尺寸,1/3 这个系数本身难以重现,但"分子越快粘性越大"的比例关系一目了然。把 N 加大并显式加入分子间碰撞,系数就会收敛到 1/3。
三行带走#
- 粘性是分子把动量从一层流体搬到另一层的结果,大小为 。
- 气体中加热提速分子,μ 上升;液体中加热削弱分子间结合,μ 下降。同一名词,机制相反。
- Newton、Fourier、Fick 都是同一套分子记账分别套到动量、热、物质上,而 就是动量的扩散系数。
如果对您有帮助,请分享。