Skip to content
cfd-lab:~/zh/posts/2026-08-06-oblique-shock…● online

本文译自作者的韩语原文。 阅读原文(한국어)

NOTE #124DAY THU 유체역학DATE 2026.08.06UPDATED 2026.10.19READ 4 min read#Gas-Dynamics#Oblique-Shock#Supersonic-Inlet#Stagnation-Pressure#Flow-Phenomena

四道激波胜过一道 — 超声速进气道的斜激波串

把减速拆成几道弱斜激波,熵增按三次方缩小。结尾那道正激波仍然得留下。

1944 年的哥廷根,Oswatitsch 被冲压进气道卡住了。Mach 3 的来流用一道激波立住,三分之二的压力就没了。他选的不是压得更狠,而是用几块斜板把折角拆开。

把 M1 滑条往上推,θ–β 曲线的膝部往右移。把折角 θ 推过最大角,贴体的激波就掉到鼻头前面。Weak 和 Strong 两个按钮,在同一个 θ 的两个波角之间切换。

drag theta and watch the amber Vn arrow grow while the slate Vt arrow never changes — that is why p02/p01 falls. push theta past the amber thetamax line and the shock detaches. then drag M1: the whole theta-beta knee slides right, so a faster inlet can turn the flow harder.

M1 越快,能折的角度越大。θ 一过膝部,p02/p01p_{02}/p_{01} 就塌下去,切向箭头在激波前后保持同样的长度。被削掉的只有法向分量。

激波夺走的是什么

穿过激波,质量、动量、能量都还在。滞止温度 T0T_0 也原样留下。消失的只有滞止压力 p0p_0。

p02p01=exp⁡ ⁣(−ΔsR)\frac{p_{02}}{p_{01}} = \exp\!\left(-\frac{\Delta s}{R}\right)

Δs\Delta s 是增加的熵,RR 是气体常数。熵增加多少,总压就削掉多少。

进气道能交给发动机的功,上限就是总压。滞止压力一降,喷管的膨胀比跟着死。那次膨胀会不会在喉部被堵住,是 喉部之后必须扩张的喷管 里的问题。进气道的成绩记成一个恢复系数 πd=p0e/p0∞\pi_d = p_{0e}/p_{0\infty}。

Mach 3 的一道正激波给出 0.3283。总压的 67% 散成了热。

斜着切入,只剩法向分量

激波相对来流斜着立,平行于波面的速度照旧通过。压力梯度只垂直于波面。斜激波就是只感受法向分量的正激波。波角 β\beta 一定,有效 Mach 数是

M1n=M1sin⁡βM_{1n} = M_1 \sin\beta

β\beta 越小,M1nM_{1n} 越靠近 1。即便是 Mach 3,只要 β=25.6°\beta = 25.6°,激波感受到的就是 Mach 1.30。

折角 θ\theta 和波角 β\beta 被一个式子绑在一起。

tan⁡θ=2cot⁡β M12sin⁡2β−1M12(γ+cos⁡2β)+2\tan\theta = 2\cot\beta \, \frac{M_1^2 \sin^2\beta - 1}{M_1^2 (\gamma + \cos 2\beta) + 2}

γ\gamma 是比热比。空气是 1.4。后面的斜板计算全部由这个式子决定。

一个 θ–β–M,两个答案#

给定 M1M_1 和 θ\theta 去解 β\beta,根有两个。波角小的是弱解,大的是强解。弱解后面通常仍是超声速,强解后面变成亚声速。背压不是特别高的时候,贴在楔上的激波取弱的那一支。前面的 Strong 按钮就是另一个根。

把 θ\theta 一直加大,根会消失。每个 Mach 都有一个最大折角 θmax⁡\theta_{\max}。

M1M_11.52.03.05.0
θmax⁡\theta_{\max}12.1°23.0°34.1°41.1°

