mirror of
https://gitlab.com/pimnelissen/entropic-spring.git
synced 2025-11-30 19:33:07 +01:00
minimal code for part 1.
This commit is contained in:
11
Link.py
Normal file
11
Link.py
Normal 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
35
RubberBand.py
Normal 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
23
main.py
Normal 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()
|
||||||
Reference in New Issue
Block a user