Last Updated on August 18, 2024 by Max
The animation code provided in this article simulates the time evolution of a free particle wave packet using the split-step Fourier method.
For more details about the simulation methodologies and discussions on the simulation results [1], refer to the article –
Time Evolution of a Free Particle Wave Packet: A Numerical Simulation of Wave Packet Dispersion
For a brief overview, the wave packet is represented by a Gaussian function, initialized with specific parameters such as position, width, and wave vector. The simulation domain is a two-dimensional grid, and the wave packet’s evolution is computed over a defined number of time steps.
Python code
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
# Constants
hbar = 1.0545718e-34 # Reduced Planck constant (Joule second)
m_e = 9.10938356e-31 # Mass of electron (kg)
wavelength = 20e-9 # de Broglie wavelength (meters)
k0 = 2 * np.pi / wavelength # Wave number
# Grid parameters
Lx, Ly = 1e-6, 1e-6 # Simulation domain size (meters)
Nx, Ny = 512, 512 # Number of grid points
dx, dy = Lx / Nx, Ly / Ny # Grid spacing
x = np.linspace(-Lx / 2, Lx / 2, Nx)
y = np.linspace(-Ly / 2, Ly / 2, Ny)
X, Y = np.meshgrid(x, y)
# Time parameters
dt = 3e-14 # Time step (seconds)
Nt = 451 # Number of time steps
# Wave packet parameters
sigma_x = sigma_y = 15e-9 # Width of the Gaussian packet (meters)
x0, y0 = -2e-7, 0 # Initial position of the packet (meters)
kx0, ky0 = k0, 0 # Initial wave vector
# Initial Gaussian wave packet
psi0 = np.exp(-(X - x0) ** 2 / (2 * sigma_x ** 2)) * np.exp(-(Y - y0) ** 2 / (2 * sigma_y ** 2))
psi0 = psi0.astype(np.complex128)
psi0 *= np.exp(1j * (kx0 * X + ky0 * Y))
# Normalize the initial wave packet
psi0 /= np.sqrt(np.sum(np.abs(psi0) ** 2))
# Fourier space components
kx = np.fft.fftfreq(Nx, dx) * 2 * np.pi
ky = np.fft.fftfreq(Ny, dy) * 2 * np.pi
KX, KY = np.meshgrid(kx, ky)
K2 = KX ** 2 + KY ** 2
# Split-step Fourier method
psi = psi0.copy()
# Prepare for animation
fig = plt.figure(figsize=(12, 9))
# Main plot (takes more space)
ax_main = fig.add_axes([0.1, 0.1, 0.65, 0.65])
# X-projection plot (at the top)
ax_xproj = fig.add_axes([0.18, 0.8, 0.49, 0.15])
# Y-projection plot (on the right)
ax_yproj = fig.add_axes([0.8, 0.1, 0.15, 0.65])
def update(t):
global psi
# Full step in momentum space with kinetic energy operator
psi_k = np.fft.fft2(psi)
psi_k *= np.exp(-1j * hbar * K2 * dt / (2 * m_e))
psi = np.fft.ifft2(psi_k)
# Visualization of wave packet evolution
ax_main.clear()
ax_main.set_xlabel(r'$x$ (m)', fontsize=14)
ax_main.set_ylabel(r'$y$ (m)', fontsize=14)
ax_main.tick_params(which="major", axis="both", direction="in", top=True, right=True, length=5, width=1, labelsize=12)
Rho = np.abs(psi) ** 2
im = ax_main.imshow(Rho, extent=(-Lx / 2, Lx / 2, -Ly / 2, Ly / 2), cmap='hot', animated=True)
ax_main.set_title(f'Time step: {t}', fontsize=14)
# Projection along x-axis
ax_xproj.clear()
ax_xproj.plot(x, np.sum(np.abs(psi) ** 2, axis=0))
ax_xproj.set_xlim(-Lx / 2, Lx / 2)
ax_xproj.set_ylabel(r'$|\psi|^2$', fontsize=14)
ax_xproj.set_title('Projection along X-axis', fontsize=14)
ax_xproj.tick_params(which="major", axis="both", direction="in", top=True, right=True, length=5, width=1, labelsize=12)
# Projection along y-axis
ax_yproj.clear()
ax_yproj.plot(np.sum(np.abs(psi) ** 2, axis=1), y)
ax_yproj.set_ylim(-Ly / 2, Ly / 2)
ax_yproj.set_xlabel(r'$|\psi|^2$', fontsize=14)
ax_yproj.set_title('Projection along Y-axis', fontsize=14, loc='left', pad=20)
ax_yproj.yaxis.tick_right()
ax_yproj.tick_params(which="major", axis="both", direction="in", top=True, right=True, length=5, width=1, labelsize=12)
return [im]
ani = animation.FuncAnimation(fig, update, frames=Nt, repeat=False)
# Save the animation
ani.save('free_particle_evolution_with_projections.mp4', writer='ffmpeg', fps=20)
plt.show()
Key Steps in the Animation Process
- Constants and Parameters:
- Defines physical constants such as the reduced Planck constant \(( \hbar )\), electron mass \(( m_e )\), de Broglie wavelength, and wave number.
- Sets up the simulation domain size and grid spacing for \( x \) and \( y \) dimensions.
- Initial Wave Packet:
- Initializes the wave packet as a Gaussian function with a complex phase factor, normalizing it to ensure accurate probability density.
- Fourier Space Components:
- Calculates wave numbers \(( k_x ), ( k_y )\) and creates a grid in Fourier space for the numerical solution.
- Split-Step Fourier Method:
- Evolves the wave packet in time by alternating between real space and Fourier space to apply the kinetic energy operator.
- Uses the forward and inverse Fourier transforms to switch between spaces, updating the wave packet at each time step.
- Animation Preparation:
- Sets up a figure with three subplots: the main plot shows the probability density \( |\psi|^2 \), and two projections illustrate the wave packet’s spread along the x and y axes.
- The update function is defined to clear and update the plots at each time step, visualizing the wave packet’s evolution.
- Animation Execution:
- Utilizes the
FuncAnimation
function frommatplotlib
to animate the evolution of the wave packet over the specified number of time steps. - Saves the animation as an MP4 file and displays it.
Visualization
- Main Plot: Displays the time evolution of the probability density \( |\psi|^2 \) of the wave packet, illustrating how it spreads over time.
- Top Plot: Shows the projection along the x-axis, highlighting dispersion in the x-direction.
- Right Plot: Presents the projection along the y-axis, demonstrating dispersion in the y-direction.
This comprehensive visualization helps understand the dynamic behavior of free particle wave packets in quantum mechanics, emphasizing the dispersion and spread of the wave packet over time.
References
[1] Max, “Time Evolution of a Free Particle Wave Packet: A Numerical Simulation of Wave Packet Dispersion“, MatterWaveX.Com, August 4, (2024).
I am a science enthusiast and writer, specializing in matter-wave optics and related technologies. My goal is to promote awareness and understanding of these advanced fields among students and the general public.