Muestreo de una distribución (a partir de un modelo de galaxia)

Estoy leyendo el siguiente artículo: http://www.kof.zcu.cz/st/dis/schwarzmeier/galaxy_models.html y actualmente estoy en la sección 5.6 (posiciones de cuerpos en una galaxia).

Estoy tratando de rehacer las simulaciones yo mismo en Python, pero tengo preguntas sobre el muestreo de la distribución.

Dada una función de distribución (distribución de Hernquist):

ρ ( r ) = METRO 2 π a r ( a + r ) 3

el artículo establece que para simular la distribución, uno tiene que calcular la masa dentro de un círculo de radio r como sigue:

metro ( r ) = 0 r 4 π r 2 ρ ( r ) d r

que es la función de distribución de masa acumulada.

El artículo establece que esta fórmula representa el PDF. Sin embargo, mirando la forma, me parece que es un CDF. Al acercarse al infinito, la función se acerca a 1.0, lo que para mí es una clara indicación de un CDF.

Para muestrear esta distribución el artículo cita el método de Von Neumann donde uno tiene que generar un r y un metro valor, y escalarlos en consecuencia, y comprobar si caen o no por debajo del metro ( r ) grafico. Si lo hacen, se aceptan; de lo contrario, se rechazan.

¿Estoy completamente equivocado al pensar que esto está mal? Si hago esto, termino con la mayoría de las estrellas terminando en los radios más altos.

Tengo la sensación de que estoy probando un CDF aquí en lugar de un PDF. Para obtener resultados precisos (por ejemplo, tener la mayoría de las estrellas en el centro) significa que tengo que realizar el método de Von Neumann con el ρ ( r ) función.

No puedo contactar al autor del artículo, por eso pregunto aquí.

Respuestas (2)

El artículo se ve realmente mal. De hecho, hay dos errores.

Primero, tiene razón en que el método de aceptación-rechazo debe aplicarse a ρ ( r ) , y no a metro ( r ) . Para entender cómo funciona esta idea, supongamos que queremos generar una función de distribución normalizada unidimensional pag ( y ) . Ahora, supongamos que podemos reescribir esta función de distribución en términos de una variable X , tal que toma la forma de una distribución uniforme. Eso es,

