From Werner KRAUTH
Revision as of 22:42, 10 June 2024;
view current revision←Older revision |
Newer revision→
import math
import random
import matplotlib.pyplot as plt
def u(x): return x ** 2 / 2.0 + x ** 4 / 4.0
def u2(pos): return 0.5 * pos ** 2
def u4(pos): return 0.25 * pos ** 4
x = 0.0
delta = 0.1
data = []
n_samples = 10 ** 7
for i in range(n_samples):
new_x = x + random.uniform(-delta, delta)
delta_u2 = u2(new_x) - u2(x)
delta_u4 = u4(new_x) - u4(x)
if random.random() < min(1.0, math.exp(-delta_u2)) \
* min(1.0, math.exp(-delta_u4)): x = new_x
data.append(x)
plt.title('Factorized 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()