流动的三幅肖像 — 流线、迹线、脉线为何分道扬镳
在非定常流中分开的三条曲线与物质导数
往河里滴下一缕墨水,拍下一张照片。在同一瞬间,旁边放下一片树叶,描出它的轨迹。两条线却画出了不同的形状。流动明明只有一个,画面怎么会一分为二?本文展示流线、迹线、脉线这三条曲线为何会分开,以及这种分开如何与物质导数(随流体一同运动时所见的变化率)相连。读完之后,你能从一张河流照片里读出隐藏的时间痕迹。
同一流动,三幅不同的画#
把流动画下来的方法不止一种。在实验室里,常用三种。
第一,在某一瞬间把所有点的速度方向连起来。第二,给一个流体微团做标记,追踪它的足迹。第三,在一处持续释放染料,拍下它形成的带子。三种方法看的是同一个流动,结果却未必一致。
关键在于时间。当流动随时间改变时(非定常流),三幅画就会分开。当它不变时(定常流),三者精确重合。这个差别就是今天的主题。
流线、迹线、脉线 — 三个定义#
用公式把三条曲线分开。把速度场记作 。
流线(streamline):在固定的某一瞬间 ,在每一点都与速度相切的曲线。
这里 是那一瞬间的速度分量。它是把时间冻结的快照。
迹线(pathline):单个微团沿时间积分得到的真实轨迹。
可以把它看作一片树叶的旅行日记。
脉线(streakline):把曾经经过同一点 的所有微团此刻所在的位置连起来的线。烟囱升起的烟、或一条染料带,正是脉线。
只有定常流中三者才重合#
定常流是速度场不依赖时间的流动,即 。此时,一个微团一旦经过某点,后来的微团也会走同一条路——因为路不随时间改变。
于是迹线与脉线变得相同。流线在每一瞬间也都一样,所以三者全部重合。我们在教科书里看到的"干净的流线图",其实都站在定常这一隐含假设之上。
在非定常流中,这个假设失效。先经过的微团之路与后来者不同,瞬时的切线方向也时刻在变。三条曲线因此分开。
欧拉、拉格朗日与物质导数#
这种分开的根源是两个视角:欧拉视角(在空间固定点观察)与拉格朗日视角(跟随微团观察)。流线是欧拉式的,迹线是拉格朗日式的。
连接两个视角的桥梁是物质导数。
这里 是任意物理量,右端第一项是局部变化率,第二项是对流变化率。前者表示"固定点处随时间的变化",后者表示"因微团移动而产生的变化"。
直觉最容易在此处绊倒。即便在定常流中 ,微团仍可加速。想象一个收窄的喷嘴。在固定点看,速度不随时间改变。但被吸入喉部的微团却越来越快。这一加速全部由对流项 造成。
在下面的模拟中拖动收缩比试试。
Nothing in this field depends on time, so ∂u/∂t = 0 at every fixed point. Yet the pink parcel still accelerates into the throat — all of it from the convective term u·∂u/∂x.
把收缩比降到 0.25,喉部附近微团速度翻到四倍。可 这根柱子仍然贴在零上。所有加速都来自青色的对流项。
Python — 在振荡流动中画出三条曲线#
让我们一次画出三条曲线。采用横向速度沿下游传播为波的流动:,,其中 。在这个流动里,三条曲线呈现出干净的不同形状。
import numpy as np
U, V0, omega = 1.0, 0.6, 2.0
k = omega / U
def velocity(x, t):
"""沿下游传播的横波: 返回 (u, v)"""
return U, V0 * np.cos(omega * t - k * x)
def pathline(t0, t_end, dt=0.01):
"""t0 时刻从原点出发的微团轨迹(数值积分)"""
x, y, t = 0.0, 0.0, t0
xs, ys = [x], [y]
while t < t_end:
u, v = velocity(x, t)
x += u * dt; y += v * dt; t += dt
xs.append(x); ys.append(y)
return np.array(xs), np.array(ys)
def streakline(t_now, n=400):
"""t_now 时刻的染料带: s<=t_now 释放微团的当前位置"""
s = np.linspace(0.0, t_now, n)
x = U * (t_now - s)
y = V0 * np.cos(omega * s) * (t_now - s) # 此流动的精确解
return x, y
def streamline_snapshot(t_now, x_max=10.0, n=400):
"""t_now 瞬间过原点的流线"""
x = np.linspace(0.0, x_max, n)
y = (V0 / omega) * (np.sin(omega * t_now) - np.sin(omega * t_now - k * x))
return x, y
t_now = 6.0
xp, yp = pathline(0.0, t_now)
xs, ys = streakline(t_now)
xl, yl = streamline_snapshot(t_now)
print(f"迹线终点 : ({xp[-1]:.2f}, {yp[-1]:.2f})")
print(f"脉线 y 范围: [{ys.min():.2f}, {ys.max():.2f}]")
print(f"流线 y 范围: [{yl.min():.2f}, {yl.max():.2f}]")输出表明三条曲线占据了完全不同的区域。迹线笔直延伸,流线是振幅 的浅波,脉线摆动得大得多。同一流动,三幅不同的画。
亲手摇出非定常性#
现在让时间活起来,看三条曲线如何分开。在下面的模拟中调节振幅 和频率 。
Field: u = U, v = V₀·cos(ωt − kx) with k = ω/U. Drag V₀ to 0 and the three curves collapse onto the axis — they only ever agree when the flow is steady.
把 降到零,三条曲线叠在轴上——你回到了定常流。增大 和 ,黄色流线快速起伏,粉色迹线笔直延伸,青色脉线又画出另一种波形。非定常性越强,三幅肖像离得越远。
再看一条河时#
一个流动给出三幅画,原因只有一个:时间。流线是冻结时间的切面,迹线是单个微团的一生,脉线是经过同一处的所有微团此刻的所在。
带走三句话。
- 三者重合,流动就是定常的。三者不同,说明流动正随时间改变。
- 物质导数 的对流项,在定常流中也会产生加速。
- 若实验照片是染料带,那它是脉线,而非流线。混淆二者,就会把速度方向读错。
如果对您有帮助,请分享。