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
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.
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:
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.
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%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%(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:
theta
= rand (0, 360). 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:
theta
= rand (0, 360). 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.
Tags und Links python geometry numpy random-sample uniform-distribution