Markov ising.py
From Werner KRAUTH
(Difference between revisions)
| Revision as of 21:51, 22 September 2015 Werner (Talk | contribs) ← Previous diff |
Revision as of 22:24, 4 March 2024 Werner (Talk | contribs) (→Program) Next diff → |
||
| Line 5: | Line 5: | ||
| =Program= | =Program= | ||
| + | import random, math | ||
| - | + | L = 6 | |
| - | + | ||
| - | + | ||
| - | import random, math | + | |
| - | + | ||
| - | L = 16 | + | |
| N = L * L | N = L * L | ||
| nbr = {i : ((i // L) * L + (i + 1) % L, (i + L) % N, | nbr = {i : ((i // L) * L + (i + 1) % L, (i + L) % N, | ||
| (i // L) * L + (i - 1) % L, (i - L) % N) \ | (i // L) * L + (i - 1) % L, (i - L) % N) \ | ||
| for i in range(N)} | for i in range(N)} | ||
| - | nsteps = 1000000 | + | nsteps = 10000000 |
| - | T = 2.0 | + | T = 1.0 |
| beta = 1.0 / T | beta = 1.0 / T | ||
| S = [random.choice([1, -1]) for k in range(N)] | S = [random.choice([1, -1]) for k in range(N)] | ||
| + | E = -0.5 * sum(S[k] * sum(S[nn] for nn in nbr[k]) \ | ||
| + | for k in range(N)) | ||
| + | E_tot, E2_tot = 0.0, 0.0 | ||
| for step in range(nsteps): | for step in range(nsteps): | ||
| k = random.randint(0, N - 1) | k = random.randint(0, N - 1) | ||
| - | delta_E = 2.0 * S[k] * sum(S[nn] for nn in nbr[k]) | + | h = sum(S[nn] for nn in nbr[k]) |
| + | Sk_old = S[k] | ||
| + | delta_E = 2.0 * S[k] * h | ||
| if random.uniform(0.0, 1.0) < math.exp(-beta * delta_E): | if random.uniform(0.0, 1.0) < math.exp(-beta * delta_E): | ||
| S[k] *= -1 | S[k] *= -1 | ||
| - | print S, sum(S) | + | E -= 2.0 * h * S[k] |
| + | E_tot += E | ||
| + | E2_tot += E ** 2 | ||
| + | E_av = E_tot / float(nsteps) | ||
| + | E2_av = E2_tot / float(nsteps) | ||
| + | c_V = beta ** 2 * (E2_av - E_av ** 2) / float(N) | ||
| + | print(E_av / N,c_V) | ||
| =Version= | =Version= | ||
Revision as of 22:24, 4 March 2024
This page presents the program markov_ising.py, a Markov-chain algorithm for the Ising model on an LXL square lattice in two dimensions.
Contents |
Description
Program
import random, math
L = 6
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)}
nsteps = 10000000
T = 1.0
beta = 1.0 / T
S = [random.choice([1, -1]) for k in range(N)]
E = -0.5 * sum(S[k] * sum(S[nn] for nn in nbr[k]) \
for k in range(N))
E_tot, E2_tot = 0.0, 0.0
for step in range(nsteps):
k = random.randint(0, N - 1)
h = sum(S[nn] for nn in nbr[k])
Sk_old = S[k]
delta_E = 2.0 * S[k] * h
if random.uniform(0.0, 1.0) < math.exp(-beta * delta_E):
S[k] *= -1
E -= 2.0 * h * S[k]
E_tot += E
E2_tot += E ** 2
E_av = E_tot / float(nsteps)
E2_av = E2_tot / float(nsteps)
c_V = beta ** 2 * (E2_av - E_av ** 2) / float(N)
print(E_av / N,c_V)
Version
See history for version information.
