单个波纹比波群跑得快 — 波的色散与群速度
每个波长各有其速度的色散,以及相速度与群速度的错开
往平静的湖面扔一颗石子。波纹画着圆环向外扩散。这一点谁都知道。
可是仔细看这个圆环,会发现有些奇怪。每一道波纹都在圆环的后方生成。向外奔跑。然后在圆环的前缘消失。波群缓慢地扩大,而其中的波纹却超越波群向前。
本文讨论两件事。每个波长各有其速度的色散(dispersion,按波长的速度差异)。以及单个波与一群波以不同速度移动的群速度(group velocity)。读到最后,你就会明白石子的圆环为何呈现那副样子。
石子造出的圆环
水面波靠回到原位的力,也就是回复力(restoring force)运动。回复力有两个。
一个是重力。它把隆起的波峰拉回去。另一个是表面张力(surface tension,把水面绷紧的力)。它想把弯曲的水面抚平。
波长长时重力占上风。波长短于约 1.7cm 时表面张力主导。海上的涌浪是重力波。池塘的细波是表面张力波。
波长决定速度
支配水面波的关系,可归结为一个色散关系式(dispersion relation)。
其中 是角频率, 是波数(单位长度内的波的个数), 是波长, 是重力加速度, 是表面张力, 是密度, 是水深。
单个波前进的速度是相速度(phase velocity)。定义为 。
关键在于 依赖于 ,也就是依赖波长。波长不同,速度就不同。这就是色散。声音,以及真空中的光,无论波长如何速度都相同。水面波并非如此。
重力与表面张力的拉锯
来看深水。当 很大时 。式子变得简单。
第一项是重力的份额。波长越长( 越小)它越大。第二项是表面张力的份额。波长越短( 越大)它越大。
两项方向相反。所以速度存在最小值。解 就得到速度最慢时的波长。
在这个波长处相速度约为 0.23 m/s,最慢。在下面的图中亲自确认一下。
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.
把表面张力 调向 0,左侧的表面张力波区间就消失。只剩重力时,波长越短一定越慢。看看曲线的最低点,以及重力与表面张力分界的位置如何移动。
深水与浅水
如果水深远小于波长会怎样。当 很小时 。忽略表面张力,速度会简单得惊人。
波长消失了。在浅水中所有波长以相同速度前进。没有色散。这种状态称为非色散(non-dispersive)。
海啸可怕的原因就在这里。在水深 4km 的海面上, 可达每小时 700km。波长数百 km 的长波几乎保持形状,以喷气式飞机的速度奔驰。
波群比波更慢
现在回到开头的谜题。为什么单个波纹会超越波群。
波群,也就是波包(wave packet)移动的速度是群速度。定义为 。它是与相速度不同的量。
来看深水中纯粹的重力波。。求导后结果很干净。
群速度恰好是相速度的一半。波群以自身波一半的速度爬行。所以每道波纹在波群后方生成,向前冲,在波群前缘消亡。
能量以群速度移动。以相速度前进的只是波峰的形状。下面来跟随一个黄色的波峰。
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 画色散曲线#
只要有色散关系式,相速度和群速度就能直接画出。群速度通过对 做数值微分求得。
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)。
- 浅水: 水深小于波长时速度只有 。波长消失,没有色散。
- 群速度: 能量与波群以 前进。深水重力波中 ,所以单个波峰在波群前方生成,再消失。
如果对您有帮助,请分享。