Demonstrating the stability of solitons in the superfluid vacuum.
Author
Raúl Chiclano
Published
November 30, 2025
1. Objective
To computationally verify if the Dynamic Background (modeled as a superfluid via the Gross-Pitaevskii equation) is capable of sustaining stable localized structures (“particles”) without dissipating into the medium.
2. Methodology
Mathematical Model: Dimensionless Gross-Pitaevskii Equation (GPE) with a non-linear interaction term (\(g|\Psi|^2\)).
Numerical Method: Split-Step Fourier (Spectral Method) to ensure norm conservation and stability.
Stabilization Technique: An initial Imaginary Time Evolution (\(t \to -it\)) was applied to cool the system and find the numerical ground state, eliminating spurious shockwaves.
Initial Condition: A vortex with topological charge \(Q=1\) (Singular Phase Ansatz).
3. Results & Interpretation
The simulation below visualizes the evolution of the field \(\Psi\):
Density (Left Panel): A perfectly defined “hole” or zero-density core is observed in the center of the fluid. The structure remains stable over time, resisting collapse or diffusion.
Phase (Right Panel): An azimuthal phase gradient pattern (“pinwheel”) converging into a central singularity is visible. This confirms the topological nature of the defect.
4. Conclusion
The simulation demonstrates that matter can emerge as a stable topological defect (soliton) within the Dynamic Background. This validates Postulate 2.1 of the Theoretical Framework: matter does not need to be introduced as an external body but is a knotted configuration of the vacuum itself.
Code
import numpy as npimport matplotlib.pyplot as pltimport matplotlib.animation as animationfrom IPython.display import HTML # --- 1. CONFIGURACIÓN ---N =128L =30.0dt =0.005dt_im =0.005g =2.0rho_0 =1.0x = np.linspace(-L/2, L/2, N)y = np.linspace(-L/2, L/2, N)X, Y = np.meshgrid(x, y)dx = x[1] - x[0]k =2* np.pi * np.fft.fftfreq(N, d=dx)KX, KY = np.meshgrid(k, k)K2 = KX**2+ KY**2# Potencial de trampa suaveR_grid = np.sqrt(X**2+ Y**2)V_trap =0.5* (R_grid / (0.45*L))**10V_trap[V_trap >100] =100# --- 2. CONDICIÓN INICIAL ---Theta = np.arctan2(Y, X)xi =1.0/ np.sqrt(g * rho_0)Psi = np.sqrt(rho_0) * np.tanh(R_grid / (2.0* xi)) * np.exp(1j* Theta)# --- 3. RELAJACIÓN (TIEMPO IMAGINARIO) ---U_kin_im = np.exp(-(K2 /2.0) * dt_im)for i inrange(100): density = np.abs(Psi)**2 Psi = Psi * np.exp(-(V_trap + g * density) * (dt_im /2)) Psi_k = np.fft.fft2(Psi) Psi_k *= U_kin_im Psi = np.fft.ifft2(Psi_k) density = np.abs(Psi)**2 Psi = Psi * np.exp(-(V_trap + g * density) * (dt_im /2)) norm_factor = np.sqrt(rho_0) / np.max(np.abs(Psi)) Psi *= norm_factor Psi = np.abs(Psi) * np.exp(1j* Theta)# --- 4. EVOLUCIÓN REAL Y ANIMACIÓN ---U_kin_real = np.exp(-1j* (K2 /2.0) * dt)def evolution_step_real(psi_in): psi_mod = psi_in * np.exp(-1j* (V_trap + g * np.abs(psi_in)**2) * (dt /2)) psi_k = np.fft.fft2(psi_mod) psi_k *= U_kin_real psi_mod = np.fft.ifft2(psi_k) psi_out = psi_mod * np.exp(-1j* (V_trap + g * np.abs(psi_mod)**2) * (dt /2))return psi_out# Configuración de la figura para la webfig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 5))plt.close() # <--- IMPORTANTE: Evita que se muestre una imagen estática vacía antes de la animaciónim1 = ax1.imshow(np.abs(Psi)**2, extent=[-L/2, L/2, -L/2, L/2], cmap='inferno')ax1.set_title("Density")im2 = ax2.imshow(np.angle(Psi), extent=[-L/2, L/2, -L/2, L/2], cmap='hsv')ax2.set_title("Phase")def update(frame):global Psifor _ inrange(5): Psi = evolution_step_real(Psi) im1.set_data(np.abs(Psi)**2) im2.set_data(np.angle(Psi))return im1, im2# Generar la animaciónani = animation.FuncAnimation(fig, update, frames=60, interval=50, blit=True)# RENDERIZAR COMO VIDEO HTML5 (Base64 incrustado)from IPython.display import HTMLdisplay(HTML(ani.to_html5_video()))plt.close()