流体之美:用Python可视化隐藏在数学公式中的流动奥秘
你是否曾好奇过烟圈如何形成完美的环形?咖啡里的奶泡为何会扩散成复杂图案?这些看似随机的流体运动,其实都遵循着精妙的数学规律。本文将带你探索GitHub_Trending/vi/videos项目中如何用代码揭示流体力学的底层逻辑,无需高深数学背景,只需跟随示例就能亲手创建流动的视觉盛宴。
从公式到动画:流体模拟的核心原理
流体力学的本质是追踪无数微小粒子的运动轨迹。在_2015/ka_playgrounds/fluid_flow.py中,开发者通过向量场(Vector Field)模型简化了这一过程。向量场就像一张看不见的"速度地图",每个点都指示了流体在该位置的运动方向和速度。
# 流体流动的核心计算逻辑
def use_function(self, function):
self.function = function # 定义向量场函数
def flow(self, **kwargs):
# 让粒子点沿着向量场运动
self.play(ApplyToCenters(
PhaseFlow,
self.dots.split(),
function = self.function, # 应用向量场
**kwargs
))
上述代码来自FluidFlow类的核心实现,它通过PhaseFlow动画使粒子点按照预设的向量场函数运动。这种方法虽然简化了完整的Navier-Stokes方程,但保留了流体运动的视觉特征,完美平衡了计算效率与可视化效果。
动手实践:创建你的第一个流体动画
基础环境准备
项目使用Manim(数学动画引擎)实现可视化效果。通过以下命令可快速复现流体模拟场景:
# 在项目根目录执行
python -m manim _2015/ka_playgrounds/fluid_flow.py VectorFieldExample -pl
这条命令会运行VectorFieldExample场景,生成一个包含向量箭头和流动粒子的动画。参数-pl表示"预览低质量"模式,适合快速测试。
核心组件解析
FluidFlow类提供了三种关键可视化元素,通过组合这些元素可以创建丰富的流体效果:
- 坐标轴(Axes):提供空间参考系
- 向量箭头(Vectors):显示速度场方向和大小
- 粒子点(Dots):模拟流体微团的运动轨迹
# 典型场景构建流程
def construct(self):
# 定义向量场函数:双涡旋流动
self.use_function(lambda (x, y, z):
0.5*((2*y)**3-9*(2*y))*RIGHT +
0.5*((2*x)**3-9*(2*x))*UP
)
self.add_axes(show_creation=True) # 添加坐标轴
self.add_vectors(show_creation=True) # 添加向量箭头
self.add_dots(show_creation=True) # 添加粒子点
self.flow(run_time=30, virtual_time=3) # 执行流动动画
这段代码创建了一个具有四个漩涡的流动场(如图1所示),粒子会被吸引到四个平衡点形成的"势阱"中。通过修改向量场函数,我们可以模拟不同类型的流体行为。
流体行为的四种基本模式
1. 旋转流动(漩涡)
ConstantPositiveCurl场景展示了理想的漩涡运动,其向量场函数为:
lambda p: 0.5*(-p[1]*RIGHT + p[0]*UP)
这个函数创建了绕原点的匀速圆周运动,粒子点会形成同心圆轨迹。在实际流体中,浴缸排水时的漩涡就是这种模式的典型例子。运行以下命令可查看效果:
python -m manim _2015/ka_playgrounds/fluid_flow.py ConstantPositiveCurl -pl
2. 汇聚与发散
流体既可以像水池放水一样汇聚(NegativeDivergenceExamlpe),也可以像喷泉一样发散(PositiveDivergenceExample)。这两种模式的核心区别在于向量场的散度(Divergence)符号:
# 汇聚流动(负散度)
lambda p: -p/(2*get_norm(0.5*p)**0.5 + 0.01)
# 发散流动(正散度)
lambda p: p/(2*get_norm(0.5*p)**0.5 + 0.01)
这两种模式在_2015/ka_playgrounds/fluid_flow.py中分别由NegativeDivergenceExamlpe和PositiveDivergenceExample类实现,直观展示了流体源和汇的概念。
3. 剪切流动
IncompressibleFluid场景模拟了剪切流,其特点是流体层之间的相对滑动:
lambda (x, y, z): RIGHT + np.sin(x)*UP
这种流动没有漩涡(旋度为零),但会使初始规则排列的粒子逐渐变形。大气中的喷气气流、河流中不同水层的流动都属于剪切流动。
4. 复杂流动模式
FourSwirlsWithoutCircles场景展示了更复杂的四漩涡系统:
lambda (x, y, z): 0.5*(y**3-9*y)*RIGHT + (x**3-9*x)*UP
这个三次函数创建了四个平衡点,形成类似"双吸引子-双排斥子"的复杂流动模式。运行该场景可以观察粒子如何在多个漩涡之间"跳转",最终稳定在吸引子周围。
高级应用:参数调整与视觉优化
控制流动速度与时长
flow方法的两个关键参数控制动画效果:
- run_time: 实际播放时间(秒)
- virtual_time: 模拟时间长度(物理时间)
# 慢动作展示细节
self.flow(run_time=20, virtual_time=2)
# 快速预览整体效果
self.flow(run_time=5, virtual_time=10)
调整这两个参数的比值可以实现"慢动作"或"快进"效果,帮助观察不同时间尺度下的流动变化。
自定义视觉风格
FluidFlow类提供了丰富的配置选项,可定制向量场的视觉呈现:
CONFIG = {
"vector_spacing": 1, # 向量箭头间距
"dot_spacing": 0.5, # 粒子点间距
"dot_color": BLUE_C, # 粒子颜色
"vector_color": YELLOW, # 向量颜色
"vector_length": 0.5 # 向量箭头长度
}
通过修改这些参数,可以创建从稀疏抽象到密集写实的各种视觉风格,适应不同的展示需求。
项目资源与扩展学习
关键文件速查表
| 文件路径 | 主要内容 | 应用场景 |
|---|---|---|
| _2015/ka_playgrounds/fluid_flow.py | 流体流动核心实现 | 所有流体模拟场景 |
| manim_imports_ext.py | 扩展动画组件 | 高级视觉效果 |
| custom/backdrops.py | 背景样式定义 | 场景美化 |
推荐探索的场景类
- VectorFieldExample:基础向量场与粒子流动
- CurlArticleExample:展示旋度效应的复杂流动
- DropletFlow:高密度粒子模拟,呈现烟雾/水墨效果
- QuadraticField:二次向量场,展示鞍点附近的流动特性
结语:数学与艺术的完美融合
流体模拟不仅是科学研究的工具,也是一种独特的视觉艺术形式。通过_2015/ka_playgrounds/fluid_flow.py中优雅的代码实现,我们得以看见数学公式背后的流动之美。无论是研究流体力学的学生,还是热爱数据可视化的创作者,都能从这个项目中获得启发。
下一步,不妨尝试修改向量场函数,创造属于自己的流体图案。你或许会发现,那些曾经晦涩的数学公式,其实蕴藏着令人惊叹的视觉宝藏。
提示:项目中还有更多隐藏的流体场景等待探索。使用
grep -r "class.*FluidFlow"命令可以发现所有相关实现,开启你的流体可视化之旅吧!
GLM-5智谱 AI 正式发布 GLM-5,旨在应对复杂系统工程和长时域智能体任务。Jinja00
GLM-5-w4a8GLM-5-w4a8基于混合专家架构,专为复杂系统工程与长周期智能体任务设计。支持单/多节点部署,适配Atlas 800T A3,采用w4a8量化技术,结合vLLM推理优化,高效平衡性能与精度,助力智能应用开发Jinja00
jiuwenclawJiuwenClaw 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。Python0159- QQwen3.5-397B-A17BQwen3.5 实现了重大飞跃,整合了多模态学习、架构效率、强化学习规模以及全球可访问性等方面的突破性进展,旨在为开发者和企业赋予前所未有的能力与效率。Jinja00
AtomGit城市坐标计划AtomGit 城市坐标计划开启!让开源有坐标,让城市有星火。致力于与城市合伙人共同构建并长期运营一个健康、活跃的本地开发者生态。01
hotgoHotGo 是一个基于 vue 和 goframe2.0 开发的全栈前后端分离的开发基础平台和移动应用平台,集成jwt鉴权,动态路由,动态菜单,casbin鉴权,消息队列,定时任务等功能,提供多种常用场景文件,让您把更多时间专注在业务开发上。Go02