Generieren Sie eine zufällige Stichprobe von Punkten, die auf der Oberfläche einer Einheitskugel verteilt sind

8

Ich versuche, zufällige Punkte auf der Oberfläche der Kugel mit numpy zu erzeugen. Ich habe den Beitrag, in dem hier erläutert wird, überprüft. Allerdings brauchen Ideen, wie die Punkte nur auf der Oberfläche der Kugel erzeugt werden. Ich habe Koordinaten (x, y, z) und den Radius jeder dieser Kugeln.

Ich bin auf dieser Ebene mit Mathematik nicht sehr vertraut und versuche, die Monte-Carlo-Simulation zu verstehen.

Jede Hilfe wird sehr geschätzt.

Danke, Parin

    
Parin 28.11.2015, 22:01
quelle

5 Antworten

19

Basierend auf dem letzten Ansatz auf dieser Seite können Sie einfach einen Vektor generieren, der aus unabhängigen Stichproben aus drei Standardnormalen besteht Verteilungen, dann normiere den Vektor so, dass seine Größe 1 ist:

%Vor%

Zum Beispiel:

%Vor%

Die gleiche Methode verallgemeinert auch die Auswahl gleichmäßig verteilter Punkte auf dem Einheitskreis ( ndim=2 ) oder auf den Oberflächen von höherdimensionalen Einheitenhypersphären.

    
ali_m 28.11.2015 23:11
quelle
7

Punkte auf der Oberfläche einer Kugel können mit zwei sphärischen Koordinaten, theta und phi , mit 0 < theta < 2pi und 0 < phi < pi ausgedrückt werden.

Umrechnungsformel in kartesische x, y, z -Koordinaten:

%Vor%

wobei r der Radius der Kugel ist.

So könnte das Programm theta und phi in ihren Bereichen bei gleichmäßiger Verteilung zufällig abfragen und die kartesischen Koordinaten daraus erzeugen.

Aber dann werden die Punkte dichter auf die Pole der Kugel verteilt. Damit Punkte gleichmäßig auf der Kugeloberfläche verteilt werden, muss phi als phi = acos(a) gewählt werden, wobei -1 < a < 1 in einer gleichmäßigen Verteilung gewählt wird.

Für den Numpy-Code wäre dies der gleiche wie in Sampling gleichmäßig verteilter zufälliger Punkte in einem sphärischen Volumen , außer dass die Variable radius einen festen Wert hat.

    
tmlen 28.11.2015 22:18
quelle
3

Nach einigen Diskussionen mit @Soonts wurde ich neugierig auf die Leistung der drei Ansätze, die in den Antworten verwendet wurden: eine mit zufälligen Winkeln, eine mit normal verteilten Koordinaten und eine mit gleichmäßig verteilten Punkten.

Hier ist mein Vergleich:

%Vor%

Dann für 1000 Punkte

%Vor%

Beachten Sie, dass ich in der ablehnungsbasierten Implementierung zuerst npoints samples generiert und die schlechten entsorgt habe, und ich habe nur eine Schleife verwendet, um den Rest der Punkte zu generieren. Es scheint so zu sein, dass die direkte Schritt-für-Schritt-Ablehnung länger dauert. Ich habe auch die Prüfung auf Division durch Null entfernt, um einen saubereren Vergleich mit dem Fall sample_normals zu erhalten.

Wenn Sie die Vektorisierung von den beiden direkten Methoden entfernen, befinden Sie sich im selben Umfeld:

%Vor% %Vor%     
Andras Deak 29.11.2015 14:59
quelle
2

Eine andere Möglichkeit, die abhängig von der Hardware viel schneller sein könnte.

Wählen Sie a, b, c als drei Zufallszahlen zwischen -1 und 1

Berechne r2 = a^2 + b^2 + c^2

Wenn r2 & gt; 1.0 (= der Punkt ist nicht in der Sphäre) oder r2 & lt; 0.00001 (= der Punkt ist zu nah an der Mitte, wir haben Division durch Null während der Projektion auf die Oberfläche der Kugel) Sie verwerfen die Werte, und wählen Sie eine andere Gruppe von zufälligen a, b, c

Ansonsten haben Sie Ihren zufälligen Punkt (relativ zum Mittelpunkt der Kugel):

%Vor%     
Soonts 28.11.2015 22:32
quelle
0

(bearbeitet, um Korrekturen von Kommentaren widerzuspiegeln)

Ich habe 2004 einige konstante Zeit Ansätze zu diesem Problem untersucht.

unter der Annahme, dass Sie in sphärischen Koordinaten arbeiten, wobei theta der Winkel um die vertikale Achse (zB Länge) und phi der vom Äquator (zB Breitengrad) hochgezogene Winkel ist, Um dann eine gleichmäßige Verteilung von zufälligen Punkten auf der Hemisphäre nördlich des Äquators zu erhalten, tun Sie dies:

  1. Wählen Sie theta = rand (0, 360).
  2. wähle phi = 90 * (1 - sqrt (rand (0, 1))).

um Punkte auf einer Kugel statt auf einer Halbkugel zu erhalten, negieren Sie einfach phi 50% der Zeit.

Für die Neugierigen gilt ein ähnlicher Ansatz, um gleichmäßig verteilte Punkte auf einer Einheitsscheibe zu erzeugen:

  1. Wählen Sie theta = rand (0, 360).
  2. Wählen Sie radius = sqrt (rand (0, 1)).

Ich habe keine Beweise für die Richtigkeit dieser Ansätze, aber ich habe sie in den letzten zehn Jahren mit viel Erfolg benutzt und bin von ihrer Richtigkeit überzeugt.

Eine Illustration (von 2004) der verschiedenen Ansätze ist hier , einschließlich einer Visualisierung des Ansatzes, Punkte auf der Oberfläche eines Würfels zu wählen und auf die Kugel zu normieren.

    
orion elenzil 01.12.2015 07:10
quelle