随着计算机技术的发展,一种可以模拟随机变量与随机过程的方法——蒙特卡洛算法应运而生。与解析解或者近似解相比,Monte Carlo(MC)算法无需复杂的数学推导,实现起来也较为简单。
蒙特卡洛法其实是比较宽泛的一系列算法的统称,它的特点是假设概率分布已知,通过重复的随机采样来获得数值结果。比如根据大数定理,我们可以用采样得到的样本计算得到的样本均值来估计总体期望。又比如,积分的运算往往可以表示为随机变量在一个概率密度函数分布上的期望。
针对Ising模型,往往采用为马尔可夫链蒙特卡洛算法(MCMC)。此种方法具体为随机变量 x 的状态空间 S 上定义一个满足遍历定理的马尔科夫链 X = X1, X2, X3… ,使其平稳分布就是抽样的目标分布 p(x)。然后在这个马尔科夫链上进行随机游走,每个时刻得到一个样本。根据遍历定理,当时间趋向于无穷时,样本的分布趋近于平稳分布,样本的函数均值趋近函数的数学期望。关键就是设计这样一个马尔科夫链。
对于Ising模型,我们每一次随机选取一个格点,计算发生反转前后的能量差,如果能量降低,则使其翻转,如果能量升高,则依概率(\(P = \exp^(-\beta \Delta E)\))翻转。我们可以证明,按照此概率进行演进,系统达到平衡后的状态按照玻尔兹曼函数依能量分布,此过程也符合可逆过程的时间反演对称,即细致平衡原理。
我们可以通过简单的python代码实现用MCMC算法模拟Ising模型中,格点随温度、外加磁场的变化、并且做出相图。
以上蒙特卡洛算法是一种对离散问题的有效解决方案。但是物理上许多常见的相变问题,需采用连续介质假设。否则相对于模拟,问题本身的尺度过大,计算量过于庞大。相场模型(或者time-dependent Ginzburg-Landau模型)是解决连续介质假设下相变问题的有效途径。而该方程的阶数较高,数值实现起来需要一定的技巧。目前常见的方法是FFT-FDM,以及FEM。这将在下一讲中进行简要介绍。
扩展阅读
python skilearn的monte-carlo实现求定积分的库:
https://scikit-monaco.readthedocs.io/en/latest/
一种简单的马尔可夫链——随机行走
https://en.wikipedia.org/wiki/Random_walk
蒙特卡罗方法与机器学习的一个例子: