Time Evolution of a Free Particle Wave Packet: Numerical Simulation of Wave Packet Dispersion

Last Updated on June 28, 2025 by Sushanta Barman

Understanding the time evolution of quantum wave packets is essential for exploring the dynamics of free particles in quantum mechanics. A wave packet represents a localized particle and its motion, governed by the time-dependent Schrödinger equation (TDSE). One of the most fundamental cases is the free particle, where no external potential influences the motion.

In this article, we numerically investigate the time evolution of a Gaussian wave packet representing a free electron in two dimensions (\(x,y\)). The aim is to observe how the wave packet propagates and disperses over time, a key feature of quantum systems due to their probabilistic nature and wave-like behavior.

We implement the split-step Fourier method to solve the TDSE and visualize the spatial probability distribution as the packet evolves. The simulation shows that, in the absence of external forces, the wave packet spreads in space over time, reflecting the natural dispersion of matter waves.

The outcome provides a clear and intuitive understanding of quantum dispersion, uncertainty growth, and matter-wave propagation—concepts central to modern quantum mechanics. It is relevant for areas like electron microscopy, quantum transport, and wave-based quantum technologies.

The system under consideration is a free electron represented by a Gaussian wave packet, as shown in Fig. 1. This wave packet propagates in a two-dimensional domain without external potentials.

The simulation focuses on the evolution of the wave packet over time, governed by the time-dependent Schrödinger equation. Key parameters include the initial position of the electron, wave vector, and the width of the Gaussian packet.

The primary aim is to observe how the wave packet spreads and moves through the domain. This will give us an idea of the behavior of matter waves associated with a free particle in quantum mechanics.

Initial Gaussian wave packet.
Figure 1: Distribution of the probability density in 2D (\(x,y\)) of the initial wave packet.

Time-Dependent Schrödinger Equation (TDSE)

The time-dependent Schrödinger equation (TDSE) in two dimensions for a free particle (i.e., without an external potential) is given by:

\[i\hbar \frac{\partial \psi(x,y,t)}{\partial t} = -\frac{\hbar^2}{2m} \left( \frac{\partial^2 }{\partial x^2} + \frac{\partial^2 }{\partial y^2} \right) \psi(x,y,t) + V(x,y) \psi(x,y,t) \quad (1)\]

Here, \( \psi(x,y,t) \) is the wave function of the particle, depending on position \( (x,y) \) and time \( t \). The symbol \( \hbar \) represents the reduced Planck constant, \( m \) denotes the mass of the particle, and \( i \) is the imaginary unit. For a free particle, \(V(x,y)=0\).

Initial Wave Packet

The initial wave packet is represented by a Gaussian function with a complex phase factor, which models a free electron’s wave function moving along a specific direction. The Gaussian packet is characterized by its position, width, and wave vector components, with motion primarily in one direction.

The initial wave packet \( \psi_0(x,y) \) is defined as:

\[\psi_0(x,y) = \exp \left( -\frac{(x – x_0)^2}{2\sigma_x^2} \right) \exp \left( -\frac{(y – y_0)^2}{2\sigma_y^2} \right) \exp \left( i (k_{x0} x + k_{y0} y) \right),\]

where, \((x_0, y_0)\) is the initial position of the wave packet; \(\sigma_x\) and \(\sigma_y\) are the widths of the Gaussian packet in the \(x\) and \(y\) directions, respectively; and \(k_{x0} = k_0 = 2\pi/ \lambda_{dB}\), \(k_{y0} = 0\) are the components of the initial wave vector, indicating that the wave packet is moving along the \(x\)-direction.

In \(\psi_0(x,y)\), the Gaussian function given by \(\exp \left( -\frac{(x – x_0)^2}{2\sigma_x^2} \right) \exp \left( -\frac{(y – y_0)^2}{2\sigma_y^2} \right)\) describes the spatial distribution of the wave packet, centered at \((x_0, y_0)\) with widths \(\sigma_x\) and \(\sigma_y\).

The complex phase factor in \(\psi_0(x,y)\) is given by \(\exp \left( i (k_{x0} x + k_{y0} y) \right)\), which imparts an initial momentum to the wave packet. The wave vector \((k_{x0}, k_{y0}) = (k_0, 0)\) ensures that the wave packet moves along the \(x\)-direction.

Spatial Discretization

The spatial domain is discretized into a grid with \( N_x \) and \( N_y \) points along the \( x \) and \( y \) axes, respectively. The grid spacings, \(\Delta x\) and \(\Delta y\), are defined as:

\[\Delta x = \frac{L_x}{N_x},\text{ and }\quad \Delta y = \frac{L_y}{N_y}\]

