如何理解伊辛模型的 wolff 演算法?


佔個坑先,講講我目前的理解,拋個磚等大佬,新人一枚,哪裡寫錯了請使勁拍磚。

寫在前面,這個方法對於有外場的時候不work

目的都是要根據配分函數產生對應的分布嘛。

一般的演算法,比如Metropolis,每次隨機選擇一個自旋來考慮是否翻轉,這樣在遠離相變點的時候,效果還是可以的,但是在相變點附近,Metropolis就不太好用了。簡單概括就是:

每次只翻一個,效率太低。翻很多很多次,也不容易使得兩次的樣本達到,statistically independent。而且我們知道Metropolis存在著一個接受概率的問題,接受概率會小於1。要是始終接受多好啊!

對於伊辛模型來說,Metropolis演算法的話, 格點邊長為 L 時,比如二維伊辛,每次進行 L^2 次翻轉嘗試,autocorrelation time Theta sim L^z ,這裡的 z 叫做dynamic exponent ,對於二維伊辛模型,zapprox2.2 。這樣隨著 L 的增長,每次為了達到statistically independent 所需要的翻轉次數增的極其之快。

那怎麼辦呢,一次翻一大團啊。

具體做法是,先隨機生成一種自旋的初始情況。對於自旋方向相同的邊,以概率 1-e^{-2|J|/T} 連接起來,然後每次隨機選擇一個點,找到這個點所在的(按照前面的連接方式所產生的)Cluster,然後把整個Cluster全部翻轉。然後針對這個新的情況,重複進行上述的事情。

那麼為什麼這樣做是對的呢?我們從配分函數出發能夠證明。

和這個一樣的思想的有一個演算法叫做Swendsen-Wang,兩者的不同點在於,Swendsen-Wang是按概率產生完邊的連接之後,不隨機選點找其中一個Cluster翻轉,而是把所有的Cluster(單個點也算),分別以 frac{1}{2} 的概率翻轉。

Swendsen-Wang的話,記得是 Theta_{int} sim ln(L),二維伊辛模型相變點附近,應該是 Theta_{int} = 0.75+0.85 ln(L) ,這樣相比較而言,隨著 L 的增大,我們所需要的翻轉次數就大大減少

Wolff比起Swendsen-Wang還要好一些,原因是因為其實找一個spin seed來選取其中一個Cluster而Swendsen-Wang是直接考慮全部的Cluster,那麼Wolff演算法中,Cluster比較大的裡面的點就更容易被選到,每次翻轉的自旋就更多。

細節和部分證明,出門浪完了拐回來慢慢補。

--------------------------------------------------------------------------------------------------------------------------

唔,我回來啦補一下細節。

既然一切的一切都只跟相鄰的自旋對有關,那麼我們直接從自旋對(兩自旋之間的鍵)的角度出發來考慮問題。

對於 d 維的伊辛模型,其自旋數目 N=L^d ,因為只考慮最近鄰相互作用  sigma_{ileft( b 
ight)} sigma_{jleft( b 
ight)}b=1,2,3...,N_b 。那麼需要考慮的自旋對兒有 N_b=dN 個,我們叫它鍵好啦。

我們把能量寫作: Eleft( sigma 
ight)=-left| J 
ight|sum_{b=1}^{N_b}left[ sigma_{ileft( b 
ight)} sigma_{jleft( b 
ight)}+1 
ight]=sum_{b=1}^{N_b}E_b

這和我們之前寫的能量有所區別,多了一個常數。我們知道常數是不影響概率分布的,而多寫一個常數的好處我們在後面就會看到。

配分函數因此寫作: Z=sum_{sigma}prod_{b=1}^{N_b}e^{E_b/T}=sum_{sigma}prod_{b=1}^{N_b}left[ 1+left( e^{E_b/T}-1 
ight) 
ight]

我們定義一個關於鍵的函數,相連記為1,否則為0(事實上我們傾向於按照某個概率把自旋方向相同的點連起來,對於自旋相反的邊則直接記0)

