Bounded Lifted Metropolis X2X4.py
From Werner KRAUTH
(Difference between revisions)
| Revision as of 06:40, 11 June 2024 Werner (Talk | contribs) ← Previous diff |
Revision as of 07:05, 11 June 2024 Werner (Talk | contribs) Next diff → |
||
| Line 23: | Line 23: | ||
| data = [] | data = [] | ||
| + | ==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). | ||
| + | |||
| + | ==Python program== | ||
| + | |||
| n_samples = 10 ** 6 | n_samples = 10 ** 6 | ||
| for i in range(n_samples): | for i in range(n_samples): | ||
| Line 28: | Line 33: | ||
| delta_u = u(new_x) - u(x) | delta_u = u(new_x) - u(x) | ||
| delta_u_tilde = u_bound(new_x) - u_bound(x) | delta_u_tilde = u_bound(new_x) - u_bound(x) | ||
| - | fil = math.exp(-delta_u) | ||
| if random.uniform(0.0, 1.0) < min(1.0, math.exp(-delta_u_tilde)): | if random.uniform(0.0, 1.0) < min(1.0, math.exp(-delta_u_tilde)): | ||
| x = new_x | x = new_x | ||
| Line 51: | Line 55: | ||
| plt.legend(loc='upper right') | plt.legend(loc='upper right') | ||
| plt.show() | plt.show() | ||
| + | ==Further information== | ||
| + | ==References== | ||
Revision as of 07:05, 11 June 2024
import math
import random
import matplotlib.pyplot as plt
def u(x):
return x ** 2 / 2.0 + x ** 4 / 4.0
def u_bound(pos):
floor = math.floor(abs(pos))
ceiling = math.ceil(abs(pos))
u_floor = 0
for n in range(floor + 1):
u_floor += n + n ** 3
u_ceiling = u_floor + ceiling + ceiling ** 3
u_pos = u_floor
if floor != abs(pos):
m = (u_ceiling - u_floor) / (ceiling - floor)
u_pos = m * (abs(pos) - floor) + u_floor
return u_pos
x = 0.0
delta = 0.1
sigma = random.choice([-1, 1])
data = []
Contents |
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).
Python program
n_samples = 10 ** 6
for i in range(n_samples):
new_x = x + sigma * random.uniform(0.0, delta)
delta_u = u(new_x) - u(x)
delta_u_tilde = u_bound(new_x) - u_bound(x)
if random.uniform(0.0, 1.0) < min(1.0, math.exp(-delta_u_tilde)):
x = new_x
else:
if random.uniform(0.0, 1.0) > (1.0 - math.exp(-delta_u)) / (1.0 - math.exp(-delta_u_tilde)):
x = new_x
else:
sigma *= -1
data.append(x)
plt.title('Bounded-Lifted Metropolis algorithm, anharmonic oscillator')
plt.xlabel('$x$')
plt.ylabel('$\pi(x)$')
plt.hist(data, bins=100, density=True, label='data')
XValues = []
YValues = []
for i in range(-1000,1000):
x = i / 400.0
XValues.append(x)
YValues.append(math.exp(- u(x)) / 1.93525)
plt.plot(XValues, YValues, label='theory')
plt.legend(loc='upper right')
plt.show()
