蒙特卡洛方法模擬居里溫度:python 與 julia 迴圈效率對比

julia迴圈速度比python快很多,這裡用Monte Carlo求Pi以及Ising模型MC做個例子對比。

為了對比,程式碼寫成幾乎相同的邏輯

原理

利用面積比值來確定圓周率pi。

我們如果在面積為a*a的區間隨機撒大量的點(假設為N),落在右圖中 1/4圓的面積內的個數n 與 落在整個區域的個數N基本滿足:

蒙特卡洛方法模擬居里溫度:python 與 julia 迴圈效率對比

蒙特卡洛方法模擬居里溫度:python 與 julia 迴圈效率對比

python

import numpy as npimport time as tmimport random as rdt0=tm。time()N=10000000nc=0for i in range(N): x=rd。random() y=rd。random() if np。hypot(x,y) < 1: nc=nc+1pi_c = nc/N*4t1=tm。time()t=t1-t0print(pi_c,t)

結果

蒙特卡洛方法模擬居里溫度:python 與 julia 迴圈效率對比

julia

t0=time()N=10000000nc=0for i in 1:N x=rand() y=rand() if hypot(x,y)<1 nc=nc+1 endendt1=time()t=t1-t0println(nc/N*4,“\t”,t)

結果

蒙特卡洛方法模擬居里溫度:python 與 julia 迴圈效率對比

Ising 模型的MC

python

import numpy as npimport matplotlib。pyplot as pltimport time as tmmev=1。6e-22kB=1。38e-23j=2J=j*mev/kBN=30mcna =100000mcnb =200000#square_latticedef neb(n,x,y): l = x-1 r = x+1 u = y+1 d = y-1 if x == 0: l = n-1 if x==n-1: r = 0 if y == 0: d = n-1 if y==n-1: u = 0 return [(r,y),(l,y),(x,u),(x,d)]def dE(N,S,x,y,J): de = 0 for i,j in neb(N,x,y): de = de + 2* J* S[x,y] * S[i,j] return de def MCa(T,N): S = np。ones((N,N),dtype=int) for i in range(mcna): x = np。random。randint(0,N) y = np。random。randint(0,N) de = dE(N,S,x,y,J) if de<0: S[x,y] = -S[x,y] elif np。random。rand()

執行時間73。4秒

蒙特卡洛方法模擬居里溫度:python 與 julia 迴圈效率對比

julia

t0=time()mev=1。6e-22kB=1。38e-23j=2J=j*mev/kBN=30mcna =100000mcnb =200000#square_latticefunction neb(n,x,y) l = x-1 r = x+1 u = y+1 d = y-1 if x == 1 l = n end if x==n r = 1 end if y == 1 d = n end if y==n u = 1 end return [(r,y),(l,y),(x,u),(x,d)]endfunction dE(N,S,x,y,J) de = 0 for (i,j) in neb(N,x,y) de = de + 2 * J* S[x,y] * S[i,j] end return deendfunction MCa(T,N) S = ones(N,N) for i in 1:mcna x = rand(1:N) y = rand(1:N) de = dE(N,S,x,y,J) r=rand() if de<0 S[x,y] = -S[x,y] elseif r < exp(-de/T) S[x,y] = -S[x,y] else S[x,y] = S[x,y] end end return Sendfunction MCb(T,N) AvM=0 S = ones(N,N) for i in 1:mcnb x = rand(1:N) y = rand(1:N) de = dE(N,S,x,y,J) r=rand() if de<0 S[x,y] = -S[x,y] elseif r < exp(-de/T) S[x,y] = -S[x,y] end m = sum(S)/(N*N) AvM = AvM + abs(m) end AvM=AvM/mcnb return AvM, Sendt0=time()tnum = 16T=LinRange(80,20,tnum)mm=[]for i in 1:tnum if i==0 S = MCa(T[i],N) end m,S = MCb(T[i],N) append!(mm,m)endt1=time()t=t1-t0println(t)using PyPlotgrid(“on”)plot(T,mm)

蒙特卡洛方法模擬居里溫度:python 與 julia 迴圈效率對比

執行時間1。59秒