机器学习实现物质的相变识别

    机器学习方法具有智能化,自动化分类,辨别的过程。在物理强关联计算方面,由于随着微观粒子的增多,其计算难度呈指数式上升,将机器学习应用在物理方面,可以提高物理的计算效率。

    应用机器学习中的MNIST算法,计算经典Ising模型。

第一步是采用蒙特卡洛算法产生二维Ising模型的格点,其代码为:

import numpy as np
import random
import datetime
from PIL import Image
from PIL import ImageDraw

def init_spin_array(rows, cols):
    return np.ones((rows, cols),dtype=np.uint8)

def find_neighbors(spin_array, lattice, x, y):
    left   = (x, (y - 1)%lattice)
    right  = (x, (y + 1) % lattice)
    top    = ((x - 1)%lattice, y)
    bottom = ((x + 1) % lattice, y)

    return [spin_array[left[0], left[1]],
            spin_array[right[0], right[1]],
            spin_array[top[0], top[1]],
            spin_array[bottom[0], bottom[1]]]


def energy(spin_array, lattice, x ,y):
    return 2 * spin_array[x, y] * sum(find_neighbors(spin_array, lattice, x, y))


def main():
    RELAX_SWEEPS = 4000
    lattice = 28
    sweeps = 1000
    f=open("final_test4","wb+")
    for temperature in np.arange(2.0, 2.7, 0.1):
        spin_array = init_spin_array(lattice, lattice)
        
        for i in range(392):
            random.seed()
            a=random.randint(1,27)
            random.seed()
            b=random.randint(1,27)
            spin_array[a][b]=0

        for sweep in range(sweeps + RELAX_SWEEPS):
            for i in range(lattice):
                for j in range(lattice):
                    e = energy(spin_array, lattice, i, j)
                    if e <= 0:
                        spin_array[i, j] *= 0
                    elif np.exp((-1.0 * e)/temperature) > random.random():
                        spin_array[i, j] *= 0
            if sweep >= RELAX_SWEEPS:
                f.write(spin_array)
            print(sweep)
       print(temperature)       
    f.close()     

main()

这一步代码是产生了从0.1~4.9温度范围的Ising格点,白色的自旋向上的格点,黑色的为自旋向下的格点。

    物理理论计算二维Ising模型的相变温度点为:2.26左右,因此在此范围内取点验证。

。。。。后续待补充。。。。

你可能感兴趣的:(机器学习应用)