Visualisation de la déformation de l’espace sous des forces gravitationnelles à l’aide de la loi de Newton: approche par grille de particules

par Vitaliy Kaurov
Article original
Le code original (légèrement modifié ici) se trouve dans une publication de Mathematica Stack Exchange « Visualizing gravity warping the fabric of spacetime » dans la réponse donnée par N0va. Remarque : il ne s’agit pas de la relativité d’Einstein, et seule la loi de la gravitation de Newton est utilisée ci-dessous. L’article « The river model of black holes » est une information de contexte utile.
Introduction originale : « Voici mon approche de physicien sur le problème : je considère un nuage/une grille de particules de test qui sont attirées vers un point de référence par une force. Dans ce qui suit, je suppose une attraction gravitationnelle, c’est-à-dire que la force exercée sur la particule de test est alignée avec son vecteur de distance par rapport au point de référence et que l’intensité de cette force est inversement proportionnelle au carré de la distance. Pour chaque particule, je résous les équations du mouvement afin d’obtenir la déformation/la déflexion après un temps donné. Voici une première version grosso modo ».
La fonction
getDeflection
calcule la nouvelle position d’une particule test sous l’attraction gravitationnelle vers un point de référence. Elle utilise
NDSolveValue
pour intégrer les équations du mouvement jusqu’à un instant spécifié ou jusqu’à ce que la distance au point de référence soit inférieure à un seuil. Elle renvoie la position déviée après prise en compte de l’attraction gravitationnelle, simulant l’effet de la gravité sur l’espace.
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 fonction
generateCube
crée une grille tridimensionnelle de lignes qui forment une structure de cube. Elle prend un jeu de données et un paramètre de subdivision facultatif, puis utilise des objets
Line
pour construire les arêtes du cube. Chaque arête est affinée en segments plus petits en fonction du niveau de subdivision, ce qui aboutit à une représentation détaillée du cube.
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 fonction
deformCube
modifie les lignes existantes d’un cube afin de simuler une déformation gravitationnelle. Elle calcule de nouvelles positions pour les points en appliquant la fonction
getDeflection
et met à jour les lignes avec ces nouvelles positions. Elle visualise la déformation à l’aide de
Graphics3D
, avec des ajustements de couleur basés sur le degré de déformation.
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]​​]
Une grille cubique est générée à l’aide d’une table de points, subdivisant chaque arête en segments plus petits afin de créer une structure détaillée.
In[]:=
cube = generateCube[Table[{i, j, k}, ​​ {i, Subdivide[-1, 1, 3]}, ​​ {j, Subdivide[-1, 1, 3]}, ​​ {k, Subdivide[-1, 1, 3]}], 10];
Une séquence d’images est générée, elles représentent la déformation d’un cube sous l’effet des forces gravitationnelles. Chaque image correspond à une position différente de la source gravitationnelle, et la déformation est visualisée à l’aide de couleurs et d’un éclairage ajustés.
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}];
Un affichage interactif est créé, montrant une séquence d’images. Il permet aux utilisateurs d’explorer la déformation d’un cube sous l’effet des forces gravitationnelles en ajustant un paramètre qui contrôle la position au sein de la séquence.
In[]:=
Manipulate[imgs[[k]],{k,1,Length[imgs],1},SaveDefinitions->True]
Out[]=
​
k
Exportez vers un .GiF animé :
In[]:=
Export["grav.gif",imgs,ImageSize->550,"DisplayDurations"->.03]
Out[]=
grav.gif

CITER CE NOTEBOOK

Visualisation de la déformation de l’espace sous l’effet des forces gravitationnelles : approche par grille de particules​
par Vitaliy Kaurov​
Communauté Wolfram, CHOIX DE L’ÉQUIPE, 2 décembre 2025
​https://community.wolfram.com/groups/-/m/t/3584490