θ>θmax⁡\theta > \theta_{\max} 时,激波贴不住物体,变成脱体激波。鼻头前面实质上是一道正激波,恢复系数就在那里掉下去。

损失按三次方缩小

弱激波的熵增并不正比于 M1n−1M_{1n}-1。它按三次方走。

ΔsR≃2γ3(γ+1)2(M1n2−1)3\frac{\Delta s}{R} \simeq \frac{2\gamma}{3(\gamma+1)^2}\left(M_{1n}^2 - 1\right)^3

γ=1.4\gamma = 1.4 时系数是 0.162。M1n2−1M_{1n}^2 - 1 减半,损失变成八分之一。

Mach 3 一次立住时,激波要承担的 Mn2−1M_n^2-1 是 8。拆成四段,每一段的损失按三次方变小,段数乘回去,总和仍比原来小。M1n=1.30M_{1n} = 1.30 一次的总压损失是 2.1%。同一件事拆成两次 M1n=1.15M_{1n} = 1.15,每次 0.33%,加起来也不到 0.7%。

把 Mach 3 进气道切成几段#

一块一块加上 8° 斜板,最后立一道正激波。每一块都用前一块留下的当地 Mach 重算。

import math
 
GAMMA = 1.4
 
def stagnation_ratio(mn):
    """承受法向 Mach 数 mn 的激波的总压比 p02/p01"""
    g = GAMMA
    a = ((g + 1) * mn**2 / 2) / (1 + (g - 1) * mn**2 / 2)
    b = (g + 1) / (2 * g * mn**2 - (g - 1))
    return a ** (g / (g - 1)) * b ** (1 / (g - 1))
 
def downstream_normal_mach(mn):
    g = GAMMA
    return math.sqrt((1 + (g - 1) / 2 * mn**2) / (g * mn**2 - (g - 1) / 2))
 
def deflection(mach, beta):
    """给定波角 beta(rad) 所产生的偏转角 theta(rad)"""
    g = GAMMA
    num = mach**2 * math.sin(beta) ** 2 - 1
    den = mach**2 * (g + math.cos(2 * beta)) + 2
    return math.atan(2 / math.tan(beta) * num / den)
 
def wave_angle_weak(mach, theta):
    """产生 theta 的弱解 beta。拧不出来则返回 None"""
    lo, hi = math.asin(1 / mach), math.pi / 2
    grid = [lo + (hi - lo) * i / 4000 for i in range(4001)]
    peak = max(grid, key=lambda b: deflection(mach, b))
    if theta > deflection(mach, peak):
        return None
    a, b = lo, peak
    for _ in range(80):
        mid = 0.5 * (a + b)
        if deflection(mach, mid) < theta:
            a = mid
        else:
            b = mid
    return 0.5 * (a + b)
 
def inlet_recovery(mach_inf, n_ramps, ramp_deg):
    """穿过 n 块斜板 + 终端正激波之后的总压恢复系数"""
    theta = math.radians(ramp_deg)
    total, mach = 1.0, mach_inf
    for _ in range(n_ramps):
        beta = wave_angle_weak(mach, theta)
        if beta is None:
            break
        mn = mach * math.sin(beta)
        total *= stagnation_ratio(mn)
        mach = downstream_normal_mach(mn) / math.sin(beta - theta)
    return total * stagnation_ratio(mach)
 
for n in range(5):
    print(f"斜板 {n} 块: 恢复系数 {inlet_recovery(3.0, n, 8.0):.4f}")

输出是这样。

斜板 0 块: 恢复系数 0.3283
斜板 1 块: 恢复系数 0.4497
斜板 2 块: 恢复系数 0.5808
斜板 3 块: 恢复系数 0.7101
斜板 4 块: 恢复系数 0.8235

改斜板块数、每块的折角和来流 Mach,恢复系数的柱子会按表里没有的组合重算。关掉结尾激波的开关,最后被削掉的那一份就从柱子里消失。

