Visualización de la deformación del espacio bajo fuerzas gravitatorias utilizando la ley de Newton: Enfoque de rejilla de partículas

por Vitaliy Kaurov
Este cuaderno es una traducción al español del artículo de la Comunidad Wolfram “Visualizing space deformation under gravitational forces using Newton's law: particle grid approach” producido con ayuda de un LLM y verificado por un traductor profesional
El código original (ligeramente modificado aquí) se puede encontrar en la publicación de Mathematica Stack Exchange “Visualizing gravity warping the fabric of spacetime” en la respuesta proporcionada por N0va. Tenga en cuenta que esto no es la relatividad de Einstein, y solo se utiliza la ley de la gravedad de Newton a continuación. Una información de fondo útil es el artículo “The river model of black holes”.
Introducción original: “Este es mi enfoque como físico al problema: Considero una nube/cuadrícula de partículas de prueba que son atraídas hacia un punto de referencia por una fuerza. A continuación, asumo que atracción por gravedad, es decir, la fuerza sobre la partícula de prueba está alineada con su vector de distancia al punto de referencia y la intensidad de esta fuerza es inversamente proporcional al cuadrado de la distancia. Para cada partícula, resuelvo las ecuaciones de movimiento para obtener la deformación/desviación después de un tiempo dado. A continuación presento una primera versión aproximada”
La función
getDeflection
calcula la nueva posición de una partícula de prueba bajo la atracción gravitatoria hacia un punto de referencia. Utiliza
NDSolveValue
para integrar las ecuaciones de movimiento hasta un tiempo especificado o hasta que la distancia al punto de referencia esté por debajo de un umbral. Devuelve la posición desviada después de tener en cuenta la atracción gravitatoria, simulando el efecto de la gravedad en el espacio.
In[]:=
getDeflection[x0_, a0_, tend_] := Module[{eqs, x, t, r, t1, d},​​ r = Norm[x0 - a0];​​ If[r < 0.01, Return[x0]];​​ t1 = tend;​​ d = NDSolveValue[{x''[t] == -5/x[t]^2, x'[0] == 0, x[0] == r, ​​ WhenEvent[x[t] < 0.01, t1 = t; "StopIntegration"]}, ​​ x, {t, 0, tend}][t1];​​ x0 - (r - d)/r (x0 - a0)​​]
La función
generateCube
crea una cuadrícula tridimensional de líneas que forman una estructura cúbica. Toma un conjunto de datos y un parámetro de subdivisión opcional, luego utiliza objetos
Line
para construir los bordes del cubo. Cada borde se refina en segmentos más pequeños según el nivel de subdivisión, lo que da como resultado una representación detallada del cubo.
In[]:=
generateCube[dat_, subdivision_ : 2] := Module[{lines},​​ lines = ​​ Table[{Line[#] & /@ dat[[All, All, i]], ​​ Line[#] & /@ dat[[All, i, All]], Line[#] & /@ dat[[All, All, i]],​​ Line[#] & /@ Transpose[dat][[All, All, i]], ​​ Line[#] & /@ Transpose[dat][[All, i, All]], ​​ Line[#] & /@ Transpose[dat][[All, All, i]]}, {i, 1, Length[dat]}];​​ lines = ​​ lines /. ​​ Line[x_List] :> ​​ MapThread[Line[{#1, #2}] &, {x[[;; -2]], x[[2 ;;]]}];​​ lines /. ​​ Line[{a_, b_}] :> ​​ With[{ab = Subdivide[a, b, subdivision]}, ​​ MapThread[Line[{#1, #2}] &, {ab[[;; -2]], ab[[2 ;;]]}]]​​]
La función
deformCube
modifica las líneas existentes de un cubo para simular la deformación gravitacional. Calcula nuevas posiciones para los puntos aplicando la función
getDeflection
y actualiza las líneas con estas nuevas posiciones. Visualiza la deformación utilizando
Graphics3D
, con ajustes de color según el grado de deformación.
In[]:=
deformCube[lines_, a0_, tend_, f_, opts___] := Module[{pts, linesNew},​​ pts = DeleteDuplicates[​​ Flatten[Flatten[lines] /. Line[{a_, b_}] :> {a, b}, 1]];​​ pts = ParallelTable[x -> getDeflection[x, a0, tend], {x, pts}, ​​ DistributedContexts -> All, Method -> "FinestGrained"];​​ linesNew = ​​ lines /. ​​ Line[{a_, b_}] :> ​​ With[{an = a /. pts, bn = b /. pts}, {Thick, ​​ ColorData["DarkRainbow"][f*(Norm[a - an] + Norm[b - bn])], ​​ Line[{an, bn}]}];​​ Graphics3D[{{White, Sphere[a0, 0.1]}, linesNew}, opts]​​]
Se genera una cuadrícula cúbica utilizando una tabla de puntos, subdividiendo cada arista en segmentos más pequeños para crear una estructura detallada.
In[]:=
cube = generateCube[Table[{i, j, k}, ​​ {i, Subdivide[-1, 1, 3]}, ​​ {j, Subdivide[-1, 1, 3]}, ​​ {k, Subdivide[-1, 1, 3]}], 10];
Se genera una secuencia de imágenes que muestra la deformación de un cubo bajo fuerzas gravitacionales. Cada imagen corresponde a una posición diferente de la fuente gravitacional, y la deformación se visualiza con colores y luces ajustados.
In[]:=
imgs = Table[​​ deformCube[cube, 2/3*{Sin[x], Cos[x], 0}, 0.3, 1.8, Boxed -> False,​​ Background -> Black, Lighting -> "Neutral", ​​ ViewPoint -> {2, 2, 1},ImageSize->550, PlotLabel->​​ Framed[Style["Gravity Space Deformation",33,GrayLevel[.7],FontFamily->"Copperplate"],​​ FrameStyle->Black,FrameMargins11]], ​​{x, 0, 2 π, 2π/5}];
Se crea una visualización interactiva que muestra una secuencia de imágenes. Permite a los usuarios explorar la deformación de un cubo bajo fuerzas gravitacionales ajustando un parámetro que controla la posición dentro de la secuencia.
In[]:=
Manipulate[imgs[[k]],{k,1,Length[imgs],1},SaveDefinitions->True]
Out[]=
​
k
Exporte a .GiF animado:
In[]:=
Export["grav.gif",imgs,ImageSize->550,"DisplayDurations"->.03]
Out[]=
grav.gif

CITE ESTE CUADERNO

Visualización de la deformación del espacio bajo fuerzas gravitatorias utilizando la ley de Newton: Enfoque de rejilla de partículas​
por Vitaliy Kaurov​
Comunidad Wolfram, STAFF PICKS, 2 de diciembre de 2025
​https://community.wolfram.com/groups/-/m/t/3584490