首页
/ 流体之美:用Python可视化隐藏在数学公式中的流动奥秘

流体之美:用Python可视化隐藏在数学公式中的流动奥秘

2026-02-05 04:06:08作者:毕习沙Eudora

你是否曾好奇过烟圈如何形成完美的环形?咖啡里的奶泡为何会扩散成复杂图案?这些看似随机的流体运动,其实都遵循着精妙的数学规律。本文将带你探索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类提供了三种关键可视化元素,通过组合这些元素可以创建丰富的流体效果:

  1. 坐标轴(Axes):提供空间参考系
  2. 向量箭头(Vectors):显示速度场方向和大小
  3. 粒子点(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"命令可以发现所有相关实现,开启你的流体可视化之旅吧!

登录后查看全文
热门项目推荐
相关项目推荐