1. Motivación: de tres cuerpos a mil millones

En la lección anterior integramos tres cuerpos. Un cúmulo globular tiene – estrellas; una simulación cosmológica moderna, partículas. La aceleración de cada cuerpo,
exige términos, luego cada evaluación de fuerzas cuesta pares: . Con son interacciones por paso; a interacciones por segundo, ocho minutos por paso, y una simulación necesita – pasos. Barnes y Hut (1986) mostraron que agrupando los cuerpos lejanos en «pseudo-partículas» el coste baja a con un error controlable: es el algoritmo que, con refinamientos (multipolos de orden alto, métodos multipolares rápidos, mallas), está detrás de casi toda la dinámica galáctica y cosmológica numérica.
En esta lección (y en src/lib/math/barneshut.ts) usamos unidades adimensionales con . Para el modelo de Plummer adoptamos además las unidades de Hénon: masa total , energía total , con lo que el radio de escala es .
2. La idea de Barnes y Hut: aproximación monopolar

2.1 Potencial de un grupo lejano
Sea un grupo de cuerpos de masas en posiciones , con masa total y centro de masas , contenido en una celda de lado . Su potencial en un punto a distancia del centro de masas, con y , es
donde son los polinomios de Legendre y el ángulo entre y (desarrollo válido para ). Los tres primeros términos son:
- (monopolo): .
- (dipolo): , idénticamente nulo porque por definición del centro de masas.
- (cuadrupolo): , de tamaño .
Por tanto, al sustituir el grupo por una sola masa en (aproximación monopolar), el error relativo del potencial es y el de la fuerza, derivando, también . Elegir el centro de masas como centro del desarrollo es lo que mata el dipolo y hace que un parámetro tan simple como controle el error cuadráticamente.
2.2 El árbol de octantes
Se encierra el sistema en un cubo y se subdivide recursivamente en 8 octantes hasta que cada celda contiene a lo sumo un cuerpo. Cada celda interna guarda su masa total y su centro de masas (se acumulan durante la inserción). La construcción cuesta en promedio y el árbol se reconstruye en cada paso (Barnes & Hut lo hacían así; es más barato que mantenerlo).
2.3 Criterio de apertura
Para calcular la fuerza sobre el cuerpo se recorre el árbol desde la raíz. En cada celda de lado cuyo centro de masas dista del cuerpo:
- si (la celda se ve «pequeña»), se usa su monopolo y no se desciende;
- si no, se abre la celda y se visitan sus hijos;
- una hoja con un solo cuerpo se trata exactamente.
es el parámetro de apertura. Con ninguna celda se acepta y el algoritmo degenera en la suma directa (nuestro test lo comprueba a ). Valores habituales: –. El criterio original de Barnes y Hut usa el lado y la distancia al centro de masas; Salmon y Warren (1994) mostraron que puede fallar para celdas cuyo centro de masas está cerca del borde, y propusieron añadir a el desplazamiento del centro de masas respecto del centro geométrico; nuestra implementación usa el criterio original.
2.4 Coste
Proposición. Para un cuerpo dado y un sistema de cuerpos distribuidos con densidad acotada, el número de celdas aceptadas con el criterio es .
Demostración (esbozo). Las celdas del nivel tienen lado . Una celda de ese nivel se acepta si está a distancia y su padre fue abierto, es decir, . Las celdas aceptadas del nivel viven por tanto en una cáscara esférica de radios y , de volumen , que contiene a lo sumo celdas de volumen . Como hay const niveles no vacíos (la profundidad del árbol es para densidad acotada), el total es . Sumando sobre los cuerpos: .
La dependencia es dura: pasar de a multiplica el coste por 8. En nuestra tabla (§5) el cociente medido entre y es , menor que 8 porque a muchas interacciones son con hojas individuales, no con celdas.
3. Suavizado gravitatorio

