2014-12-16 5 views
5

나는 쌍 상관 함수를 계산하는 데 사용하는 임의의 위치 벡터를 생성하기위한 효율적인 코드를 생성하려고합니다. 내 상자에 두 점 사이에 허용되는 최소 거리에 대한 제약 조건을 설정하는 간단한 방법이 있는지 궁금합니다. 다음과 같이numpy.random.rand를 사용하여 포인트를 생성 할 때 최소 거리 제한을 설정할 수 있습니까?

내 코드 현재 : 나는 이전에이 만들어진 각 지점에 대한 모든 거리를 계산 한 후 승인 또는 거부하는 루프를 사용하여 시도

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 

. 이 방법은 많은 점을 사용하면 매우 느립니다.

+1

[이 알고리즘] (http://stackoverflow.com/questions/6002407/placing-random-circles-without-overlap-and-without-using-brute-force/6002708)의 변형을 사용할 수 있습니다. # 6002708)하지만주의해야 할 점은 최소 해상도가 있다는 것입니다 (높을수록 비용이 많이 듭니다). – Rufflewind

답변

1

내가 알기로, 상자에 임의의 점을 만들어 두 개의 점이 최소 거리보다 더 가깝지 않도록 알고리즘을 찾고 있습니다. 이것이 문제라면 통계 물리학을 활용하고 분자 동역학 소프트웨어를 사용하여 해결할 수 있습니다. 또한,이 문제의 정확한 해답을 얻으려면 분자 역학이나 몬테 카를로가 필요합니다.

사각형 상자에 N 개의 원자를 배치하고 그 사이의 고정 반경 (예 : 이동 된 Lennard-Jones 상호 작용)을 반발시키는 상호 작용을 작성한 다음 일정 시간 동안 시뮬레이션을 실행합니다. 상자). 통계 물리학의 법칙에 따르면 포인트의 위치가 최대 임의의인데 주어진 포인트가 일정 거리 이상이 될 수 없다는 것을 보여줄 수 있습니다. 반복 알고리즘을 사용하면 포인트를 하나씩 배치하고 겹치면 거부하는 등의 경우에는 그렇지 않습니다.

10000 포인트는 몇 초, 100k는 몇 분의 시간이 걸릴 것으로 예상됩니다. 나는 나의 모든 역 동성 시뮬레이션을 위해 OpenMM을 사용한다.