keep M inf = 3.00 and delta = 8 deg, then drag N from 0 to 4 and watch the bottom number climb 0.3283 → 0.8235 while the red terminal shock bar gets visibly thinner. now push delta up: each ramp bites harder, the chain runs out of Mach, and it turns red.

Mach 3、8°、四块斜板时,柱子站在 0.82 附近。把折角推到 14°,后面的斜板变红。流动已经慢到这个角度不再有弱解。

把恢复系数折回熵,2.5 倍看起来就不一样。Δs/R=−ln⁡πd\Delta s/R=-\ln\pi_d。0.3283 是 1.114,0.8235 是 0.194。恢复系数变成 2.51 倍,熵增却缩小到 1/5.7。指数把小损失藏进恢复系数这个数里。

每一块抬升的幅度是 0.121、0.131、0.129、0.113。第四块仍然加上 0.11。

把结尾激波的 13% 读成乘数 0.87,它前面的恢复系数是 0.8235/0.87≈0.950.8235/0.87\approx 0.95。四道斜激波削掉的份额大约 0.05,最后一道正激波削掉的份额大约 0.12。抹不掉的那一道,拿走的比所有斜板加起来还多一倍。

把 Mn=1.30M_n=1.30 的 2.1% 和 Mn=1.15M_n=1.15 的 0.33% 放到三次方旁边,Mn2−1M_n^2-1 的比 0.69 对 0.3225,三次方大约是 9.8。损失比是 6.4。Mach 1.30 已经走出这个近似舒服的区间。

Mach 2.4、6° 的 0.5401 和 0.9096,写成 Δs/R\Delta s/R 是 0.616 和 0.095。熵缩小到 1/6.5,恢复系数只升到 1.68 倍。因为一开始那道正激波就没那么差。

四次抬升都还在 0.11 以上,并不只是说这块 8° 离极限折角还远。Mach 3 的 θmax⁡\theta_{\max} 是表里的 34.1°,四块加起来的 32° 就贴在它下面。再加一块到 40°,就越过那个 34.1°。

四块 8° 斜板把恢复系数从 0.33 抬到 0.82,总折角 32°。加上去的就是四块斜面。Mach 2.4、6° 再走一遍,是 0.5401,两块 0.7440,四块 0.9096。

斜板数目推到无穷、每块折角收到 0,压缩就靠近等熵。恢复系数 1 在理论上打开。这就是协和和 SR-71 用曲面斜板和可动中心锥的位置。

切分并不是免费的

不立二十块斜板,另有原因。每加一块,激波碰到罩唇的点就往后推。进气道一长,重量和摩擦就跟上。用机身长度去买几个百分点的恢复系数,这笔交易通常是亏的。

角度按某一个 Mach 把激波收到罩唇上。离开那个 Mach,激波落在唇前或唇内,溢流阻力就出来了。块数越多,对这种错位越敏感。

每一道激波碰到壁面边界层,压力突然升高。这种干扰一旦引起分离,算出来的恢复系数就没有意义。进气道在斜板附近开抽吸缝,原因在这里。

压气机要亚声速来流。流动总得在某处跨过声速,所以结尾正激波删不掉。斜板只是把最后那道激波遇到的 Mach 压低,并不取消激波。四块斜板时,结尾激波发生在 Mach 1.67,这一道就拿走 13%。

把结尾正激波当成又一块斜板的失误

再加斜板、把恢复系数贴向 1,是没看见结尾激波还在拿走 0.12。这一道比四块斜板加起来的 0.05 还大。在为第五块付出长度和偏离设计点之前,先要定的是跨声速的那一道落在哪个 Mach。

0.82 是激波还贴在壁上时数出来的。边界层扛不住这次压力升高、一旦分离,表就到头了。层裂开、转成湍流的那个厚度 上,分离从多高开始,这个恢复系数并不说。

如果对您有帮助,请分享。