---
title: "亲手推动一束数值喷流互动实验｜Sandbox Physics"
description: "在流体模拟里，平流、扩散和压力投影各起什么作用？平流把染料和旋涡顺着流动带走，扩散把它们抹平。"
canonical_url: "https://sandboxphysics.com/zh/labs/interactive-jet/"
language: "zh-CN"
page_type: "lab"
alternate_languages:
  en: "https://sandboxphysics.com/labs/interactive-jet/"
last_modified: "2026-10-27"
---

流体力学 · 能亲手推动的数值流场

# Interactive Jet

**在流体模拟里，平流、扩散和压力投影各起什么作用？** 平流把染料和旋涡顺着流动带走，扩散把它们抹平。压力投影减去一个压力场的梯度，消掉散度，流体就不会在哪里堆积或变稀。这个压力场要迭代求解，迭代次数有限，就会剩下一点能测出来的散度。

透明流动室里，一个二维不可压缩速度场被拉出浅浅的纵深，画成发光粒子。调节黏度、染料扩散、压力迭代和涡量增强，看喷流绕过圆柱后怎样卷吸周围流体、留下尾迹。开启流体刷，在测试区拖动，就能同时注入染料和动量。

> 交互仿真：在浏览器中打开本页，即可调整参数并运行模型。

求解器用 Stable Fluids 风格的半 Lagrangian 平流、扩散和压力投影，靠求解 Poisson 方程让 $\nabla\cdot\boldsymbol{u}\approx0$。迭代次数有限，网格又是同位网格，残余不会严格归零，读数显示的就是实际残余。回溯插值会带来数值耗散，涡量增强是非物理的补偿。空间粒子只是把二维解拉出浅浅的纵深。这里没有求解三维 Navier–Stokes 方程，不是 DNS，也不是真实湍流。

物理教程

## 可操纵喷流：平流、扩散与投影分别做什么

**背景** 速度和染料都存放在一张固定网格上。每个时间步交替做速度扩散、平流和压力投影，然后搬运染料。横向和纵向各用自己的实际网格间距；慢放只改变播放速度，读数的时间单位不变。

**为什么值得理解** 把求解步骤一步步拆开，旋涡就不只是好看的特效。你能测出压力投影前后的散度，也能看到稳定性和数值耗散之间的取舍。

先抓重点

- **核心问题**: 速度场被随手推乱以后，为什么一次压力投影就能让它重新接近不可压缩？
- **一句话直觉**: 压力投影从中间速度里减去一个速度势的梯度。暂停后刷入动量、只做投影，就能比较同一个场的前后变化。迭代次数有限，网格又是同位网格，总会剩下测得出的残余，所以不能说已经做到 $\nabla_h\cdot\boldsymbol{u}=0$。

### 核心数学模型

#### 不可压缩速度演化

$$
\frac{\partial\boldsymbol{u}}{\partial t}+\left(\boldsymbol{u}\cdot\nabla\right)\boldsymbol{u}=-\nabla p+\nu\nabla^2\boldsymbol{u}+\boldsymbol{f},\qquad \nabla\cdot\boldsymbol{u}=0
$$

平流搬运动量，黏性把速度差扩散开，喷口和流体刷提供外力，压力让流场保持不可压缩。

#### 半 Lagrangian 回溯

$$
\phi^{n+1}(\boldsymbol{x})\approx\phi^n\!\left(\boldsymbol{x}-\Delta t\,\boldsymbol{u}^n(\boldsymbol{x})\right)
$$

从每个网格点逆着速度往回追，在落点插值取旧场的值。这一步很稳健，但反复插值会抹平细节。

#### 压力投影

$$
\nabla_h^2\varphi=\nabla_h\cdot\boldsymbol{u}^{*},\qquad \boldsymbol{u}'=\boldsymbol{u}^{*}-\nabla_h\varphi
$$

程序存的是速度势，时间步和密度因子已经并在里面，所以它不是以帕斯卡计的压力。网格格子是矩形，Poisson 松弛在横向和纵向用不同的权重。迭代次数有限，投影后散度不一定严格为零。

#### 当前场的散度均方根

$$
D_{\mathrm{live}}=\sqrt{\frac{1}{N_f}\sum_{i\in\mathrm{fluid}}\left(\nabla_h\cdot\boldsymbol{u}\right)_i^2},\qquad R=\frac{D_{\mathrm{before}}}{D_{\mathrm{after}}}
$$

当前值每次都从此刻的速度重新算。上次投影的前后两个值是一对历史快照，刷入动量或改动参数后会标为过期。速度场为零时，压缩比没有定义。

### 常见难点

#### 稳定不等于精确

**容易误解** 算法没爆掉，说明所有小旋涡都算对了。

**正确理解** 半 Lagrangian 平流在较大时间步下也能保持稳定，但插值会带来数值耗散。涡量增强只是把视觉细节补回来，丢掉的真实尺度找不回来。

#### 粒子有纵深，不等于求解是三维的

**容易误解** 粒子分布有纵深，所以求解器已经解析了三维湍流。

**正确理解** 所有粒子读的都是同一个二维速度截面。纵深只是让结构更容易看清，不会产生三维的涡拉伸。

### 动手实验

1. 01

   #### 建立圆柱尾迹

   选择“圆柱尾迹”，等染料绕过障碍。

   **你会看到：** 喷流在圆柱前减速并分成两股；圆柱后方是一片低速尾迹，里面的涡旋转方向左右交替。

2. 02

   #### 检查压力投影

   暂停求解，开启流体刷，拖出一个扰动。打开“散度诊断”，点击“只做压力投影”。改变迭代次数后再投影一次。

   **你会看到：** “上次投影前”的读数等于点击前的当前散度，“上次投影后”的读数等于新的当前散度。时间和染料都不前进。迭代次数加多，残余通常更小，但这仍不能证明流场严格不可压缩。

3. 03

   #### 亲手加入动量

   开启流体刷，在尾迹里横向拖动；想旋转装置时再关掉刷子。

   **你会看到：** 拖过的地方，染料和速度一起变化。新扰动随后被平流带走、扩散开，并再次经过压力投影。

物理结论

实时流体不是一张烟雾贴图：每个时间步都要把平流、扩散、外力和压力投影重新做一遍。

概念灵感：[FluidMotion](http://www.bugman123.com/FluidMotion/index.html)。模拟和图形都是原创，模型的适用范围见上文。

场、流体与物质 · 入门路径

## 从电场到电子显微镜

先看懂电场、学会操控带电粒子，再算出电子的波长，用电子束观察晶体和表面。

[从这里开始 → **看见电场** 在偶极子周围移动探针，看电场是不是总指向电势地形的下坡方向。 观察 · 8 分钟](https://sandboxphysics.com/zh/labs/electric-field/)

1. [1 看见电场](https://sandboxphysics.com/zh/labs/electric-field/)
2. [2 电荷在场中转弯](https://sandboxphysics.com/zh/labs/charged-particle/)
3. [3 电子波长与加速电压](https://sandboxphysics.com/zh/labs/electron-wavelength/)
4. [4 电子衍射与倒空间](https://sandboxphysics.com/zh/labs/electron-diffraction/)
5. [5 TEM 明场、暗场与选区衍射](https://sandboxphysics.com/zh/labs/tem-mode-selector/)
6. [6 SEM 二次电子表面形貌](https://sandboxphysics.com/zh/labs/sem-topography/)

[查看完整路径 →](https://sandboxphysics.com/zh/topics/fields-and-matter/#starter-path)
