초음속에선 늘어나야 빨라진다 — 마하수, 충격파, 그리고 라발 노즐의 역설
음속을 넘는 순간 노즐과 디퓨저의 역할이 뒤집힌다. 그 한 줄의 수식을 따라간다.
1947년 10월 14일, 척 예거의 X-1이 마하 1.06을 찍었다. 그날 풍동 엔지니어들이 진짜 놀란 것은 음속 돌파 자체가 아니라, 그 직전까지 멀쩡하던 디퓨저가 갑자기 가속기처럼 굴기 시작한 일이었다. 이 글은 그 역설의 출처인 한 줄의 면적-마하수 관계식을 따라가며, 라발 노즐이 왜 가운데가 잘록해야 하는지, 그리고 초음속 흐름에 충격파가 왜 끼어드는지를 풀어 본다. 마지막에는 Python 30줄로 등엔트로피 노즐 곡선을 직접 그려 본다.
마하수 — 압축성을 가르는 한 숫자#
마하수(유속 와 음속 의 비)는 단순히 빠르기를 재는 척도가 아니다. 단위 체적당 관성력은 , 탄성력은 에 비례하므로 두 값의 평방근비가 마하수다.
여기서 는 체적탄성계수(부피 압축에 대한 강성), 는 밀도다. 즉 마하수는 "유동이 매질의 탄성을 얼마나 두드리는가"의 척도다. 통상 이면 밀도 변화가 5% 미만이라 비압축 가정이 통한다. 그 이상에서는 유동 자체가 매질을 누르기 시작한다.
음속을 넘는 순간 — 도플러에서 마하 원추로#
정지한 음원이 내는 파면은 동심원이다. 음원이 움직이면 앞쪽 파장은 짧아지고 뒤쪽은 길어진다. 도플러 효과다. 그런데 음원이 음속에 도달하면 모든 파면이 한 평면으로 겹친다. 음속을 넘어서면, 음원은 자기가 만든 파면을 추월한다. 파면의 포락선은 원추가 되고, 이 마하 원추 바깥에는 어떤 음도 도달하지 못한다.
원추의 반각 는 기하만으로 결정된다.
마하 2 비행기의 충격 원추는 , 마하 5 라면 까지 좁아진다. 아래 시뮬레이션에서 직접 조작해보자. 마하수를 0.6에서 2.5까지 올리면, 어느 순간 파면이 음원 뒤로 한꺼번에 쓸려 가는 모습이 보인다.
음원이 마하 1을 넘는 순간 파면들이 사선으로 정렬되는 점, 그리고 마하수가 커질수록 원추가 좁아지는 점이 핵심 관찰 포인트다.
역설의 한 줄 — (1−1/Ma²)dρ/ρ + dA/A = 0#
이제 본론. 단면적 가 변하는 1차원 정상류를 보자. 질량보존을 미분형으로 풀어쓰면
이고, 등엔트로피 가정에서 오일러 방정식과 음속 정의 를 결합하면
가 나온다. 두 식을 합쳐 를 소거하면 다음 한 줄이 남는다.
여기서 는 밀도, 는 단면적, 는 마하수다. 부호 분석을 하면 모든 모순이 풀린다.
아음속에서 (, 괄호 음수): 단면적이 줄면 () 밀도도 줄고(), 결과적으로 속도가 는다. 우리가 일상에서 보는 호스 끝과 같다.
초음속에서 (, 괄호 양수): 부호가 모두 뒤집힌다. 단면적이 줄면 밀도가 늘고 속도는 줄어든다. 좁은 관에 더 빨리 밀어 넣으려는 시도는 오히려 흐름을 막는다. 반대로 단면적이 늘어나야 속도가 는다.
라발 노즐 — 좁아져서는 빨라지지 않는다#
이 역설이 라발 노즐의 모양을 결정한다. 아음속을 받아 초음속까지 가속하려면, 우선 좁아져서 음속까지 끌어올린 다음, 다시 넓어져야 한다. 가운데 잘록한 부분(스로트)에서 정확히 에 도달한다. 식에서 이 되려면 이어야 하기 때문이다.
스로트 단면적 와 임의 단면적 의 비는 마하수만으로 결정된다.
같은 면적비에서 아음속 해와 초음속 해가 동시에 존재한다. 어느 가지를 따라가는지는 출구 배압 가 결정한다. 아래에서 슬라이더로 면적비와 배압비를 조작해 보자.
Cyan curve: Ma along axis (normalized). Dashed red line: throat. Lower P_b makes the diverging part accelerate to supersonic. Raise P_b above the design and a normal shock appears inside.
배압을 충분히 낮추면 디버전트(확장부)에서 마하 분포가 1을 넘어 단조 증가한다. 반대로 배압을 디자인 값보다 높이면, 노즐 안 어디선가 정상 충격파가 발생해 흐름이 다시 아음속으로 떨어진다.
Python으로 본 등엔트로피 면적-마하수 관계#
위의 면적비 공식과 등엔트로피 압력비를 NumPy 30줄로 따라가 본다. 이분법으로 면적비에서 마하수를 거꾸로 푼다.
import numpy as np
GAMMA = 1.4
def area_mach_relation(M, gamma=GAMMA):
"""A/A* — 등엔트로피 면적-마하수 식."""
exp = (gamma + 1) / (2 * (gamma - 1))
inner = (2 / (gamma + 1)) * (1 + 0.5 * (gamma - 1) * M ** 2)
return (1 / M) * inner ** exp
def solve_supersonic_branch(area_ratio, gamma=GAMMA, lo=1.0001, hi=25.0):
"""면적비 → 초음속 마하수 (이분법)."""
for _ in range(80):
mid = 0.5 * (lo + hi)
if area_mach_relation(mid, gamma) < area_ratio:
lo = mid
else:
hi = mid
return 0.5 * (lo + hi)
def pressure_ratio_isentropic(M, gamma=GAMMA):
"""p/p0 — 정체압 대비 정압비."""
return (1 + 0.5 * (gamma - 1) * M ** 2) ** (-gamma / (gamma - 1))
def normal_shock_p2_p1(M1, gamma=GAMMA):
"""수직 충격파 후방 정압비 p2/p1."""
return 1 + (2 * gamma / (gamma + 1)) * (M1 ** 2 - 1)
# 라발 노즐: 면적비 = 2.5 인 출구
A_ratio = 2.5
M_exit = solve_supersonic_branch(A_ratio)
p_exit = pressure_ratio_isentropic(M_exit)
print(f"design exit Ma = {M_exit:.3f}")
print(f"design exit p/p0 = {p_exit:.4f}")
print(f"if Ma1=1.5 normal shock, p2/p1 = {normal_shock_p2_p1(1.5):.3f}")실행하면 다음과 같이 떨어진다.
design exit Ma = 2.443
design exit p/p0 = 0.0633
if Ma1=1.5 normal shock, p2/p1 = 2.458면적비 2.5짜리 노즐을 설계대로 운용하면 출구에서 마하 2.44, 정압은 정체압의 6.3% 까지 떨어진다. 노즐 안에서 마하 1.5짜리 정상 충격파가 잡히면 압력이 2.46배로 급상승하면서 흐름이 즉시 아음속으로 바뀐다.
충격파 — 압축의 한계#
압축파가 자기 자신을 따라잡으면 충격파가 된다. 파동 후미는 압축으로 온도가 올라가고, 음속이 빨라져서 앞을 추월한다. 결국 두께가 분자 평균자유행정의 몇 배 수준(공기에선 마이크로미터 단위)인 얇은 면에 모든 압력 점프가 모인다.
수직 충격파의 압력비 는 마하수 1을 기준으로 0이고, 마하수가 커질수록 폭발적으로 커진다. 초음속 라발 노즐에서 배압이 디자인보다 높으면, 흐름이 그 압력 차이를 메우려 노즐 내부에 충격파를 만들어 자기 자신을 감속시킨다. "과팽창(over-expanded)" 상태다.
흥미롭게도 캐비테이션 기포가 붕괴할 때 나오는 마이크로 충격파, 채찍 끝이 음속을 넘으며 내는 "쉭" 소리, 운석이 대기에 진입하며 가열되는 메커니즘 — 이 모두 같은 식의 다른 얼굴이다.
기억할 점#
- 면적-마하수 식 한 줄이 노즐과 디퓨저의 역할 반전을 모두 담는다.
- 라발 노즐의 잘록한 스로트는 만 허용되는 유일한 단면이고, 출구 마하수와 압력비는 면적비 + 배압비가 함께 결정한다.
- 충격파는 등엔트로피 가정이 깨지는 자리에서 등장한다. 노즐 내부에 충격이 보이면 배압이 디자인보다 높다는 신호다.
도움이 됐다면 공유해주세요.