ZigZag X2X4.py
From Werner KRAUTH
(Difference between revisions)
Revision as of 22:49, 10 June 2024 Werner (Talk | contribs) ← Previous diff |
Revision as of 22:49, 10 June 2024 Werner (Talk | contribs) Next diff → |
||
Line 3: | Line 3: | ||
import matplotlib.pyplot as plt | import matplotlib.pyplot as plt | ||
def u(x): return x ** 2 / 2.0 + x ** 4 / 4.0 | def u(x): return x ** 2 / 2.0 + x ** 4 / 4.0 | ||
- | + | ||
x = 0.0 | x = 0.0 | ||
time_ev = 0.0 | time_ev = 0.0 | ||
sigma = 1 if x <= 0.0 else -1 | sigma = 1 if x <= 0.0 else -1 | ||
- | + | ||
data = [] | data = [] | ||
n_samples = 10 ** 6 | n_samples = 10 ** 6 | ||
Line 19: | Line 19: | ||
time_ev = new_time_ev | time_ev = new_time_ev | ||
sigma *= -1 | sigma *= -1 | ||
- | + | ||
plt.title('Zig-Zag algorithm, anharmonic oscillator') | plt.title('Zig-Zag algorithm, anharmonic oscillator') | ||
plt.xlabel('$x$') | plt.xlabel('$x$') |
Revision as of 22:49, 10 June 2024
import math import random import matplotlib.pyplot as plt def u(x): return x ** 2 / 2.0 + x ** 4 / 4.0 x = 0.0 time_ev = 0.0 sigma = 1 if x <= 0.0 else -1 data = [] n_samples = 10 ** 6 while len(data) < n_samples: delta_u = -math.log(random.random()) new_x = sigma * math.sqrt(-1.0 + math.sqrt(1.0 + 4.0 * delta_u)) new_time_ev = time_ev + abs(new_x - x) for t in range(math.ceil(time_ev), math.floor(new_time_ev) + 1): data.append(x + sigma * (t - time_ev)) x = new_x time_ev = new_time_ev sigma *= -1 plt.title('Zig-Zag 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()