Metropolis X2X4.py

From Werner KRAUTH

Revision as of 22:25, 10 June 2024; view current revision
←Older revision | Newer revision→
Jump to: navigation, search


import math
import random
import matplotlib.pyplot as plt
def u(x):
    return x ** 2 / 2.0 + x ** 4 / 4.0

x = 0.0
delta = 0.1

data = []
n_samples = 10 ** 6
for i in range(n_samples):
    new_x = x + random.uniform(-delta, delta)
    delta_u = u(new_x) - u(x)
    if random.random() < math.exp(-delta_u): x = new_x
    data.append(x)

plt.title('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()
Personal tools