F_b(0)=1 ,,,,,,,,,,,,,,,,,,, F_b(1)=e^{E_b/T}-1

不相連 F_bleft( 0 
ight) 在求乘積是不影響結果的。

配分函數因此寫作: Z=sum_{sigma}prod_{b=1}^{N_b}left[ F_bleft( 0 
ight)+F_bleft( 1 
ight) 
ight]

再進一步,對於每個鍵引入一個變數 	au_b=pm1

配分函數的形式更好看了: Z=sum_{sigma}sum_{	au}prod_{b=1}^{N_b} F_bleft( 	au_b 
ight)

再來仔細看一下這個函數:

F_bleft( 0 
ight)=1

F_bleft( 1 
ight)=e^{E_b/T}-1=egin{cases} e^{2left | J 
ight |/T}-1,  sigma_{ileft ( b 
ight )}=sigma_{jleft ( b 
ight )} \ 0,  sigma_{ileft ( b 
ight )}
eq sigma_{jleft ( b 
ight )} end{cases}

會出現等0的情況,對應的是這條邊非法(只有自旋方向相同的邊才有可能被連)

在沒有非法的邊存在時, prod_{b=1}^{N_b} F_bleft( 	au_b 
ight)=left( e^{2left| J 
ight|/T}-1 
ight)^{N_1} ,其中 N_1 為所連的邊的條數。

我們把這個當做權重,來產生對應的 sigma	au 的分布,而權重只和 N_1 有關。我們能看出來,如果我們有種操作,能夠使得在改變自旋的時候,使得邊的情況不變的話,這個權重是不變的。

怎麼辦到這件事呢?

我們知道被連起來的都是自旋方向相同的(反之則不一定),我們把某個被連接起來的Cluster,全部翻轉,得到了新的自旋分布,而考慮鍵的情況,發現不會產生任何矛盾。

等等,我們要做的事情早就變成了,產生一個 pleft( sigma,	au 
ight)的分布。

這是什麼,這是 Gibbs Sampling演算法 啊 !!!!!!!!

我們成功的把問題轉化為了如何進行Gibbs Sampling

簡單回顧一下二維的Gibbs Sampling,產生一個樣本 left( x_1,y_1 
ight) ,保證 x 不變,過程略去不說的生成新樣本 left( x_1,y_2 
ight) ,再保證 y 不變,過程略去不說的生成新樣本 left( x_2,y_2 
ight) ,接著保證 x 不變...

完美的吻合啊,保證 sigma 不變,產生鍵的一個情況;通過翻轉整個Cluster,來產生新的自旋狀態而 	au 不變...

唯一剩下來的小問題,是這兩步分別怎麼進行。

  • 自旋情況固定,產生鍵的分布:

Pleft( 	au 
ight)=prod_{b}P_bleft( 	au_b 
ight) 其中 P_bleft( 	au_b 
ight)=frac{F_bleft( 	au_b 
ight)}{F_bleft( 0 
ight)+F_bleft( 1 
ight)}

可以簡單計算一下數值: Pleft( 	au_b=1 
ight)=egin{cases} 1-e^{-2left | J 
ight |/T},  sigma_{ileft ( b 
ight )}=sigma_{jleft ( b 
ight )} \ 0,  sigma_{ileft ( b 
ight )}
eq sigma_{jleft ( b 
ight )} end{cases}	au_b=0 懶得打了。

  • 鍵的情況不變,產生新的自旋:

我已經知道了,對於整體翻轉Cluster能保證鍵的情況不變,那麼具體如何翻轉呢?有兩種方式:

第一種是,以一個小於1的概率(通常用 frac{1}{2} )去翻轉每一個Cluster。這種方式是Swendsen-Wang演算法

第二種是,隨機選取一個點,以概率1翻轉這個點所在的Cluster。這種方式是Wolff演算法

反正這答案沒什麼人看233

自己瞎寫著玩,熟練一下Latex技巧


推薦閱讀:

TAG:理論物理 | 凝聚態物理 | 相變 |