本文译自作者的韩语原文。 阅读原文(한국어)
速度提高4倍,楔角仍是19.47° — 水深把开尔文尾迹撑开到90°的地方
决定尾迹角的不是速度而是水深:深水中固定在19.47°,一旦水深弗劳德数达到1就撑开到90°。
1803年的塞纳河,把船推向上游这件事#
1803年8月9日,Robert Fulton在塞纳河上演示了蒸汽船。河岸铭牌上留着三位观礼者的名字: Bossut、Carnot、Prony。三人都是流体力学家。
蒸汽机1776年就已存在。把它装到船上的尝试也有好几次。卡住的只有一点:船逆不了流。 Fulton解决的不是发动机,而是阻力。
本文拆解这份阻力的一块——船拖着的波浪的几何。在深水中,无论把速度提到多高,尾迹楔角 都不会离开19.47°。可是把水深降到2 m,同一个角就撑开到89°。为什么速度做不到的事水深能做到, 我们用一条色散关系算到底。
因为算不出来才只能去测的阻力
1752年d'Alembert证明,无粘无旋流动中物体受到的阻力严格为零。理论和现实正面冲突。 学界失去了预测阻力的手段。
Bossut用拖曳水槽实验填补了这个空白。他以恒定速度拖动模型船并读取张力。Prony整理了这些数据。 Fulton继承的正是这套实验传统。
他们测到的阻力中,大部分不是摩擦。而是船自己造出的波浪向后带走的能量。先看这些波能立在哪里。
把水深滑块从500 m拖向2 m,黄色楔形张开;只推速度滑块,角度不动。
Push V up with h fixed at “deep”: the yellow wedge never budges from 19.47°. Now drag h down toward 2 m and raise V until Fr_h → 1: the wedge opens to 90°, then closes again once Fr_h > 1.
只动速度滑块,黄色楔形纹丝不动。必须把水深从500 m往2 m方向拖,角度才会变。 控件有两个,但决定角度的只有一个。
只有看上去静止的波才能存活
在随船运动的坐标系里,尾迹是静止的。要显得静止,波的相速度必须等于船速在该方向上的分量。
设波数矢量与船的航向夹角为,条件如下:
是船速,是波数,是水深,是重力加速度。右边是水面波的色散关系。
这一个式子就是全文的核心。深水中(),,,水深消失。 浅水中(),,,波数消失。今天的故事就发生在这两个 极限之间。
相速度过不了。水深有限时,再长的波也快不过它。船一旦超过这个速度, 左边就再也配不上了。
能量实际去往的方向
波峰以相速度移动,能量却以群速度移动。有限水深下:
括号里在深水趋于1,在浅水趋于2。也就是说在到之间变化。
尾迹的形状由这个群速度塑造。跟踪船在秒前造出的一个波动分量。这段时间里船前进了, 能量沿波数方向走了。以船为原点,该分量现在位于后方、 侧向的位置。
被约掉了。这个分量在尾迹中出现的方向与它的年龄无关。
是从船的航向轴量起的射线角(ray angle)。楔角就是从扫到时的最大值。 驻相法(stationary phase)挑中的正是这个方向,能量在那里堆积,于是在水面上显出一条清晰的界线。
19.47°这个数字从哪里来#
先算深水。因为,静止条件给出,。 代入后被整个约掉。
速度从式子里消失了。这个函数在,即处取最大值。 换成角度就是。
船跑2 m/s还是8 m/s,结果一样。速度改变的只有波长。深水横波波长为, 与速度平方成正比。形状不变,只有尺度在长大。
时,,。分子是 ,分母是。比值是 。取反正切就是19.47°。同时出现在分子和分母里,被约掉。 时, m/s的波长是,即2.56 m。速度提到4倍的8 m/s, 变成16倍,波长到40.99 m。4 m/s是两倍,波长是四倍,10.25 / 2.56 = 4。表里的2.56、10.25、 40.99就是这个比。
把水深降到2 m,重跑同一套计算#
现在保留,用数值求解。用二分法解静止条件得到,代入群速度构造, 再扫描最大值。
import math
g = 9.81
def c_phase(k, h):
return math.sqrt(g / k * math.tanh(k * h))
def solve_k(v, h):
if v >= math.sqrt(g * h) - 1e-12:
return None
lo, hi = 1e-8, 1.0
while c_phase(hi, h) > v:
hi *= 2.0
if hi > 1e6:
return None
for _ in range(200):
mid = 0.5 * (lo + hi)
if c_phase(mid, h) > v:
lo = mid
else:
hi = mid
return 0.5 * (lo + hi)
def group_velocity(k, h):
kh = k * h
if kh > 20.0:
f = 1.0
else:
f = 1.0 + 2.0 * kh / math.sinh(2.0 * kh)
return 0.5 * c_phase(k, h) * f
def ray_angle(theta, v, h):
k = solve_k(v * math.cos(theta), h)
if k is None:
return None
cg = group_velocity(k, h)
num = cg * math.sin(theta)
den = v - cg * math.cos(theta)
if den <= 0.0:
return 0.5 * math.pi
return math.atan2(num, den)
def wedge_scan(v, h, n=8000):
best, best_t = 0.0, 0.0
for i in range(1, n):
th = 0.5 * math.pi * i / n
a = ray_angle(th, v, h)
if a is not None and a > best:
best, best_t = a, th
return math.degrees(best), math.degrees(best_t)
print(" V[m/s] h[m] Fr_h wedge[deg] theta*[deg] lambda_t[m]")
cases = [(2.0, 500.0), (4.0, 500.0), (8.0, 500.0),
(2.0, 2.0), (3.5, 2.0), (4.0, 2.0), (4.3, 2.0),
(4.43, 2.0), (5.5, 2.0), (8.0, 2.0)]
for v, h in cases:
frh = v / math.sqrt(g * h)
a, t = wedge_scan(v, h)
k0 = solve_k(v, h)
lam = (2 * math.pi / k0) if k0 else float('inf')
ls = f"{lam:10.2f}" if k0 else " inf"
print(f"{v:7.2f} {h:7.1f} {frh:7.3f} {a:11.2f} {t:11.2f} {ls}")
print()
print("supercritical branch vs Mach-like angle arcsin(1/Fr_h)")
print(" Fr_h wedge[deg] asin(1/Fr_h)[deg] diff")
for v, h in [(5.0, 2.0), (5.5, 2.0), (6.5, 2.0), (8.0, 2.0)]:
frh = v / math.sqrt(g * h)
a, _ = wedge_scan(v, h)
m = math.degrees(math.asin(1.0 / frh))
print(f"{frh:7.3f} {a:11.2f} {m:17.2f} {a-m:8.3f}") V[m/s] h[m] Fr_h wedge[deg] theta*[deg] lambda_t[m]
2.00 500.0 0.029 19.47 35.27 2.56
4.00 500.0 0.057 19.47 35.27 10.25
8.00 500.0 0.114 19.47 35.27 40.99
2.00 2.0 0.452 19.47 35.26 2.56
3.50 2.0 0.790 23.74 23.94 8.80
4.00 2.0 0.903 35.13 16.47 14.91
4.30 2.0 0.971 54.46 9.50 29.17
4.43 2.0 1.000 89.08 0.91 inf
5.50 2.0 1.242 53.63 36.36 inf
8.00 2.0 1.806 33.61 56.39 inf
supercritical branch vs Mach-like angle arcsin(1/Fr_h)
Fr_h wedge[deg] asin(1/Fr_h)[deg] diff
1.129 62.35 62.36 -0.007
1.242 53.63 53.64 -0.013
1.467 42.94 42.96 -0.014
1.806 33.61 33.62 -0.015把 Fr_h 滑块从表里的 0.452 推到 1.000, 的峰离开 ,向左滑下去。
Below Fr_h ≈ 0.7 the peak sits fixed at θ* = 35.27°, α = 19.47°. Drag Fr_h toward 1 and watch θ* slide to zero while α climbs to 90°. Past 1 a forbidden band opens on the left and the peak tracks asin(1/Fr_h).
0.1 到 0.7 之间峰钉在 35.27°,楔角停在 19.47°。只有靠近 1 时峰才往上冲,朝表里的 89.08° 走。
上面三行是深水。速度翻到4倍,楔角到小数点后两位都一样。只有波长从2.56 m变到40.99 m,涨了16倍。
第四行才有意思。 m,出来的仍然是19.47°,Fr_h为0.452。水深虽浅,但波长只有2.56 m时 ,对这个波来说水还是深的。要紧的不是水深本身,而是水深相对于波长。
用来看, m、 m时。 贴在1上,色散关系退回深水形式。所以水深2 m,楔角仍是19.47°。 m/s、 m时,,降到约0.43。离开1,表中的角是54.46°。 Fr_h = 0.790时23.74°,0.903时35.13°,0.971时54.46°,1.000时89.08°。深水里速度提到4倍也不动的角, 在4.30 m/s和4.43 m/s之间从23.74°撑到89.08°。
Fr_h越过0.79左右,角度开始动:0.903时35.13°,0.971时54.46°,1.000时89.08°。最后这个值差90° 还有0.9°,是网格有限造成的残差。配合看已降到0.91°就明白了——峰值正在向 收敛。
越过临界速度,楔形又收窄
Fr_h超过1后,只剩满足的,也就是 的区间才能造波。船首方向成了禁带。横波彻底消失, 表中列出现inf就是这个意思。
只由剩下的发散波(divergent wave)构成的楔角重新收窄:1.242时53.63°,1.806时33.61°。 第二张表把这些值与作了比较,四个算例全部吻合在0.015°以内。
这个角和超声速流动的马赫锥是同一个公式,只是浅水的坐在了声速的位置上。 Fr_h一过1,横波消失、只剩发散波,这个分界和 水槽里每天出现的水跃 用弗劳德数1分开缓流和急流是同一处。
Fulton在塞纳河上撞到的墙就是它。水深2 m的河里临界速度是4.43 m/s,约8.6节。在它附近, 尾迹会铺满整个河宽。波离不开船,推进去的能量就原样变成阻力返回来。
这个角度决定CFD网格的地方#
自由面计算里,域宽由楔角的正切决定。19.47°的正切是0.354,所以船尾后方处的尾迹半宽是 。表中Fr_h = 0.971、角54.46°时,正切靠近1.40。同一位置变成,大约4倍。侧壁若按 深水习惯放在之外,反射波就会混进船体压力,阻力系数会悄悄跑偏。
波长预算一起动。Fr_h = 0.971时横波波长是29.17 m。每波长40个单元,这一道波就超过1000个单元。 m、 m/s那一行波长是2.56 m,,同样的40单元规则也只是一百个单元上下。 船体和速度不变,水深把推向临界,网格行就变长。深水19.47°不依附速度、船型、粘性。角偏窄, 是格式把波抹平了;角偏宽,是色散误差混了进来。
临界之前把计算域关上,尾迹会撞到壁面
Fulton并不知道色散关系。Bossut水槽里的张力计先指向了。水深2 m时这个值是 4.43 m/s,约8.6节。Fr_h一过0.79,楔角离开19.47°,在1.000处撑到89.08°。波离不开船,推进去的 能量就变成阻力返回来。
看船体阻力时,先看的不是船速本身,而是对这条船造出的波长而言,这片水算不算深水。 m、 m时,角度仍是19.47°。同一水深上波长拉到29.17 m,楔形就铺满河宽。 只凭速度数字去关侧壁,和 雷诺数划分流动区间里 只看粘性系数就把流动装进一个盒子,是同一种失手。
相关文章
如果对您有帮助,请分享。