Metroplis算法下短程相互作用粒子的快速Python实现

计算科学 表现 蒙特卡洛 分子动力学 麻木的 scipy
2021-12-29 18:23:35

任何人都可以编写一个 Python 实现一组粒子根据短程粒子-粒子力在 2D 中相互作用并在 Metropolis 算法下随时间演化,该算法随机选择一个粒子并提出随机空间移动?我可以使用更新与已提议移动的给定单元相关联的所有粒子-粒子相互作用能量的幼稚方法编写这样的实现,但希望看到使用Verlet ListKD Tree的实现,我当粒子数量很大(比如 100-1000)时,希望至少可以快一个数量级。

在我的特定问题中一个额外的复杂性是粒子复制并死亡,但将其合并到 Verlet/KD 树方法中将是次要目标。

谢谢你尽你所能的帮助。

2个回答

Scipy 提供了 KDTree 类的实现:

http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.spatial.KDTree.html

Yu 应该能够将其合并到您的代码中。

我自己从来没有这样做过,我主要做医学博士。不过,你的能量是

E=12iei=12ijiVij

其中第二个总和仅对邻居执行。如果您为每个粒子存储总和 您可以重新计算它以进行 MC 更新。明确地,您计算已移动粒子的能量差。这个想法很容易扩展到粒子去除和添加。iei=jiVij

平均成本为,其中是粒子的平均邻居数。O(Nneigh)Nneigh