minimal code for part 1.

This commit is contained in:
Pim Nelissen
2025-10-17 19:29:12 +02:00
parent 4c788b746e
commit 6a38ca47ce
3 changed files with 69 additions and 0 deletions

11
Link.py Normal file
View File

@ -0,0 +1,11 @@
class Link:
def __init__(self, direction):
"""
An incompressible link of fixed length a and either a positive or
negative direction.
Parameters:
direction (int) The direction. Must be 1 or -1.
"""
self.direction = direction

35
RubberBand.py Normal file
View File

@ -0,0 +1,35 @@
import numpy as np
from Link import Link
class RubberBand:
def __init__(self, N, a=1.):
"""
RubberBand is a class that can simulate a rubber band with N
incompressible links of length a.
Parameters:
N (int) The number of links.
a (float) The fixed length of links.
"""
self.N = N
self.a = a
self.links = self.__sample_links()
@property
def length(self):
return self.a * np.sum([l.direction for l in self.links])
def __sample_links(self):
"""
Sample N Link objects with a random direction.
"""
samples = np.random.random_sample((self.N,))
directions = np.ones(samples.shape)
directions[samples < 0.5] = -1.
directions = directions.astype(int)
return [Link(d) for d in directions]

23
main.py Normal file
View File

@ -0,0 +1,23 @@
import numpy as np
import scipy as scp
from matplotlib import pyplot as plt
from RubberBand import RubberBand
NUM_BANDS = int(1E5)
N = 100
length_dist = np.zeros((NUM_BANDS,))
for i in range(NUM_BANDS):
band = RubberBand(N, a=1)
length_dist[i] = band.length/band.a
P_true = lambda N, L: scp.special.binom(N, (L+N)/2) / 2**N
L_norm = np.linspace(-N, N, 100) # normalised (no Link length a) range
plt.plot(L_norm, P_true(N, L_norm))
plt.hist(length_dist, range=(-N, N), bins=N, density=True)
plt.xlabel("$L/a$")
plt.ylabel("P($L/a$)")
plt.show()