3.1 Por qué hace falta
Con finito, dos cuerpos pueden acercarse arbitrariamente y la fuerza diverge: el paso de tiempo tendría que hacerse minúsculo y, peor, una «colisión» entre dos partículas de simulación no representa nada físico cuando cada partícula simboliza estrellas o una porción de materia oscura. Se sustituye el potencial de cada partícula por el de una esfera de Plummer de radio :
Es exactamente el potencial generado por la densidad de Plummer (1911), (ejercicio 3). La fuerza es finita en todas partes: su máximo, , ocurre en (ejercicio 4). Ese mismo es el parámetro eps de accelerations en integrators.ts y de todo el módulo barneshut.ts.
3.2 Sesgo y ruido
El precio es un sesgo: para ,
la fuerza queda subestimada en un ( % a , % a : sesgoPlummer). Dehnen (2001) analiza el compromiso: grande reduce el ruido de la fuerza (las fluctuaciones por el número finito de vecinos, que escalan como para las fuerzas de corto alcance) pero aumenta el sesgo; existe un óptimo que decrece con aproximadamente como – para el perfil de Plummer, y los núcleos de soporte compacto (splines) son preferibles al de Plummer porque su sesgo se anula exactamente para . Una regla práctica: del orden de la separación media entre vecinos en la región más densa; en nuestra esfera de Plummer con esa distancia media al vecino más próximo es (unidades de Hénon).
4. El teorema del virial

4.1 Enunciado y demostración
Sea el momento de inercia escalar. Derivando dos veces,
donde es la energía cinética y es el virial de Clausius. Para fuerzas por pares dirigidas según , agrupando pares,
Si deriva de un potencial homogéneo de grado (), , y , la energía potencial total. Promediando en el tiempo un sistema acotado ():
(Binney & Tremaine §4.8.)
4.2 El virial con suavizado
Con Plummer la fuerza no es homogénea de grado , y el virial de la fuerza difiere de la energía potencial suavizada:
Así que la relación correcta en equilibrio es , no ; la diferencia es positiva y de orden . virial() devuelve las tres cantidades. En nuestra esfera de Plummer (): con , , , (la desviación del 0.6 % frente a 1 es ruido de muestreo; los valores teóricos son , ). Con , y : la condición ingenua da y la correcta da : el sistema, generado en equilibrio newtoniano, está un 8 % «demasiado caliente» para la gravedad suavizada y se expandirá ligeramente al integrarlo. Con () la discrepancia sube al 40 %: un suavizado así ya no simula el mismo sistema.
4.3 Uso como diagnóstico
En una simulación se monitoriza (además de , y ):
- oscila alrededor de 1 con periodo tiempo dinámico: sistema en equilibrio.
- sostenido: sistema caliente, se expande; : colapsa. Un sistema en colapso frío () «relaja violentamente» hacia en pocos tiempos dinámicos (Lynden-Bell 1967).
- Deriva secular de con constante: relajación por dos cuerpos (evaporación, colapso del núcleo), un efecto físico en cúmulos pero espurio en simulaciones de sistemas no colisionales, donde señala demasiado pequeño o demasiado pequeño.
5. Resultados numéricos

