2014-12-16 4 views
5

Ich versuche einen effizienten Code zu generieren, um eine Anzahl zufälliger Positionsvektoren zu erzeugen, die ich dann zur Berechnung einer Paarkorrelationsfunktion verwende. Ich frage mich, ob es eine direkte Möglichkeit gibt, eine Beschränkung für den Mindestabstand zwischen zwei beliebigen in meiner Box platzierten Punkten festzulegen.Wie kann ich eine Mindestdistanzbeschränkung für das Generieren von Punkten mit numpy.random.rand festlegen?

Mein Code ist zur Zeit wie folgt:

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 

ich vorher eine Schleife versucht haben, mit, dass für jeden Punkt alle Entfernungen berechnet, wie es gemacht wurde und dann angenommen oder abgelehnt. Diese Methode war sehr langsam, wenn ich viele Punkte verwende.

+1

Möglicherweise können Sie eine Variante von [diesem Algorithmus] (http://stackoverflow.com/questions/6002407/placing-random-circles-without-overlap-and-without-using-brute-force/6002708) verwenden # 6002708), aber die Einschränkung ist, dass es eine minimale Auflösung hat (und je höher es ist, desto teurer ist es). – Rufflewind

Antwort

1

Wie ich verstanden habe, suchen Sie nach einem Algorithmus, um viele zufällige Punkte in einer Box zu erstellen, so dass keine zwei Punkte näher als ein Mindestabstand sind. Wenn das Ihr Problem ist, dann können Sie die statistische Physik ausnutzen und mit molekulardynamischer Software lösen. Darüber hinaus benötigen Sie molekulare Dynamik oder Monte Carlo, um eine exakte Lösung dieses Problems zu erhalten.

Sie platzieren N Atome in einer rechteckigen Box, erstellen eine abstoßende Interaktion mit einem festen Radius zwischen ihnen (wie verschobene Lennard-Jones-Interaktion) und simulieren die Simulation für einige Zeit (bis Sie sehen, dass die Punkte gleichmäßig verteilt sind) die Kiste). Durch Gesetze der statistischen Physik können Sie zeigen, dass die Positionen der Punkte maximal zufällig angesichts der Einschränkung, dass Punkte nicht in der Nähe als einige Entfernung sein können. Dies wäre nicht der Fall sein, wenn Sie iterativen Algorithmus verwenden, wie zum Beispiel Punkte one-by-one platzieren und verwerfen sie, wenn sie

überlappen würde ich eine Laufzeit von mehreren Sekunden für 10000 Punkte abschätzen zu können, und einige Minuten 100k. Ich benutze OpenMM für alle meine Moelcular Dynamics Simulationen.

Verwandte Themen