pag ( X ) = { 1 para  0 X 1 , 0 en otra parte .
Dado pag ( y ) , qué es X ? Tenemos la transformación jacobiana
pag ( y ) d y = pag ( X ( y ) ) | d X d y | d y = | d X d y | d y ,
lo que implica
pag ( y ) = d X d y ,
asumiendo que X ( y ) es una función creciente. De este modo
X = 0 y pag ( y ) d y = F ( y ) .
En otras palabras, la integral de pag ( y ) (o de manera equivalente, el área bajo la curva) sigue una distribución uniforme. Con esto en mente, existen esencialmente dos formas de realizar una simulación Monte-Carlo.

La primera forma es el método de aceptación-rechazo: trace la curva pag ( y ) y generar uniformemente un par de números ( a , b ) en el intervalo ( [ 0 , y máximo ] , [ 0 , pag máximo ] ) , dónde y máximo y pag máximo son los límites superiores de y y pag ( y ) . Si la coordenada ( a , b ) se encuentra debajo de la curva pag ( y ) , acéptalo; de lo contrario, rechácelo. Si se acepta la coordenada, y = a es el punto generado.

ingrese la descripción de la imagen aquí

Hay grandes inconvenientes en este método: y máximo y pag máximo puede ser infinito, por lo que uno necesitaría un corte. Y si pag ( y ) tiene un pico agudo, uno termina rechazando muchos puntos.

Un método mucho más eficiente es generar uniformemente X , y calcular el correspondiente y invirtiendo X = F ( y ) :

y = F 1 ( X ) .
Esto llena automáticamente el área bajo la curva, sin rechazar puntos. ingrese la descripción de la imagen aquí

Si el cálculo de F 1 ( X ) está demasiado involucrado numéricamente, se puede usar una combinación de ambos métodos: introducir otra función (más simple) F ( y ) que yace en todas partes arriba pag ( y ) . Aplicar el método de inversión a F ( y ) , generando un punto y . Luego genera uniformemente un valor b en el intervalo [ 0 , F ( y ) ] . Si b pag ( y ) , aceptar y ; de lo contrario, rechácelo.

Ahora, considere la distribución de Hernquist. Como tiene una cúspide en el origen y la masa acumulada metro ( r ) es una funcion sencilla

metro ( r ) = METRO r 2 ( a + r ) 2 ,
Definitivamente recomendaría el método de inversión. Pero hay una advertencia importante aquí, y ese es el segundo error del artículo: ρ ( r ) no es realmente una distribución unidimensional . En cambio, es una distribución en un espacio tridimensional, y es solo una función de una variable debido a la simetría esférica. Para aplicar el método Monte-Carlo, tenemos que expresar ρ como una función de distribución verdaderamente unidimensional, lo que podemos hacer expresándola en términos del volumen
y = 4 π 3 r 3 .
Ahora tenemos
pag ( y ) = ρ ( y ) = METRO 2 π a ( 3 y / 4 π ) 1 / 3 [ a + ( 3 y / 4 π ) 1 / 3 ] 3 , F ( y ) = metro ( y ) = 0 y ρ ( y ) d y = METRO ( 3 y / 4 π ) 2 / 3 [ a + ( 3 y / 4 π ) 1 / 3 ] 2 .
Una vez que generamos un punto y , el radio correspondiente es
r = ( 3 y 4 π ) 1 / 3 .

Hay una consecuencia importante: es probable que haya más partículas en radios grandes que alrededor del centro, aunque ρ ( r ) es mucho mayor en radios pequeños. La razón es que las partículas entre dos radios r y ( r + Δ r ) ocupan una concha con volumen

V = 4 π 3 [ ( r + Δ r ) 3 r 3 ] .
Cuanto mayor sea el radio r , cuanto mayor sea el volumen del caparazón, lo que significa que necesita más partículas para llenarlo y obtener ρ ( r ) . Esto es obvio en el caso de una densidad constante, pero también es cierto para las densidades generales.

¡Gracias por la respuesta increíblemente detallada! Y me alegro de haber acertado con el método de aceptación-rechazo :)
Si no me equivoco, estas imágenes son del texto de Recetas numéricas , que es material con derechos de autor, por lo que debe incluir referencias de dónde provienen.

la FCD, F ( X ) , está relacionado con el PDF, F ( X ) , a través de la relación:

F ( X ) = X d X F ( X )
En el caso de distribuciones radiales, su límite inferior es obviamente 0 y no . Por lo tanto, su CDF es metro ( r ) y el pdf es 4 π ( r ) 2 ρ ( r ) (técnicamente debería ser ρ ( r ) con el 4 π ( r ) 2 procedente de d X d r e isotropía espacial, pero lo que sea).

En el caso de funciones invertibles (por ejemplo, F ( X ) = A X con constante de normalización A ), puedes resolver esto como

F ( X ) = A 2 X 2 X = 2 F A
Si genera un número aleatorio, configúrelo igual a F y sale tu X que satisface el PDF.

En el caso de que sus funciones no sean invertibles (a menudo el caso que involucra distribuciones radiales), sugeriría usar un método iterativo de Newton-Raphson para encontrar raíces para este caso. Esto se puede hacer fácilmente ya que sabes F ( X ) (su FCD) F ( X ) = F ( X ) (tu PDF):

X norte mi w = X o yo d F ( X o yo d ) F ( X o yo d )
Cuando | X norte mi w | < ϵ , entonces X o yo d es la raíz (aproximada). A menudo, solo se necesitan unas pocas iteraciones para la convergencia.



Aparte, no puedo enfatizar lo suficiente lo terrible que es la sugerencia del método de aceptación-rechazo. NO USE ESTE MÉTODO . Literalmente desperdicia tiempo de computación, algo que debería considerarse valioso, independientemente de la prevalencia de las computadoras. No escuches a nadie que diga que tienes que usar este método, están total y absolutamente equivocados.

El método de Newton que sugiero anteriormente no rechaza un solo número aleatorio, se ajustará al PDF con precisión y es altamente eficiente.