흐름의 세 가지 초상 — 유선·유적선·유맥선은 왜 갈라지는가
비정상류에서 갈라지는 세 곡선과 물질미분 이야기
강물에 잉크를 한 줄기 흘려 사진을 찍었다. 같은 순간, 옆에서 나뭇잎 하나를 띄워 그 궤적을 그렸다. 두 선은 서로 달랐다. 흐름은 분명 하나인데 어떻게 모습이 둘로 나뉠까. 이 글은 유선·유적선·유맥선이라는 세 곡선이 왜 갈라지는지, 그리고 그 갈라짐이 물질미분(유체를 따라가며 보는 변화율)과 어떻게 연결되는지를 보여준다. 다 읽고 나면 강물 사진 한 장에 숨은 시간의 흔적을 읽을 수 있다.
같은 흐름, 다른 세 장의 그림#
유동을 그림으로 남기는 방법은 하나가 아니다. 연구실에서는 보통 세 가지를 쓴다.
첫째, 어느 순간 모든 점의 속도 방향을 이어 그린다. 둘째, 입자 하나에 표식을 달고 그 발자취를 추적한다. 셋째, 한 자리에서 염료를 계속 흘려 만들어지는 띠를 찍는다. 세 방법은 같은 흐름을 보지만, 결과가 늘 같지는 않다.
핵심은 시간이다. 흐름이 시간에 따라 변하면(비정상류), 세 그림은 서로 어긋난다. 변하지 않으면(정상류) 셋은 정확히 겹친다. 이 차이가 오늘의 주제다.
유선·유적선·유맥선 — 세 곡선의 정의#
세 곡선을 수식으로 분리해 보자. 속도장을 라 한다.
유선(streamline): 고정된 한 순간 에 모든 점에서 속도에 접하는 곡선이다.
여기서 는 그 순간 속도의 성분이다. 시간을 멈춘 스냅사진이다.
유적선(pathline): 입자 하나를 시간 따라 적분한 실제 자취다.
나뭇잎 한 장의 여행 기록이라고 보면 된다.
유맥선(streakline): 같은 점 를 거쳐 간 모든 입자들이 지금 어디에 있는지를 이은 선이다. 굴뚝에서 피어오르는 연기나 잉크 띠가 바로 이것이다.
정상류에서만 셋이 포개진다#
정상류는 속도장이 시간에 의존하지 않는 흐름, 즉 인 경우다. 이때는 입자가 한번 어떤 점을 지나면, 뒤에 오는 입자도 똑같은 길을 밟는다. 길이 시간에 따라 바뀌지 않기 때문이다.
그래서 유적선과 유맥선이 같아진다. 유선도 매 순간 동일하므로 셋이 모두 겹친다. 우리가 교과서에서 보는 "깔끔한 유선 그림"은 사실 정상류라는 암묵적 가정 위에 서 있다.
비정상류에서는 이 가정이 깨진다. 먼저 지난 입자의 길과 나중 입자의 길이 다르고, 순간의 접선 방향도 매 순간 달라진다. 세 곡선은 그래서 벌어진다.
오일러와 라그랑주, 그리고 물질미분#
이 갈라짐의 뿌리에는 두 관점이 있다. 오일러 관점(공간의 고정점에서 관찰)과 라그랑주 관점(입자를 따라가며 관찰)이다. 유선은 오일러적이고, 유적선은 라그랑주적이다.
두 관점을 잇는 다리가 물질미분이다.
는 임의의 물리량, 우변 첫째 항은 국소 변화율, 둘째 항은 대류 변화율이다. 앞항은 "고정점에서 시간에 따른 변화", 뒷항은 "입자가 자리를 옮겨서 생기는 변화"를 뜻한다.
직관이 어긋나기 쉬운 지점이 여기 있다. 정상류라 이어도, 입자는 가속할 수 있다. 좁아지는 노즐을 생각해 보자. 고정점에서 보면 속도는 시간에 따라 변하지 않는다. 하지만 입자가 목으로 빨려 들어가면서 점점 빨라진다. 그 가속을 전부 만드는 것이 대류항 다.
아래 시뮬레이션에서 수축비를 직접 조작해보자.
Nothing in this field depends on time, so ∂u/∂t = 0 at every fixed point. Yet the pink parcel still accelerates into the throat — all of it from the convective term u·∂u/∂x.
수축비를 0.25까지 줄이면 목 근처에서 입자 속도가 4배로 뛴다. 그래도 막대는 0에 붙어 있다. 모든 가속이 파란 대류항에서 나온다는 뜻이다.
Python — 진동하는 흐름에서 세 곡선 그리기#
세 곡선을 한 번에 그려 보자. 횡방향 속도가 하류로 전파하는 파동인 흐름을 쓴다. , , 여기서 다. 이 흐름에서는 세 곡선이 깔끔하게 다른 모양을 가진다.
import numpy as np
U, V0, omega = 1.0, 0.6, 2.0
k = omega / U
def velocity(x, t):
"""하류로 전파하는 횡파동: (u, v) 반환"""
return U, V0 * np.cos(omega * t - k * x)
def pathline(t0, t_end, dt=0.01):
"""t0에 원점에서 출발한 입자의 자취 (수치 적분)"""
x, y, t = 0.0, 0.0, t0
xs, ys = [x], [y]
while t < t_end:
u, v = velocity(x, t)
x += u * dt; y += v * dt; t += dt
xs.append(x); ys.append(y)
return np.array(xs), np.array(ys)
def streakline(t_now, n=400):
"""t_now 시점 염료 띠: s<=t_now에 방출된 입자들의 현재 위치"""
s = np.linspace(0.0, t_now, n)
x = U * (t_now - s)
y = V0 * np.cos(omega * s) * (t_now - s) # 이 흐름에서의 정확해
return x, y
def streamline_snapshot(t_now, x_max=10.0, n=400):
"""t_now 순간 원점을 지나는 유선"""
x = np.linspace(0.0, x_max, n)
y = (V0 / omega) * (np.sin(omega * t_now) - np.sin(omega * t_now - k * x))
return x, y
t_now = 6.0
xp, yp = pathline(0.0, t_now)
xs, ys = streakline(t_now)
xl, yl = streamline_snapshot(t_now)
print(f"유적선 끝점 : ({xp[-1]:.2f}, {yp[-1]:.2f})")
print(f"유맥선 y 범위 : [{ys.min():.2f}, {ys.max():.2f}]")
print(f"유선 y 범위 : [{yl.min():.2f}, {yl.max():.2f}]")출력은 세 곡선이 전혀 다른 영역을 차지함을 보여준다. 유적선은 직선으로 뻗고, 유선은 진폭 의 얕은 물결이며, 유맥선은 그보다 크게 출렁인다. 같은 흐름, 다른 세 그림이다.
직접 흔들어 보는 비정상성#
이제 시간을 살려서 세 곡선이 어떻게 벌어지는지 보자. 아래 시뮬레이션에서 진폭 와 주파수 를 조작해보자.
Field: u = U, v = V₀·cos(ωt − kx) with k = ω/U. Drag V₀ to 0 and the three curves collapse onto the axis — they only ever agree when the flow is steady.
를 0으로 내리면 세 곡선이 축 위로 포개진다. 정상류로 돌아간 것이다. 와 를 키우면 노란 유선은 빠르게 물결치고, 분홍 유적선은 곧게 뻗으며, 청록 유맥선은 또 다른 파형을 그린다. 비정상성이 클수록 세 초상은 멀어진다.
강을 다시 볼 때#
흐름 하나에 세 개의 그림이 나오는 이유는 단 하나, 시간이다. 유선은 시간을 멈춘 단면, 유적선은 한 입자의 일대기, 유맥선은 한 자리를 거쳐 간 모두의 현재다.
세 가지를 한 줄로 옮겨 둔다.
- 정상류면 셋이 겹친다. 다르면 흐름이 시간에 따라 변하고 있다는 신호다.
- 물질미분 의 대류항은 정상류에서도 가속을 만든다.
- 실험 사진이 잉크 띠라면 그것은 유맥선이지 유선이 아니다. 둘을 혼동하면 속도 방향을 잘못 읽는다.
도움이 됐다면 공유해주세요.