where \( L_x \) and \( L_y \) are the lengths of the simulation domain in the \( x \) and \( y \) directions. The positions \( x \) and \( y \) are given by:

\[x_i = -\frac{L_x}{2} + i \Delta x, \quad i = 0, 1, \ldots, N_x – 1\]

\[y_j = -\frac{L_y}{2} + j \Delta y, \quad j = 0, 1, \ldots, N_y – 1\]

The wave function \(\psi(x,y,t)\) is evaluated at these discrete grid points, resulting in a matrix representation \(\psi_{i,j}(t)\).

Temporal Discretization

The temporal domain is discretized into \( N_t \) time steps with a time step size \(\Delta t\):

\[\Delta t = 3 \times 10^{-14} \, \text{seconds}\]

The time evolution is computed over these discrete time steps, where \( t_n \) is given by:

\[t_n = n \Delta t, \quad n = 0, 1, \ldots, N_t – 1\]

Split-Step Fourier Method

The split-step Fourier method splits the time evolution into parts: evolution in real space (for potential energy) and in Fourier space (for kinetic energy).

  • 1/2 Evolution for the Potential Energy in Real Space

For a free particle, the potential energy term \( V(x,y) = 0 \), so this step can be represented as:

\[\psi(x,y,t + \frac{\Delta t}{2}) = \psi(x,y,t) \exp \left( -i \frac{V(x,y) \Delta t}{2\hbar} \right)\]

For a free particle, \( V(x,y) = 0 \), hence this step does not affect \( \psi \).

  • Fourier Transform

Apply the Fourier transform to the wave function \( \psi(x,y,t) \) to obtain \( \tilde{\psi}(k_x, k_y, t) \):

\[\tilde{\psi}(k_x, k_y, t) = \mathcal{F}[\psi(x,y,t)]\]

  • Full Evolution for the Kinetic Energy in Fourier Space

In Fourier space, the kinetic energy operator is diagonal:

\[\tilde{\psi}(k_x, k_y, t + \Delta t) = \tilde{\psi}(k_x, k_y, t) \exp \left( -i \frac{\hbar k^2 \Delta t}{2m} \right),\]

where \( k^2 = k_x^2 + k_y^2 \).

  • Inverse Fourier Transform

Transform back to real space to obtain \( \psi(x,y,t + \Delta t) \):

\[\psi(x,y,t + \Delta t) = \mathcal{F}^{-1}[\tilde{\psi}(k_x, k_y, t + \Delta t)]\]

  • 1/2 Evolution for the Potential Energy in Real Space

Again, apply half-step evolution for potential energy in real space:

\[\psi(x,y,t + \Delta t) = \psi(x,y,t + \frac{\Delta t}{2}) \exp \left( -i \frac{V(x,y) \Delta t}{2\hbar} \right)\]

For a free particle, \( V(x,y) = 0 \), so this step does not affect \( \psi \).

Simulation Parameters

ParameterSymbolValue
Reduced Planck constant\( \hbar \)\( 1.0545718 \times 10^{-34} \) J·s
Mass of electron\( m_e \)\( 9.10938356 \times 10^{-31} \) kg
de Broglie wavelength\( \lambda \)\( 20 \times 10^{-9} \) m
Wave number\( k_0\)\( 2 \pi / \lambda \)
Simulation domain size\( L_x, L_y \)\( 1 \times 10^{-6} \) m
Number of grid points\( N_x, N_y \)512
Grid spacing\( \Delta x, \Delta y \)\( L_x / N_x, L_y / N_y \)
Time step\( \Delta t \)\( 3 \times 10^{-14} \) s
Number of time steps\( N_t \)501
Initial position of the packet\( x_0, y_0 \)\( -2 \times 10^{-7}, 0 \) m
Width of Gaussian packet\( \sigma_x, \sigma_y \)\( 15 \times 10^{-9} \) m
Initial wave vector components\( k_{x0}, k_{y0} \)\( k_0, 0 \)
Table I: Values of different parameters used in the simulation.

This Python code simulates the evolution of a free electron’s wave packet using the split-step Fourier method. The primary focus is to visualize the propagation of a Gaussian wave packet over time.

Wave Packet Simulation


import numpy as np
import matplotlib.pyplot as plt

# 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 = 501  # 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()

