Skip to content
cfd-lab:~/ko/posts/2026-07-21-water-wave-di…● online
NOTE #108DAY TUE 유체역학DATE 2026.07.21UPDATED 2026.10.19READ 4 min read#Water-Waves#Dispersion#Group-Velocity#Capillary-Wave#Flow-Phenomena

물결 하나는 무리보다 빠르다 — 파의 분산과 군속도

에너지가 따라가는 건 마루가 아니라 포락선이고, 얕은 물에선 그 어긋남이 수심 하나로 사라진다.

잔잔한 호수에 돌을 하나 던진다. 물결이 고리를 그리며 퍼진다. 여기까진 누구나 안다.

그런데 고리를 자세히 보면 이상하다. 물결 하나하나는 고리 뒤쪽에서 생겨난다. 바깥으로 달려 나간다. 그러다 고리의 맨 앞에서 사라진다. 무리는 천천히 커지는데, 그 안의 물결은 무리를 앞질러 간다.

파장마다 속도가 다른 분산(dispersion, 파장별 속도 차이) 이 이 고리를 만든다. 파 하나와 파 무리가 따로 움직이는 양이 군속도(group velocity) 다.

표면장력 σ 슬라이더를 0 쪽으로 내리면 왼쪽 모세 가지가 사라지고, 곡선의 최저점이 짧은 파장 쪽으로 밀린다.

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.

최저 위상속도가 0.23 m/s 근처에 붙는지 본다. 중력만 남으면 파장이 짧을수록 곡선이 아래로 처진다.

던진 돌이 만든 고리#

물의 표면파는 원래 자리로 돌아가려는 힘, 즉 복원력(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πσρg≈1.7 cm\lambda_\ast = 2\pi\sqrt{\frac{\sigma}{\rho g}} \approx 1.7\,\text{cm}

이 파장에서 위상속도는 약 0.23 m/s로 가장 느리다. 중력 항과 표면장력 항이 같은 크기인 지점이다. 어느 한쪽만 남으면 골짜기는 사라진다.

표면장력이 물줄을 끊어 먹는 길이도 같은 σ\sigma, ρ\rho, gg에서 나온다. 물줄기가 방울로 끊기는 Plateau–Rayleigh는 그 길이를 제트의 반지름 쪽으로 본다.

깊은 물과 얕은 물#

수심이 파장보다 훨씬 얕으면 어떻게 될까. 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다. 본문의 1.7cm, 약 0.23 m/s와 같은 골짜기다. 2m 너울은 위상 1.767 m/s, 군 0.884 m/s, 비율 0.500이다. 1.767의 절반은 0.8835라서 출력 0.884와 소수 셋째 자리에서 만난다. 이 파장은 중력 항이 표면장력 항보다 훨씬 커서 cg=c/2c_g = c/2가 그대로 나온다.

최소 속도의 파장에서는 그렇지 않다. g/kg/k와 σk/ρ\sigma k/\rho가 같은 크기다. 순수 중력파로 두고 군속도를 절반으로 고정하면, 1.7cm 잔물결의 에너지 속도가 틀린다. 비율 0.500은 2m 너울처럼 중력만 남은 파장에서 맞다.

얕은 물은 반대쪽 끝이다. c=ghc = \sqrt{g h}에는 kk가 없다. ω=ck\omega = c k를 미분하면 cg=cc_g = c다. 마루와 무리가 같이 간다. 수심 4km에서 그 속도는 시속 700km다. 깊은 물의 절반 규칙을 이 파에 가져가면 에너지 위치가 두 배로 어긋난다.

수심을 빼고 c/2를 쓰면 에너지가 늦는다#

물수제비의 고리는 깊은 물에 가깝다. 마루는 위상속도로 달리고 무리는 절반으로 기어간다. 고리 앞에서 물결이 사라지는 장면이 그 차이다.

수심이 파장 아래로 내려가면 그 그림을 버린다. 속도는 gh\sqrt{gh} 하나고, 군속도와 위상속도가 같다. Reynolds 수가 길이로 유동의 세계를 나누는 방식과 같다. 남길 항은 수심, 파장, 그리고 1.7cm의 비교가 정한다.

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