Skip to content
cfd-lab:~/zh/posts/2026-07-21-water-wave-di…online
NOTE #110DAY TUE 유체역학DATE 2026.07.21READ 3 min readWORDS 1,473#Water-Waves#Dispersion#Group-Velocity#Capillary-Wave#유동현상

单个波纹比波群跑得快 — 波的色散与群速度

每个波长各有其速度的色散,以及相速度与群速度的错开

往平静的湖面扔一颗石子。波纹画着圆环向外扩散。这一点谁都知道。

可是仔细看这个圆环,会发现有些奇怪。每一道波纹都在圆环的后方生成。向外奔跑。然后在圆环的前缘消失。波群缓慢地扩大,而其中的波纹却超越波群向前。

本文讨论两件事。每个波长各有其速度的色散(dispersion,按波长的速度差异)。以及单个波与一群波以不同速度移动的群速度(group velocity)。读到最后,你就会明白石子的圆环为何呈现那副样子。

石子造出的圆环

水面波靠回到原位的力,也就是回复力(restoring force)运动。回复力有两个。

一个是重力。它把隆起的波峰拉回去。另一个是表面张力(surface tension,把水面绷紧的力)。它想把弯曲的水面抚平。

波长长时重力占上风。波长短于约 1.7cm 时表面张力主导。海上的涌浪是重力波。池塘的细波是表面张力波。

波长决定速度

支配水面波的关系,可归结为一个色散关系式(dispersion relation)。

ω2=(gk+σk3ρ)tanh(kh)\omega^2 = \left( g k + \frac{\sigma k^3}{\rho} \right)\tanh(k h)

其中 ω\omega 是角频率,k=2π/λk = 2\pi/\lambda 是波数(单位长度内的波的个数),λ\lambda 是波长,gg 是重力加速度,σ\sigma 是表面张力,ρ\rho 是密度,hh 是水深。

单个波前进的速度是相速度(phase velocity)。定义为 c=ω/kc = \omega/k

c=(gk+σkρ)tanh(kh)c = \sqrt{\left( \frac{g}{k} + \frac{\sigma k}{\rho} \right)\tanh(k h)}

关键在于 cc 依赖于 kk,也就是依赖波长。波长不同,速度就不同。这就是色散。声音,以及真空中的光,无论波长如何速度都相同。水面波并非如此。

重力与表面张力的拉锯

来看深水。当 khkh 很大时 tanh(kh)1\tanh(kh) \to 1。式子变得简单。

c=gk+σkρc = \sqrt{ \frac{g}{k} + \frac{\sigma k}{\rho} }

第一项是重力的份额。波长越长(kk 越小)它越大。第二项是表面张力的份额。波长越短(kk 越大)它越大。

两项方向相反。所以速度存在最小值。解 dc/dk=0dc/dk = 0 就得到速度最慢时的波长。

λ=2πσρg1.7cm\lambda_\ast = 2\pi\sqrt{\frac{\sigma}{\rho g}} \approx 1.7\,\text{cm}

在这个波长处相速度约为 0.23 m/s,最慢。在下面的图中亲自确认一下。

1mm1cm10cm1m10m0.01.02.03.03.9m/swavelength λ (log)gravity ↔ capillaryc_min ≈ 0.23 m/sphase speed cgroup speed c_g

Lower σ toward 0 and the capillary upturn on the left flattens — only gravity is left. Shrink h and the long-wave end levels off at the shallow-water speed √(gh), where waves stop dispersing.

把表面张力 σ\sigma 调向 0,左侧的表面张力波区间就消失。只剩重力时,波长越短一定越慢。看看曲线的最低点,以及重力与表面张力分界的位置如何移动。

深水与浅水

如果水深远小于波长会怎样。当 khkh 很小时 tanh(kh)kh\tanh(kh) \approx kh。忽略表面张力,速度会简单得惊人。

c=ghc = \sqrt{g h}

波长消失了。在浅水中所有波长以相同速度前进。没有色散。这种状态称为非色散(non-dispersive)。

海啸可怕的原因就在这里。在水深 4km 的海面上,gh\sqrt{gh} 可达每小时 700km。波长数百 km 的长波几乎保持形状,以喷气式飞机的速度奔驰。

波群比波更慢

现在回到开头的谜题。为什么单个波纹会超越波群。

波群,也就是波包(wave packet)移动的速度是群速度。定义为 cg=dω/dkc_g = d\omega/dk。它是与相速度不同的量。

来看深水中纯粹的重力波。ω=gk\omega = \sqrt{gk}。求导后结果很干净。

cg=dωdk=12gk=c2c_g = \frac{d\omega}{dk} = \frac{1}{2}\sqrt{\frac{g}{k}} = \frac{c}{2}

群速度恰好是相速度的一半。波群以自身波一半的速度爬行。所以每道波纹在波群后方生成,向前冲,在波群前缘消亡。

能量以群速度移动。以相速度前进的只是波峰的形状。下面来跟随一个黄色的波峰。

At c_g/c = 0.5 (deep-water gravity waves) the yellow crest clearly outruns the pink envelope and fades at the front. Set the ratio to 1 and the crest freezes inside the lump — nothing disperses.

c_g/c 设为 0.5,黄色波峰会超越粉色包络线(envelope,波群的外形)并在前方变淡。把比值升到 1,波峰就固定在波群内部。这是无色散波的样子。

用 Python 画色散曲线#

只要有色散关系式,相速度和群速度就能直接画出。群速度通过对 ω(k)\omega(k) 做数值微分求得。

import numpy as np
 
g, rho = 9.81, 1000.0          # 重力加速度[m/s^2]、水的密度[kg/m^3]
sigma = 0.072                  # 水-空气表面张力[N/m]
 
def omega(k, h):
    return np.sqrt((g * k + sigma * k**3 / rho) * np.tanh(k * h))
 
def phase_speed(lam, h):
    k = 2.0 * np.pi / lam
    return omega(k, h) / k
 
def group_speed(lam, h):
    k = 2.0 * np.pi / lam
    dk = k * 1e-5                       # 用中心差分求 domega/dk
    return (omega(k + dk, h) - omega(k - dk, h)) / (2.0 * dk)
 
lam = np.geomspace(1e-3, 10.0, 400)    # 1mm ~ 10m,假设为深水
c = phase_speed(lam, h=100.0)
i = int(np.argmin(c))
print(f"最小相速度 {c[i]:.3f} m/s @ 波长 {lam[i]*100:.2f} cm")
# 最小相速度 0.232 m/s @ 波长 1.73 cm
 
lam_swell = 2.0                        # 2m 涌浪: 重力主导
cp = phase_speed(lam_swell, 100.0)
cg = group_speed(lam_swell, 100.0)
print(f"相 {cp:.3f} m/s, 群 {cg:.3f} m/s, 比 {cg/cp:.3f}")
# 相 1.767 m/s, 群 0.884 m/s, 比 0.500

最小相速度与手算一致。波长 1.73cm 处为 0.232 m/s。而 2m 涌浪的群速度恰好是相速度的 0.5 倍。前面手推的结论在代码中得到了重现。

打水漂时记住的事

  • 色散: 水面波按波长速度各异。长波靠重力、短波靠表面张力加快,二者之间出现一个最小速度(约 0.23 m/s)。
  • 浅水: 水深小于波长时速度只有 gh\sqrt{gh}。波长消失,没有色散。
  • 群速度: 能量与波群以 cgc_g 前进。深水重力波中 cg=c/2c_g = c/2,所以单个波峰在波群前方生成,再消失。

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