这里的目标是构造在布朗动力学下演化的系统的单粒子分布函数;必须从高斯分布中得出一个随机数。为了构造此数量,我正在考虑运行几个模拟,并在每个模拟中的特定时间,保存每个粒子到2D正方形中心的距离,并仅在最后创建所有值的直方图。
我的问题是,在每个模拟过程中,时间都从零开始,并以特定的时间步长进行下去,对于每个时间步,粒子都是随机移动的。因此,必须在相应的时间正确标记要保存的距离。
因此,我的想法是创建一个数组,该数组将在每行中包含5个子数组,每当我要保存粒子到正方形中心的距离时,每个子数组就一个。我正在尝试使用numpy进行此操作,但没有成功。对于每次模拟,在特定的时间,我创建一个具有所有距离的数组,并尝试将numpy.append附加到特定的子数组,但这不能正常工作;据我了解,问题在于我不知道如何正确索引索引(对于所有仿真而言)。
除此之外,我认为该方法不是最佳方法:要么我不得不放弃使用numpy的想法,而是想出如何正确地对两个索引进行数组索引,或者想出一种使用numpy的方法有效。
因此,到目前为止,这里的一般问题是我如何将值添加/追加到数组的特定子数组(预先用numpy构造还是不构造,并视为列表)。
另一种选择是让某人提到一种更有效的方式来创建布朗运动问题的单粒子分布函数,这真的很有帮助。
我要在下面添加相关代码。谢谢大家。
代码:
import random
import math
import matplotlib.pyplot as plt
import numpy as np
# def dump(particles,step,n):
# fileoutput = open('coord.txt', 'a')
# fileoutput.write("ITEM: TIMESTEP \n")
# fileoutput.write("%i \n" % step)
# fileoutput.write("ITEM: NUMBER OF ATOMS \n")
# fileoutput.write("%i \n" % n)
# fileoutput.write("ITEM: BOX BOUNDS \n")
# fileoutput.write("%e %e xlo xhi \n" % (0.0, 100))
# fileoutput.write("%e %e xlo xhi \n" % (0.0, 100))
# fileoutput.write("%e %e xlo xhi \n" % (-0.25, 0.25))
# fileoutput.write("ITEM: ATOMS id type x y z \n")
# i = 0
# while i < n:
# x = particles[i][0]
# y = particles[i][1]
# #fileoutput.write("%i %i %f %f %f \n" % (i, 1, x*1e10, y*1e10, z*1e10))
# fileoutput.write("%i %i %f %f %f \n" % (i, 1, x, y, 0))
# i += 1
# fileoutput.close()
num_sims = 2
N = 49
L = 10
meanz = 0
varz = 1
sigma = 1
# tau = sigma**2*ksi/(kT)
# Starting time
t_0 = 0
# Time increments
dt = 10**(-4) # dt/tau
# Ending time
T = 10**2 # T/tau
# Produce random particles and avoid overlap:
particles = np.full((N, 2), L/2)
times = np.arange(t_0, T, dt)
check = 0
distances = np.empty([50*num_sims, 5])
for sim in range(0, num_sims):
step = 0
t_index = 0
for t in times:
r=[]
for i in range(0,N):
z = np.random.normal(meanz, varz)
particles[i][0] = particles[i][0] + ((2*dt*sigma**2)**(1/2))*z
z = random.gauss(meanz, varz)
particles[i][1] = particles[i][1] + ((2*dt*sigma**2)**(1/2))*z
if (t%(2*(10**5)*dt) == 0):
for j in range (0,N):
rj = ((particles[j][0]-L/2)**2 + (particles[j][1]-L/2)**2)**(1/2)
r.append(rj)
distances[t_index] = np.append(distances[t_index],r)
t_index += 1