2013-02-11 12 views
15

Sto cercando di disperdere n punti su una sfera tale che ogni punto abbia la "stessa" area "attorno" ad essa. Fondamentalmente, sto cercando di integrare una funzione su una sfera valutando in n punti e assumendo che ogni elemento di area sia lo stesso (e uguale a 4pi r^2/n).Dispersione n punti uniformemente su una sfera

La mia domanda è molto correlata a this one, ma non riesco a concordare sul fatto che il codice presentato nella risposta "accettata" funzioni come desiderato (vedi foto allegata, generata scegliendo R = 1000, nx = ny = 40). Chiaramente, i miei punti sono molto più concentrati ai poli e molto poco concentrati lungo l'equatore.

Qualche suggerimento?

EDIT: Per avere un riferimento, ho trovato some software che genera una maglia in modo tale che ogni punto ha uguali "area" intorno ad esso (scorrere verso il basso per vedere l'area distribuzione uniforme su una sfera), ma invece di attuare il loro codice che ho è andato avanti con un approccio che richiede meno tempo: ho semplicemente ripetuto gli angoli azimutali e polari ([0,2pi] e [0, pi]) e calcolato l'area "infinitesimale" di ogni patch (da = r^2 sin theta dtheta dphi). Questo è fondamentalmente tutto ciò di cui ho bisogno per l'integrazione sulla sfera, speravo solo che la distribuzione dell'area uniforme non sarebbe stata così difficile da implementare.

+0

check this out !! http://eqsp.sourceforge.net/ – wim

+0

La soluzione nella risposta accettata in questa domanda non è molto buona. Poiché ciò è per un'integrazione, i punti di raccolta distribuiti uniformemente sulla sfera dovrebbero essere abbastanza buoni. Non guadagni molto minimizzando la distanza tra i punti. – Joni

+0

@alexvas questa è la soluzione di mia http://stackoverflow.com/q/25012737/2521214 Penso che sia un po 'meglio (ma anche non esattamente precisi +/- int errori roundig tra fette) e qui http: // StackOverflow. COM/a/25082674/2521214 è ancora meglio codice per voi (con le trasformazioni inverse) – Spektre

risposta

5

Ecco un algoritmo di esempio che ho appena frustato in pitone:

from numpy import random, cos, sin, sqrt, pi 
from mpl_toolkits.mplot3d import Axes3D 
import matplotlib.pyplot as plt 

def rand_sphere(n): 
    """n points distributed evenly on the surface of a unit sphere""" 
    z = 2 * random.rand(n) - 1 # uniform in -1, 1 
    t = 2 * pi * random.rand(n) # uniform in 0, 2*pi 
    x = sqrt(1 - z**2) * cos(t) 
    y = sqrt(1 - z**2) * sin(t) 
    return x, y, z 

x, y, z = rand_sphere(200) 
fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
ax.scatter(x, y, z) 
plt.show() 

enter image description here

Ancora con 10000 punti: informazioni

enter image description here

+1

Right: utilizza una distribuzione casuale di punti. Speravo in un algoritmo di distribuzione strutturato. Questo (principalmente) funziona per questo scopo, statisticamente parlando, ma esiste un modo per garantire una distribuzione uniforme? – alexvas

+0

Oh, penso di aver frainteso la tua domanda. Li vuoi distribuiti uniformemente come in una piastrellatura, ad esempio qualcosa come un punto al centro di ogni patch su una palla da calcio? L'intuizione mi dice che questo sarà impossibile tranne che per alcuni valori specifici di n. – wim

+0

Sì, speravo che fosse possibile qualcosa del genere. Le tessere non devono essere tutte della stessa forma, solo (principalmente) la stessa area. Ma poi, la randomizzazione fa un lavoro abbastanza decente con quello se n è abbastanza alto ... Forse la tua soluzione è la migliore dopo tutto. – alexvas

8

Background:

ci sono 4 p io steradiano in una sfera, sono i "gradi" totali in una sfera, ma io uso il termine solo in senso relativo perché gli steradiani sono molto diversi dai radianti regolari in un cerchio, perché uno, sono tridimensionali e quindi sono solidi. Considerali come angoli di gelato in una sfera. enter image description here

http://en.wikipedia.org/wiki/Steradian fornisce un grande esempio di loro.

Hanno una relazione diretta con il raggio, come i radianti in un cerchio. 1 steradian = 1 unità di raggio al quadrato.

Quindi, prima di tutto scoprire quanti oggetti devono essere tracciati sulla sfera. Lascia che questo numero sia n. sr = steradianti (unità di misura) = r^2 (raggio quadrato)

4 pi/n sr = x

x è quante steradianti allocati a ciascun punto.

diciamo per 4 punti.

4 pi/4 sr = x

pi sr = x Quindi ogni punto otterrà uno spazio allocato di pi sr.

Considerare ora questo ...dal momento che stai tracciando dei punti, considereremo che ogni punto sarà posto nel mezzo dello spazio assegnato ... cioè, nel mezzo dell'area a forma di cono che è ciò che è sr. Ora devi considerare qualcosa per un momento, è possibile riempire un'area completamente con cerchi? Seriamente, pensa a questo ... non è vero? I cerchi solidi lasciano sempre spazio tra di essi in determinati punti. Pensa a un pallone da calcio per un momento. È costruito da forme che possono unirsi per fornire una distribuzione uniforme. Il punto di questo pensiero è farti capire che tutti i punti non possono essere esattamente a una certa distanza - come il modo in cui un cerchio ha un raggio. Tuttavia, il centro delle squadre di palloni da calcio arriva molto vicino ed è uniforme.

Quello che farei se fossi in te, sarebbe cercare di scrivere un algoritmo per identificare la "forma" più efficiente per mettere ognuno di questi "pezzi" di spazio sferico assegnato in ... come il pallone da calcio. Altrimenti, penso che questa potrebbe essere la migliore risposta che otterrete ... 4 pi/n sr = x ..., non è possibile tracciare ogni punto in modo che sia esattamente alla stessa distanza l'uno dall'altro (tranne in certe configurazioni, ad es. sarebbe possibile con un numero speciale di punti), ci può essere un algoritmo là fuori per trovare tutti i casi speciali.

Sto modificando questa risposta per approfondire i casi speciali, un po 'di informazioni in più andrebbero bene qui penso. I casi speciali in cui i punti devono essere equidistanti sono che possono formare i vertici dei solidi platonici. Ci sono solo 5 forme solide platoniche di base, tutte le altre sono fatte da queste.

Leggere questa pagina per ulteriori informazioni e la prova di questo https://www.uwgb.edu/dutchs/symmetry/platonic.htm

Ora non posso prendermi il merito, ho fatto qualche ricerca veloce ed ho trovato un post simile https://math.stackexchange.com/questions/279544/return-an-array-of-evenly-distributed-points-on-a-sphere-give-radius-and-origin

Utilizzando poliedro la formula di Eulero http://plus.maths.org/content/eulers-polyhedron-formula

e il fatto che solo tre forme di base esistono sul poliedri, 'triangoli, quadrati ed esagoni' è possibile creare un algoritmo per arrotondare il numero di punti vuoi tracciare, alla forma del poliedro più vicino e tracciarne uno in modo uniforme.

enter image description here

Oh, e dare un'occhiata a questo grande articolo, si spiega steradianti e 3-dimensionali 'gradi' molto meglio di me http://mathforum.org/library/drmath/view/55358.html

2

potrebbe essere sbagliato, ma se

  1. interazioni di installazione tra due punti come I (a, b) = (ab)/(| ab |)^3, a, b sono minacciati come vettori nello spazio 3D
  2. per le prime iterazioni posizionare punti come al solito (a angolo uguale dis distanze, come è stato accennato nel post WIM)
  3. ad ogni passo dell'algoritmo si sposta ogni punto contro il gradiente di summ di I (da 1) in cui mi viene calcolato solo sui vicini diretti
  4. ripetere 3 fino il gradiente in ogni punto diventerà 0.

l'algoritmo convergerà nella configurazione di ciò che è necessario. È tempo di consumo, ma è possibile memorizzare i risultati per diversi numeri di punti.

1

Per quanto riguarda la risposta di Klik, la premessa è giusta, ma la formula è sbagliata. Se la formula fosse n/4pi, se avessi 4 punti il ​​risultato sarebbe 4/(4 × pi) che è 0.3183 (non pi).Quello che vuoi fare è prendere il numero totale di steradiani sulla sfera (cioè 4pi) e dividerlo n volte. Quella formula è 4pi/n.

+0

Hai visto la modifica che hai proposto. Grazie. – Klik

0

c'è un software che definiscono una pixelization uniforme della sfera in modo tale che ogni punto è circondato dalla stessa quantità di angolo solido. Checkout: http://healpix.jpl.nasa.gov/ Essi provies anche diversi routine per fare alcuni calcoli utili a Fortan, C, C++, Python, mathlab, tra gli altri ...

Problemi correlati