Ising coupling.py

From Werner KRAUTH

(Difference between revisions)
Jump to: navigation, search
Revision as of 22:13, 12 June 2024
Werner (Talk | contribs)

← Previous diff
Revision as of 20:41, 18 July 2024
Werner (Talk | contribs)

Next diff →
Line 1: Line 1:
==Context== ==Context==
This page is part of my [[BegRohu_Lectures_2024|2024 Beg Rohu Lectures]] on "The second Markov chain revolution" at the [https://www.ipht.fr/Meetings/BegRohu2024/index.html Summer School] "Concepts and Methods of Statistical Physics" (3 - 15 June 2024). This page is part of my [[BegRohu_Lectures_2024|2024 Beg Rohu Lectures]] on "The second Markov chain revolution" at the [https://www.ipht.fr/Meetings/BegRohu2024/index.html Summer School] "Concepts and Methods of Statistical Physics" (3 - 15 June 2024).
 +
 +The present program illustrates the coupling and the phenomenon of monotone coupling in Markov-chain sampling in the example of the two-dimensional Ising model on an LxL square lattice with periodic boundary conditions. We start, at time t=0 with two configurations, one called SLow (all spins equal to -1) and another one, called SHigh (all spins equal to +1), and runs the same Markov chain on both of them until they resulting configurations coincide.
==Python program== ==Python program==

Revision as of 20:41, 18 July 2024

Context

This page is part of my 2024 Beg Rohu Lectures on "The second Markov chain revolution" at the Summer School "Concepts and Methods of Statistical Physics" (3 - 15 June 2024).

The present program illustrates the coupling and the phenomenon of monotone coupling in Markov-chain sampling in the example of the two-dimensional Ising model on an LxL square lattice with periodic boundary conditions. We start, at time t=0 with two configurations, one called SLow (all spins equal to -1) and another one, called SHigh (all spins equal to +1), and runs the same Markov chain on both of them until they resulting configurations coincide.

Python program

import math
import random
 
L = 64; N = L * L
nbr = {i : ((i // L) * L + (i + 1) % L, (i + L) % N,
             (i // L) * L + (i - 1) % L, (i - L) % N) \
                                    for i in range(N)}
beta = 0.4  #  beta = 0.4407 is critical temperature
SLow = [-1 for site in range(N)]
SHigh = [1 for site in range(N)]
iter = 0
while True:
    iter += 1
    k = random.randint(0, N - 1)
    Upsilon = random.uniform(0.0, 1.0)
    hLow = sum(SLow[nn] for nn in nbr[k])
    hHigh = sum(SHigh[nn] for nn in nbr[k])
    SLow[k] = -1
    if Upsilon < 1.0 / (1.0 + math.exp(-2.0 * beta * hLow)):
        SLow[k] = 1
    SHigh[k] = -1
    if Upsilon < 1.0 / (1.0 + math.exp(-2.0 * beta * hHigh)):
        SHigh[k] = 1
    if SHigh == SLow:
        print(iter / N)
        print(SLow, SHigh)
        break
Personal tools