Skip to content

Eigenstates

Eigenstates from imaginary time evolution.

Propagating in imaginary time, \(\Delta t = -i\tau\), damps each eigenstate as \(e^{-E_n\tau}\), so any start state relaxes to the ground state. Excited states follow by repeatedly projecting out the states found before (Gram-Schmidt), which leaves the lowest remaining state to survive.

lowest_eigenstates(grid, n_states, dt=0.01, tol=1e-10, max_steps=100000, check_every=20, rng=None)

Find the lowest eigenstates by imaginary time evolution.

Each state starts from random noise, which overlaps with every eigenstate, and is propagated in imaginary time. Every check_every steps the states found before are projected out and the state is renormalized. A state counts as converged when its energy \(\langle H\rangle\) changes by less than tol (relative to \(\max(1, |E|)\)) between two checks.

The states are eigenstates of the split operator propagator, which differ from the exact ones by \(O(\Delta t^2)\); the energies are variational and accurate to \(O(\Delta t^4)\). Convergence is slow for nearly degenerate states: the error decays as \(e^{-(E_{n+1}-E_n)\tau}\).

Parameters:

Name Type Description Default
grid Grid object

Grid with a time-independent potential. Afterwards grid.psi holds the ground state; grid.t is unchanged.

required
n_states int

Number of states.

required
dt float

Imaginary time step \(\tau\).

0.01
tol float

Convergence tolerance for the energy; for a complex64 grid it is at least 10 * numpy.finfo(numpy.float32).eps, about 1e-6.

1e-10
max_steps int

Maximum number of steps per state; a warning is logged if a state has not converged by then.

100000
check_every int

Steps between projections and convergence checks.

20
rng Generator or int

Random generator or seed for the start states.

None

Returns:

Name Type Description
energies array

Energies \(E_0 \le E_1 \le \dots\)

states list of arrays

Normalized, mutually orthogonal eigenstates.

ground_state(grid, dt=0.01, tol=1e-10, max_steps=100000, rng=None)

Relax grid.psi to the ground state by imaginary time evolution.

See :func:lowest_eigenstates for the parameters.

Returns:

Name Type Description
E0 float

Ground state energy; grid.psi holds the ground state.