Skip to content
cfd-lab:~/ko/posts/2026-07-21-water-wave-di…online
NOTE #110DAY TUE 유체역학DATE 2026.07.21READ 3 min readWORDS 1,740#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)}

핵심은 cckk에, 즉 파장에 의존한다는 점이다. 파장이 다르면 속도가 다르다. 이것이 분산이다. 소리나 빛(진공에서)은 파장이 달라도 속도가 같다. 물결은 그렇지 않다.

중력과 표면장력의 줄다리기#

깊은 물을 보자. 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라서, 마루 하나는 무리를 앞질러 태어나고 사라진다.

도움이 됐다면 공유해주세요.