基于FHP模型的六边形元胞自动机单粒子运动模拟器
项目介绍
本项目是一款在MATLAB环境下开发的元胞自动机仿真系统,核心基于流体力学经典的FHP(Frisch-Hasslacher-Pomeau)规则。程序通过构建离散的六边形格点网格,精确模拟单个粒子在各向同性拓扑结构中的运动轨迹。与传统的四边形网格不同,该系统利用六边形网格定义的六个运动方向,能够更真实地反映物理世界中的对称性和流动特性。
功能特性
- 六边形各向同性模拟:实现了具备6位对称性的运动模型,粒子可沿0°、60°、120°、180°、240°及300°六个方向演化。
- 双重边界条件支持:内置周期性边界(实现网格环绕)和固壁反射边界(实现反弹动力学)。
- 实时动画渲染:动态展示粒子在六边形背景网格上的运动轨迹,支持实时路径绘制。
- 多维度运动分析:自动生成运动统计图表,包括行列坐标的时序变化以及运动方向的相位演变。
- 偏置坐标系算法:采用高效的偏移坐标映射逻辑,完美解决六边形在平面笛卡尔坐标系中的显示问题。
使用方法
- 在MATLAB中打开脚本文件。
- 直接运行程序,系统将自动初始化参数。
- 观察弹出的“FHP六边形元胞自动机单粒子运动模拟”窗口查看动态过程。
- 仿真结束后,在“粒子运动分析”窗口查看详细的坐标与方向统计数据。
- 如需修改参数(如网格大小、初始位置、边界类型等),可直接编辑脚本顶部的参数设置区。
系统要求
- MATLAB R2016a 或更高版本
- 具备基础绘图与图形句柄操作支持
实现逻辑详述
1. 网格与坐标系统
系统采用“Pointy Topped”布局的六边形网格。为了在计算机内存(矩阵)中表达这种结构,使用了单元格偏移坐标系(Offset Coordinates)。
- 坐标转换:通过自定义匿名函数将矩阵索引(r, c)映射为笛卡尔坐标(x, y)。公式中引入了mod(r, 2) * 0.5来实现奇数行的水平偏移,并利用sqrt(3)/2作为行间距因子。
2. 核心演化算法
每一时间步的位移逻辑取决于两个关键因素:当前所在行的奇偶性以及当前的运动方向索引(0-5)。由于六边形网格的紧密堆积特性,奇数行和偶数行的相邻节点偏移量在代码中通过不同的位移向量数组进行了区分处理。
- 运动执行:根据当前方向,读取对应的移位向量更新下一时刻的行列索引。
3. 边界条件处理逻辑
- 周期边界:采用取模(mod)运算,使粒子在越过边界时能从对侧网格重新进入。
- 固壁反射:当检测到下一位置超出边界时,触发FHP模型的反弹规则,粒子运动方向增加3个单位(即旋转180°实现动量反转),并在本步保持原位停顿或转向。
4. 可视化技术实现
- 背景绘制:使用fill函数配合三角函数预定义的六边形顶点坐标,循环绘制出整个离散背景。
- 动态更新:通过scatter对象实时更新粒子位置,利用plot对象动态增长运动路径。使用drawnow命令强制更新图形窗口实现平滑动画。
5. 运动分析数据结构
- 数据采集:通过结构体数组记录每一时间步的步数、坐标及方向索引。
- 统计输出:在仿真末尾,通过stairs函数绘制离散的方向相位图,并使用subplot对比展示行坐标与列坐标的时序变化曲线。
关键函数与算法细节分析
- 偏移量转换逻辑:代码通过逻辑判断
if mod(r, 2) == 1 实现了六边形网格在二维数组中的正确映射,这是处理非正交网格拓扑的核心算法。 - 各向同性方向向量:预定义的六个位移向量对应了FHP模型的六个基本速度方向。
- 各向同性绘图:使用了
hexX 和 hexY 数组配合余弦和正弦函数(pi/3步长),确保了渲染出的每一个元胞都是标准的正六边形。 - 反弹策略:
mod(currentDir + 3, 6) 体现了流体力学元胞自动机中典型的全反射碰撞处理方式。