旋转的球为什么会拐弯 — 环量、马格努斯效应与库塔–儒科夫斯基定理
旋转物体获得升力的真正原因,以及起动涡这个看不见的关键角色
旋转的炮弹拒绝直飞的那一天#
1853年,柏林物理学家亨利希·马格努斯把炮兵们已经追问了几个世纪的疑问搬进了风洞。带自旋的炮弹不会沿直线飞行,而是会向侧面偏转。他将一根竖直的旋转圆柱悬挂在气流中,在垂直于旋转轴的方向测到了恒定的侧向力。旋转产生了升力。
剩下的问题是「为什么」。在没有粘性的理想流体里,物体表面是滑动的,凭什么上侧流速会更快、下侧会更慢呢?答案只有一个词,环量(circulation)。本文从环量的定义出发,展示旋转圆柱如何被向上拉起,沿着这条线索走到库塔–儒科夫斯基定理 — 它把这一结论推广到所有二维举升体。最后我们面对非粘性理论独自无法解答的那一点 — 静止流体里的环量到底是怎么「产生」的 — 用起动涡(starting vortex)作出解答。
环量 — 闭曲线上的一行积分#
环量 的定义很简洁。
沿闭曲线 把速度的切向分量绕一圈积起来。 是速度向量, 是曲线的微元切矢。
用斯托克斯定理改写为面积分,
其中 是涡量, 是闭曲线所围曲面的法向微元面积。换句话说,环量就是被这条闭曲线锁住的涡量总量。
有两点值得记住。哪怕闭曲线内部每一点的涡量都是零,环量仍可以不为零 — 围绕一个自由涡(涡量集中于中心点)的大闭曲线就是这种情形。另外,涡量与环量的量纲不同。涡量是 [1/s],环量是 [m²/s],后者是涡量再乘上面积。
旋转圆柱为什么被向上拽起#
在不可压、无旋、无粘的流动中,构造定常解最干净的办法是把基本解叠加起来。均匀来流 + 偶极子 = 静止圆柱。再在中心放一个点涡,就成了旋转圆柱。
打包成一个复势,
三项依次对应均匀流、偶极子、点涡(约定顺时针方向为正 )。表面 上的切向速度是
在上表面()两项同号叠加, 变大;在下表面()互相抵消,变小。上面更快,所以由伯努利方程
上表面压力更低。沿着圆柱周线把压力差积分起来,剩下的就是一个向上的合力。
在下面的模拟里直接动手调一调。
把 从零往上调,黄色的驻点会向下滑。当 时,两个驻点合并成一点并脱离圆柱表面 — 越过这个临界自旋,流动的拓扑就完全翻转了。
库塔–儒科夫斯基定理 — L′ = ρU∞Γ#
把表面压力直接积一遍,结果非常干净。在非粘定常流中阻力恰好为零,单位展长的升力是
1894年英国的兰彻斯特把它作为猜想提出来,20世纪初德国的库塔与俄国的儒科夫斯基各自独立地把它证明成定理。
这条公式之所以强大,有两个原因。第一,物体形状消失了。任何二维截面只要绕它的环量相同,产生的升力就一样。第二,升力正比于环量,而不是旋转本身。一片不旋转的机翼,只要剖面形状和迎角合适,翼周围一样会产生环量,从而产生升力。
起动涡和粘性那只看不见的手#
但这里出现了一个矛盾。静止流体里到处都是零涡量,所以任何闭曲线的环量都是零。开尔文环量定理 — 在非粘且体积力保守的流动中,沿物质曲线的环量随时间不变 — 要求这个零必须永远保持下去。
那飞机是怎么飞起来的?
答案是粘性。机翼从静止刚一加速时,非粘理论就要求后缘(trailing edge)的尖角处出现无穷大速度。真实流体里,粘性立刻把这部分动能磨掉,后缘处的涡剥离脱落 — 这就是起动涡(starting vortex)。它是一团逆时针方向的涡。
开尔文定理还要求,即便起动涡飘走之后,把机翼和尾迹一起圈进来的足够大的闭曲线,其总环量仍要保持为零。于是机翼周围必然留下一个大小相等、方向顺时针的环量 — 这就是束缚涡(bound vortex),也是库塔–儒科夫斯基升力的真正来源。
请按下面的 start motion 按钮看一看。
把迎角调大,顺时针的束缚环量就会增大,同等大小的逆时针起动涡也会从后缘脱落。两者之和始终为零。看似无粘的机翼升力,其实只是用非粘理论重新读一次起动涡剥离之后的状态而已。
代码:表面速度与升力系数#
把马格努斯效应压进一页 NumPy:流函数、表面压力系数、升力系数一起出。
import numpy as np
def cylinder_streamfunction(x, y, U_inf, gamma, R):
"""流函数 ψ = U sinθ (r - R²/r) + Γ/(2π) ln(r/R), 约定 Γ>0 为顺时针."""
r = np.hypot(x, y)
theta = np.arctan2(y, x)
safe = np.maximum(r, 1e-9)
psi_uniform = U_inf * np.sin(theta) * (safe - R ** 2 / safe)
psi_vortex = (gamma / (2 * np.pi)) * np.log(safe / R)
return psi_uniform + psi_vortex
def surface_pressure_coeff(theta, U_inf, gamma, R):
"""表面 r=R 上的压力系数 Cp = 1 - (u/U∞)²."""
u_theta = -2 * U_inf * np.sin(theta) - gamma / (2 * np.pi * R)
return 1.0 - (u_theta / U_inf) ** 2
def magnus_lift_coefficient(gamma, U_inf, R):
"""L' = ρU∞Γ → C_L = 2Γ/(U∞·d), 直径 d = 2R."""
return gamma / (U_inf * R)
# 跑三组直接看(取 ρ = 1)
U_inf, R = 10.0, 0.5
for gamma in [0.0, np.pi * U_inf * R, 4 * np.pi * U_inf * R]:
theta = np.linspace(-np.pi, np.pi, 360)
cp = surface_pressure_coeff(theta, U_inf, gamma, R)
L_per_span = U_inf * gamma
cl = magnus_lift_coefficient(gamma, U_inf, R)
print(f"Γ={gamma:6.2f} C_L={cl:5.2f}"
f" Cp_top={cp[270]:+.2f} Cp_bot={cp[90]:+.2f}"
f" L'/ρ={L_per_span:6.2f}")时升力严格为零,上下表面的 Cp 完全对称。把 推到临界值 ,两个驻点会合并成一点 — 也就是上面可视化里的那个红点。
三句话带走#
- 升力来自环量,而不是旋转本身。单位展长 对所有二维举升体都成立。
- 旋转圆柱可以被均匀流 + 偶极子 + 点涡精确地叠出来。上侧流快、下侧流慢,伯努利负责把它向上托起。
- 没有粘性就没有升力。后缘脱落的起动涡保住了开尔文定理,同时在翼周围留下大小相同方向相反的束缚涡 — 这就是飞行所依靠的东西。
如果对您有帮助,请分享。