Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
sheet3.py 2.91 KiB
import numpy as np
from scipy.constants import Boltzmann as k_B
import matplotlib.pyplot as plt
from tqdm import tqdm


def verlet(force, x0, p0, m, dt, N):
    assert(x0.shape == p0.shape)

    x = np.zeros((N, *x0.shape))
    p = np.zeros((N, *p0.shape))

    x[0] = x0
    p[0] = p0

    for i in tqdm(range(1, N)):
        p[i] = p[i-1] + 1/2 * force(x[i-1]) * dt
        x[i] = x[i-1] + p[i] / m * dt
        p[i] = p[i] + 1/2 * force(x[i]) * dt

    return x, p

# Problem 3.1
# a)
k = 1 # ?
m = np.full(11, 1) # ?
l = 1 # ?
eps = k * l**2
tau = np.sqrt(m[0] / k)

def force(x):
    f = np.zeros(x.shape)

    f[:-1] += -k * (x[:-1] - x[1:])
    f[1:] += -k * (x[1:] - x[:-1])

    return f

I = np.arange(1, 12)
x0 = l * I
p0 = np.zeros(x0.shape)
p0[0] = 1/2 * np.sqrt(m[0] * eps)
p0[-1] = -p0[0]

dt = 0.1
t = np.arange(0, 300, dt)

# x, p = verlet(force, x0, p0, m, dt, len(t))

# # fig, ax = plt.subplots()

# for i in range(x.shape[1]):
#     plt.plot(t, x[:,i], label=f"Bead {i+1}")

# plt.xlabel(r"$t / \tau$")
# plt.ylabel(r"$x / l$")
# plt.legend()
# plt.show()

# # E = np.sum(p**2 / (2 * m), axis=1) + 1/2 * k * np.sum((x[:,1:] - x[:,:-1])**2, axis=1)
# # K = np.sum(p**2 / (2 * m), axis=1)

# # plt.plot(t, K)
# # plt.show()

# # b)
# for N in (2, 3, 11, 100):
#     m = np.full(N, 1)
#     I = np.arange(1, N+1)
#     x0 = l * I
#     p0 = np.zeros(x0.shape)
#     p0[0] = 1/2 * np.sqrt(m[0] * eps)
#     p0[-1] = -p0[0]

#     x, p = verlet(force, x0, p0, m, dt, len(t))
#     K = np.sum(p**2 / (2 * m), axis=1)
#     K_l = np.average(K)
#     T = 2 * K_l / N

#     print(f"<K> = {K_l}")
#     print(f"k_B T = {T}")

# # c)
# for N in (2, 3, 11, 100):
#     for i in range(3):
#         m = np.full(N, 1)
#         I = np.arange(1, N+1)
#         x0 = l * I
#         p0 = np.random.normal(0, np.sqrt(m[0] * eps), N)

#         x, p = verlet(force, x0, p0, m, dt, len(t))
#         R_l = np.abs(x[:,0] - x[:,-1])

#         print(f"N = {N}, i = {i}: R_l = {np.average(R_l)}")

#         plt.plot(t, R_l)
#         plt.xlabel(r"$t / \tau$")
#         plt.ylabel(r"$\overline{R_l} / l$")
#         plt.show()

# d)
def d(x1, p1, x2, p2):
    return np.sqrt(1 / (6 * x1.shape[0]) * np.sum(k * (x1 - x2)**2 + (p1 - p2)**2 / m))
dt = 0.1
t = np.arange(0, 1*10e3, dt)

N_vals = [10,20]
for N in N_vals:
    m = np.full(N, 1)
    I = np.arange(1, N+1)
    x0 = l * I
    # p0 = np.random.normal(0, np.sqrt(m[0] * eps), N)
    p0 = np.zeros(x0.shape)
    p0[0] = 1/2 * np.sqrt(m[0] * eps)
    p0[-1] = -p0[0]

    x, p = verlet(force, x0, p0, m, dt, len(t))

    ts = t[int(10 / dt):] 
    ds = np.zeros(ts.shape)
    for i in tqdm(range(len(ds))):
        ds[i] = d(x[int(10 / dt) + i], p[int(10 / dt) + i], x[int(10 / dt)], p[int(10 / dt)])

    print(f"N = {N}: d_min = {np.min(ds)}")

    plt.figure(figsize=(48, 6))
    plt.xlabel(r"$t / \tau$")
    plt.ylabel(r"$d / \sqrt{k l^2}$")
    plt.plot(ts, ds)
    # plt.tight_layout()
    plt.savefig(f'4c_N={N}.png')