如何设置最小距离约束以使用numpy.random.rand生成点?

问题描述 投票:8回答:3

我正在尝试生成一个有效的代码,以生成许多随机位置向量,然后使用它们来计算对相关函数。我想知道是否有一种直接的方法来对放置在我的盒子中的任何两个点之间的最小距离设置约束。

我的当前代码如下:

def pointRun(number, dr):
"""
Compute the 3D pair correlation function
for a random distribution of 'number' particles
placed into a 1.0x1.0x1.0 box.
"""
## Create array of distances over which to calculate.   
    r = np.arange(0., 1.0+dr, dr)

## Generate list of arrays to define the positions of all points,
##    and calculate number density.
    a = np.random.rand(number, 3)
    numberDensity = len(a)/1.0**3

## Find reference points within desired region to avoid edge effects. 
    b = [s for s in a if all(s > 0.4) and all(s < 0.6) ]

## Compute pairwise correlation for each reference particle
    dist = scipy.spatial.distance.cdist(a, b, 'euclidean')
    allDists = dist[(dist < np.sqrt(3))]

## Create histogram to generate radial distribution function, (RDF) or R(r)
    Rr, bins = np.histogram(allDists, bins=r, density=False)

## Make empty containers to hold radii and pair density values.
    radii = []
    rhor = []

## Normalize RDF values by distance and shell volume to get pair density.
    for i in range(len(Rr)):
        y = (r[i] + r[i+1])/2.
        radii.append(y)
        x = np.average(Rr[i])/(4./3.*np.pi*(r[i+1]**3 - r[i]**3))
        rhor.append(x)

## Generate normalized pair density function, by total number density
    gr = np.divide(rhor, numberDensity)
    return radii, gr

我以前尝试过使用一个循环,该循环会计算出每个点的所有距离,然后接受或拒绝。如果我使用很多要点,此方法将非常慢。

python numpy random distribution correlation
3个回答
1
投票

据我所知,您正在寻找一种算法来在一个盒子中创建许多随机点,以使没有两个点比某个最小距离更近。如果这是您的问题,那么您可以利用统计物理学的优势,并使用分子动力学软件解决它。此外,您确实需要分子动力学或蒙特卡罗方法才能获得此问题的精确解决方案。

您将N个原子放置在一个矩形框中,在它们之间创建一个固定半径的排斥相互作用(例如移动的Lennard-Jones相互作用),并进行一段时间的模拟(直到您看到这些点均匀分布在整个盒子中) )。根据统计物理学定律,您可以证明,给定约束,即点不能比某个距离更近,这些点的位置将是[[最大随机]]。 如果使用迭代算法(例如,逐一放置点并在它们重叠时拒绝它们),这将不是真的我估计10000点的运行时间为几秒钟,而100k的运行时间为几分钟。我将OpenMM用于所有的分子动力学模拟。


0
投票
这里是使用numpy的可扩展O(n)解决方案。它的工作方式是首先指定一个等距的点网格,然后对点进行一定程度的扰动,使点之间的距离最大为min_dist

您需要调整点数,盒子形状和扰动灵敏度来获得所需的min_dist


0
投票
基于@Samir的答案,为方便起见,使其成为可调用的函数:)
© www.soinside.com 2019 - 2024. All rights reserved.