for t in range(Nt):
    # (a) 1/2 Evolution for the potential energy in real space (skipped for free particle)
    
    # (b) Forward transform
    psi_k = np.fft.fft2(psi)
    
    # (c) Full evolution for the kinetic energy in Fourier space
    psi_k *= np.exp(-1j * hbar * K2 * dt / (2 * m_e))
    
    # (d) Inverse Fourier transform
    psi = np.fft.ifft2(psi_k)
    
    # (e) 1/2 Evolution for the potential energy in real space (skipped for free particle)

    # Visualization of wave packet evolution
    if t % 50 == 0:
        plt.figure(figsize=(6, 5))
        Rho = np.abs(psi) ** 2 
        plt.imshow(Rho, extent=(-Lx / 2, Lx / 2, -Ly / 2, Ly / 2), cmap='hot')
        plt.colorbar()
        plt.title(f'Time step: {t}')
        plt.xlabel(r'$x$ (m)', fontsize=14)
        plt.ylabel(r'$y$ (m)', fontsize=14)
        plt.tick_params(which="major", axis="both", direction="in", top=True, right=True, length=5, width=1, labelsize=12)
        plt.pause(1)  # Pause for 1 second
        plt.close()
                

Description of the Code

  1. Import Libraries: Import numpy for numerical operations and matplotlib.pyplot for visualizations.
  2. Constants: Define physical constants such as reduced Planck constant \(( \hbar )\), electron mass \(( m_e )\), de Broglie wavelength, and wave number \(( k_0 )\).
  3. Grid Parameters: Set up the simulation domain size and grid spacing for \( x \) and \( y \) dimensions.
  4. Time Parameters: Define the time step \(( \Delta t )\) and the number of time steps \(( N_t )\).
  5. Wave Packet Parameters: Specify the initial position, width, and wave vector components of the Gaussian wave packet.
  6. Initial Wave Packet: Initialize the wave packet as a Gaussian function with a complex phase factor for initial momentum.
  7. Fourier Space Components: Calculate wave numbers \(( k_x ), ( k_y )\) and create a grid in Fourier space.
  8. Split-Step Fourier Method:
    • Perform a forward Fourier transform of the wave packet.
    • Apply the kinetic energy evolution operator in Fourier space.
    • Perform an inverse Fourier transform to return to real space.
  9. Visualization: Periodically visualize the evolution of the wave packet at specified time intervals.
Time evolved distribution of probability density for the wave packet.
Figure 2: Simulation result showing the probability density distribution (\left| \psi(x, y) \right|^2) of the wave packet after 450 time steps.

The simulation results illustrate the time evolution of a Gaussian wave packet representing a free particle. Initially, the wave packet is localized, with its peak centered at the specified initial position.

As time progresses, the wave packet undergoes dispersion, a characteristic behavior of free particles in quantum mechanics.

The plot displays the probability density, \( |\psi|^2 \), indicating the likelihood of finding the particle at various positions over time. Clearly, the wave packet spreads in each dimension as it propagates.

The analytical form of the width can be derived from the time-dependent Schrödinger equation. If the initial width of the Gaussian wave packet is \(\sigma_{x0}\), the width \(\sigma_x(t)\) at time \(t\) is given by:

\[\sigma_x(t) = \sigma_{x0} \sqrt{1 + \left( \frac{\hbar t}{m \sigma_{x0}^2} \right)^2 }\]

A similar expression can be obtained for \(\sigma_y(t)\).

This visualization enhances understanding of the dynamics of free particles, showing how an initially localized wave packet evolves into a more diffuse distribution. This spread is indicative of increasing uncertainty in the particle’s position.

Overall, this simulation effectively captures the core principles of wave packet evolution in quantum mechanics, providing a clear demonstration of dispersion and the associated increase in positional uncertainty.

The animation consists of three plots:

  1. Main Plot: Displays the time evolution of the probability density \( |\psi|^2 \) of a free particle’s wave packet, illustrating how the wave packet spreads over time.
  2. Top Plot: Shows the projection of the wave packet along the x-axis, highlighting the dispersion and spread in the x-direction.
  3. Right Plot: Presents the projection of the wave packet along the y-axis, demonstrating the dispersion and spread in the y-direction.

These plots collectively illustrate the dynamic behavior of a free particle’s wave packet in quantum mechanics. The code used to animate the simulation results for a free particle wave packet evolution can be found in Ref. [1].

This article demonstrated the time evolution of a Gaussian wave packet representing a free electron using the time-dependent Schrödinger equation (TDSE). Through numerical simulations, we observed the dispersion and spreading of the wave packet over time, providing a clear visualization of free particle dynamics in quantum mechanics.

The study highlighted key principles such as wave packet dispersion and the associated increase in positional uncertainty. The presented methods and results serve as valuable resources for understanding fundamental quantum behavior, making them beneficial for both students and researchers in the field.

[1] Sushanta Barman, “A Python Code for Animating Free Particle Wave Packet EvolutionMatterWaveX.Com, August 4, (2024).

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top