超音速下要扩张才能加速 — 马赫数、激波与拉瓦尔喷管的悖论
流速越过音速的瞬间,喷管和扩压器互换角色。我们沿着那一行公式追下去。
1947年10月14日,查克·耶格驾驶的X-1飞机达到了马赫1.06。让风洞工程师真正吃惊的,并不是音障被突破本身,而是直到那一刻还规规矩矩当减速器的扩压段,突然像加速器一样工作。本文沿着这种悖论背后的一行面积—马赫数关系式,解释拉瓦尔喷管为什么必须在中间收缩,以及超音速流动中为什么会出现激波。最后用三十行Python亲手画出等熵喷管曲线。
马赫数 — 区分压缩性的一个比#
马赫数(流速 与音速 之比)不只是速度尺度。单位体积惯性力正比于 ,弹性力正比于 ,二者比值的平方根恰好就是马赫数。
其中 是体积模量(抵抗体积变化的刚度), 是密度。所以马赫数衡量的是"流动在多大程度上敲打介质的弹性"。经验法则是 时密度变化小于5%,可以采用不可压缩近似。超过这个值,流动本身就开始压缩它所穿过的介质。
越过音速 — 从多普勒到马赫锥#
静止声源发出的波面是同心圆。声源运动时前方波长缩短,后方拉长,这就是多普勒效应。当声源达到音速,所有波面叠加到一个平面上。一旦超过音速,声源就会超越自己发出的波面,包络线变成圆锥。这个马赫锥之外不会传到任何声音。
锥的半角 完全由几何决定。
马赫2飞行器拖出的锥半角约 ,马赫5则收紧到 。在下面的模拟里直接操作一下吧。把马赫数从0.6拉到2.5时,会看到某个瞬间所有波面被一齐扫到声源后方。
观察重点是:在马赫1的瞬间波面排成斜线,且马赫数越大锥越窄。
悖论的一行 — (1−1/Ma²)dρ/ρ + dA/A = 0#
进入正题。考虑截面积 变化的一维定常流动。质量守恒的微分形式为
在等熵假设下,欧拉方程结合音速定义 给出
消去 后剩下的就是吞下所有矛盾的一行。
这里 是密度, 是截面积, 是马赫数。符号分析就能解开一切。
亚音速 (,括号为负):截面积缩小 () 时密度也下降 (),速度因此上升。这就是花园水管被捏住时的情景。
超音速 (,括号为正):所有符号反转。截面积缩小反而让密度上升、速度下降。试图把气体更快地挤过更窄的通道,结果只会堵塞流动。要加速就必须让截面积增大。
拉瓦尔喷管 — 收缩并不总是加速#
这种符号反转决定了拉瓦尔喷管的形状。要把亚音速气流加速到超音速,必须先收缩到音速,再扩张。中间最细的部分(喉道)刚好处于 。因为 时式子要成立,必须有 。
固定喉道面积 后,其他截面只由马赫数决定。
同一个面积比对应一个亚音速解和一个超音速解。流动选哪个分支由出口背压 决定。下面用滑块同时调节面积比和背压比试试。
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三十行。用二分法从面积比反求马赫数。
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)
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时为零,之后随马赫数二次增长。当超音速拉瓦尔喷管的背压高于设计值,流动会在内部立起激波来弥合压力差,使自身减速。这就是"过度膨胀"状态。
有趣的是,空化气泡崩溃时释放的微激波、鞭梢突破音速时的"啪"声、陨石进入大气层时的加热机制 — 都是同一个公式的不同面孔。
值得记住的#
- 一行式 解释了喷管和扩压器的所有角色反转。
- 拉瓦尔喷管的细喉道是唯一允许 的截面,出口马赫数和压力比由面积比加背压共同决定。
- 激波出现在等熵假设破缺的位置。喷管内出现激波就是"背压高于设计值"的信号。
如果对您有帮助,请分享。