Todos de barneshut.ts sobre esferas de Plummer generadas con modeloPlummer (semilla 7), ; el error relativo de cada cuerpo es .
5.1 Coste y error en función de ()
| Interacciones por cuerpo (BH) | Directa () | Ahorro | Error mediano | Error máximo | |
|---|---|---|---|---|---|
| 250 | 144 | 249 | 1.7 | ||
| 500 | 231 | 499 | 2.2 | ||
| 1000 | 358 | 999 | 2.8 | ||
| 2000 | 530 | 1999 | 3.8 | ||
| 4000 | 738 | 3999 | 5.4 | ||
| 8000 | 958 | 7999 | 8.4 |
Al multiplicar por 32 (250 → 8000) las interacciones por cuerpo se multiplican por 6.7, mientras que la suma directa se multiplica por 32. El crecimiento es más rápido que puro (que daría ) porque a estos el perfil de Plummer, muy concentrado, hace que una fracción grande de interacciones sea con hojas; el régimen asintótico solo se alcanza a mucho mayores, cuando la profundidad del árbol domina sobre las interacciones con hojas. El error máximo crece con : siempre hay algún cuerpo para el que una celda queda justo en el límite del criterio; es el caso que motivó la corrección de Salmon y Warren.
5.2 Error en función de ()
| Interacciones por cuerpo | Error mediano | Error máximo | |
|---|---|---|---|
| 0.2 | 1326 | ||
| 0.3 | 969 | ||
| 0.5 | 530 | ||
| 0.7 | 319 | ||
| 1.0 | 179 | ||
| 1.5 | 93 |
El error mediano escala aproximadamente como entre y (la predicción monopolar es por celda, pero el número de celdas aceptadas también crece con y los errores se suman con signos aleatorios). Con hay cuerpos cuya fuerza es completamente errónea (error 150 %): el criterio ha aceptado celdas que contienen al propio vecino más cercano.
5.3 Qué precisión hace falta
Un error relativo de fuerza del por partícula y por paso, con signos aleatorios, se acumula tras pasos como : en pasos, un 10 %. Pero el ruido de discretización (usar partículas para representar un continuo) produce ya errores de fuerza del orden de (Dehnen 2001): para , . No tiene sentido calcular la fuerza mucho mejor que ese ruido intrínseco: de ahí que – sea el estándar.
Qué observar. El simulador usa suma directa (tres cuerpos no justifican un árbol). Con el escenario «Pitagórico», activa el suavizado con y compara la evolución con la de : los encuentros cercanos que expulsan a la masa 3 se amortiguan y el estado final cambia. Es la demostración más directa de que es un parámetro físico del modelo, no un detalle numérico.
Problemas
1. (Cuadrupolo). Demuestra que para un grupo de masas con centro de masas en el origen el término cuadrupolar del potencial en es , y que para una celda cúbica de lado centrada en el centro de masas está acotado en valor absoluto por . Concluye que el error relativo del potencial monopolar es y, con , inferior al 19 % en el peor caso.
Ver solución
De y sale la expresión. Dentro de un cubo de lado centrado en el centro de masas, , luego y el término queda acotado por . Relativo al monopolo : . Con : % como cota del potencial en el peor caso; el error típico es mucho menor (la tabla da mediana %) porque las masas rara vez están todas en las esquinas y los errores de distintas celdas se cancelan parcialmente. La fuerza (derivada) tiene cota del mismo orden con constante distinta.
2. (Dipolo nulo). Demuestra que si el desarrollo se hace alrededor de un punto distinto del centro de masas (por ejemplo, el centro geométrico de la celda), aparece un término dipolar de error relativo , y calcula cuánto peor es con .
Ver solución
Con , , y el término vale , de tamaño relativo . Frente al cuadrupolo , con el dipolo es frente a : más del doble, y decae solo linealmente al alejarse. Por eso el centro de masas (y no el geométrico) es el centro del desarrollo. Es una aplicación del principio general: siempre se puede anular el dipolo eligiendo el origen; no así el cuadrupolo.
3. (Densidad de Plummer). Demuestra, con la ecuación de Poisson , que el potencial corresponde a , y comprueba que .
Ver solución
En simetría esférica . Con : , , y . Luego y , que es la expresión pedida. Masa: (la integral vale : sustituir ). El 50 % de la masa está dentro de (ecuación ). En unidades de Hénon, con , se obtiene y, por el virial, , : los valores que usa el test.
4. (Fuerza máxima). Demuestra que es máxima en con valor , y deduce una cota inferior del paso de tiempo de un leapfrog estable, .
Ver solución
. Sustituyendo: . La «frecuencia» local máxima de un encuentro es , y la estabilidad del leapfrog para un oscilador exige (lección anterior, ejercicio 4): . Este es el verdadero motivo práctico del suavizado: acota el paso de tiempo desde abajo. Con y (nuestra esfera de ), .
5. (Virial con suavizado). Demuestra la identidad y concluye que : un sistema en equilibrio newtoniano siempre parece «caliente» para la gravedad suavizada.
Ver solución
Para un par, . Escribiendo : . Sumando sobre pares sale la identidad; el segundo término es positivo, luego y, siendo ambos negativos, . Un sistema con tiene . En nuestro modelo: con , en acuerdo con la tabla. Para corregirlo se generan las velocidades con el potencial suavizado o se reescala por .
6. (Computacional: árbol en 2D). Implementa un árbol de cuadrantes para cuerpos en el plano, con criterio , y mide (a) el número de interacciones por cuerpo para con ; (b) el error mediano frente a la suma directa para . Compara con las tablas de §5.
Ver solución
Estructura mínima en Python (recursiva; para tarda segundos):
import numpy as np
class Celda:
def __init__(self, cx, cy, s):
self.cx, self.cy, self.s = cx, cy, s
self.m = 0.0; self.X = 0.0; self.Y = 0.0 # masa y centro de masas acumulados
self.cuerpo = None; self.hijos = None
def insertar(self, i, x, y, m):
if self.m == 0 and self.hijos is None: # hoja vacía
self.cuerpo, self.m, self.X, self.Y = i, m, x, y; return
if self.hijos is None: # hoja ocupada: subdividir
self.hijos = [None]*4; j = self.cuerpo; self.cuerpo = None
mj, xj, yj = self.m, self.X, self.Y; self.m = 0
self._bajar(j, xj, yj, mj)
self._bajar(i, x, y, m)
self.X = (self.X*self.m + x*m)/(self.m+m); self.Y = (self.Y*self.m + y*m)/(self.m+m); self.m += m
def _bajar(self, i, x, y, m):
k = (x >= self.cx) + 2*(y >= self.cy); q = self.s/4
if self.hijos[k] is None:
self.hijos[k] = Celda(self.cx + (q if k & 1 else -q), self.cy + (q if k & 2 else -q), self.s/2)
self.hijos[k].insertar(i, x, y, m)
def fuerza(c, i, x, y, theta, eps, cont):
if c.m == 0 or c.cuerpo == i: return np.zeros(2)
dx, dy = c.X - x, c.Y - y; d = np.hypot(dx, dy)
if c.hijos is None or c.s < theta*d:
cont[0] += 1; return c.m*np.array([dx, dy])/(d*d + eps*eps)**1.5
return sum(fuerza(h, i, x, y, theta, eps, cont) for h in c.hijos if h is not None)Se construye la raíz con el cuadrado que contiene a todos los cuerpos y se llama a fuerza para cada uno. Resultados esperados: el número de interacciones por cuerpo crece despacio (en 2D el factor es en lugar de ), y los errores medianos con son del orden de , como en 3D. El error debe anularse con : es el primer test que hay que pasar.
7. (Computacional: relajación violenta). Genera una esfera de Plummer con y reduce todas las velocidades a la mitad (). Integra con leapfrog (, , ) durante y grafica , y el radio que contiene la mitad de la masa. ¿En cuántos tiempos dinámicos se alcanza ?
Ver solución
Con modeloPlummer, leapfrogBarnesHut y virial de barneshut.ts (o la versión Python del problema 6). El tiempo dinámico de la esfera es en unidades de Hénon. El sistema colapsa: sube por encima de 1 (rebote) y se amortigua hacia 1 en unos –, es decir –: la relajación violenta de Lynden-Bell. El radio de media masa cae a del inicial y el sistema queda más concentrado y con una envoltura extensa; debe conservarse al nivel del 1 % (el error viene de y del paso); si no, reduce o . Una fracción pequeña de partículas puede escapar ().
✦ Autoevaluación
Lecturas
- Barnes & Hut (1986), Nature 324, 446: el artículo original, de cuatro páginas, legible por completo.
- Aarseth (2003), Gravitational N-Body Simulations, cap. 6: códigos de árbol en el contexto de los métodos directos; cap. 1 para el planteamiento.
- Dehnen (2001), MNRAS 324, 273, y Dehnen & Read (2011), EPJ Plus 126, 55: la revisión moderna de suavizado, árboles, multipolos rápidos y pasos individuales.
- Binney & Tremaine (2008), Galactic Dynamics, §2.9 (resolución numérica de la ecuación de Poisson: árboles, mallas) y §4.8 (ecuaciones de Jeans y virial); §2.2.2 para la esfera de Plummer.
- Aarseth, Hénon & Wielen (1974), A&A 37, 183: el algoritmo de muestreo del modelo de Plummer que usa
modeloPlummer. - Salmon, J. K. & Warren, M. S. (1994). Skeletons from the treecode closet. J. Comput. Phys. 111, 136–155: los fallos del criterio original y los criterios con cota de error garantizada.
🍎 Guía para el profesor
- Tiempo
- 2 clases de 90 min más un taller de programación de 2 h
- Resultado de aprendizaje
- Al finalizar, el estudiante justifica el coste O(N²) de la suma directa y el O(N log N) del árbol, deriva el error de la aproximación monopolar, explica el papel del suavizado y usa el teorema del virial como diagnóstico de una simulación.
- Evidencia de aprendizaje
- Entrega del problema 6 (árbol 2D con verificación θ = 0 y tablas de coste y error) y del problema 7 (gráficas de Q(t), E(t) y radio de media masa con interpretación).
Materiales
- Python 3 con NumPy y Matplotlib
- Código de referencia: src/lib/math/barneshut.ts y su test
- El artículo de Barnes & Hut (1986), para lectura previa
- Simulador N cuerpos del portal (escenario Pitagórico con y sin suavizado)
Secuencia sugerida
Clase 1 (90 min). Inicio (15 min): cuánto cuesta un paso de suma directa para y por qué no basta con «un ordenador más grande». Desarrollo (60 min): desarrollo multipolar y anulación del dipolo (§2.1), construcción del árbol en pizarra con 8–10 puntos en 2D, criterio de apertura, proposición del coste . Cierre (15 min): problema 2 en parejas.
Clase 2 (90 min). Inicio (10 min): demostración del simulador con y sin suavizado. Desarrollo (55 min): potencial de Plummer y ecuación de Poisson (problema 3), sesgo de la fuerza, teorema del virial con y sin suavizado (§4), lectura de las tablas de §5. Cierre (25 min): problemas 4 y 5; mini-prueba.
Taller (2 h). Problema 6 completo (árbol 2D) con la verificación como primer hito, y problema 7 con las gráficas de diagnóstico. Los estudiantes que terminen pueden añadir el término cuadrupolar y medir cuánto baja el error a igual .
Errores frecuentes
- Pensar que ε es un «truco numérico» sin consecuencias. Mostrar el cambio de estado final del problema pitagórico y el cociente virial 1.08 con ε = 0.1: ε define el sistema que se simula.
- Hacer el desarrollo multipolar alrededor del centro geométrico de la celda. Pedir el problema 2 antes de programar.
- Creer que un error de fuerza del 0.3 % es «demasiado» o «demasiado poco» sin compararlo con el ruido de discretización N^(−1/2). Discutir §5.3.
- Diagnosticar el equilibrio con 2K/|W| en lugar de 2K/|𝒱ε| cuando hay suavizado. Es el problema 5.
- Confundir relajación violenta (no colisional, rápida) con relajación por dos cuerpos (colisional, lenta). Pedir las escalas de tiempo de cada una.