Bose-Hubbard ring: coherence and interaction-driven localization#
The Bose-Hubbard model describes lattice bosons in optical lattices and related interacting bosonic systems.[1][2] In one dimension,
At integer filling the thermodynamic model supports superfluid and Mott-insulating regimes. A six-site unit-filled ring is too small to define a phase boundary, but it resolves the suppression of number fluctuations and long-range one-body coherence as \(U/J\) grows.[3]
The calculation uses \(L=N=6\), for which
Model#
import numpy as np
from edinpy import boson as edb
L = N = 6
J = 1.0
U = 8.0
modes = edb.BosonModes(edb.DoF(L, name="site"))
sector = edb.NParticleSector(modes, N=N).build()
b = edb.set_notation(edb.Annihilation, modes)
bd = edb.set_notation(edb.Creation, modes)
n = edb.set_notation(edb.Number, modes)
H = 0
for i in range(L):
H += edb.Hopping(i, (i + 1) % L, -J, modes)
H += edb.Hubbard(i, U, modes)
hamiltonian = edb.Hamiltonian(H, sector)
hamiltonian.eigsolve(k=1, which="SA")
psi0 = hamiltonian.eigenstate(0)
One-body density matrix and natural occupations#
The one-body density matrix is
Its eigenvalues \(n_\alpha\) are the natural occupations,
The largest occupation \(n_0\) defines the finite-system Penrose-Onsager condensate fraction \(n_0/N\).[4]
def one_body_density_matrix(psi):
return np.asarray(
[
[psi.dag * bd(i) * b(j) * psi for j in range(L)]
for i in range(L)
],
dtype=complex,
)
rho = one_body_density_matrix(psi0)
natural_occupations = np.linalg.eigvalsh(rho)[::-1]
condensate_fraction = natural_occupations[0] / N
Largest natural occupation divided by particle number. The dominant one-body mode loses weight as repulsive interactions localize particles in the site basis.#
Onsite number fluctuations#
At unit filling the local number variance is
def number_variance(psi):
values = []
for i in range(L):
mean = np.real(psi.dag * n(i) * psi)
mean2 = np.real(psi.dag * n(i) * n(i) * psi)
values.append(mean2 - mean**2)
return np.mean(values)
Site-averaged number variance. The reduction of \(\Delta n^2\) is the finite-cluster signature of interaction-driven number localization at commensurate filling.#
Real-space one-body coherence#
The translationally averaged first-order correlation function is
def g1(psi, r):
return np.real(
sum(
psi.dag * bd(i) * b((i + r) % L) * psi
for i in range(L)
) / L
)
First-order coherence at three interaction strengths. Long-range coherence is strongest in the weakly interacting ring and is progressively suppressed as onsite repulsion increases.#
Density structure factor#
With filling \(\bar n=N/L\), define
and
def density_structure_factor(psi, q):
delta_n_q = sum(
(
np.exp(-1j * q * j) * (n(j) - N / L)
for j in range(L)
),
start=0,
)
return np.real(
psi.dag * delta_n_q.dag * delta_n_q * psi
) / L
Connected density structure factor. Repulsion redistributes density fluctuations over the discrete momenta while the overall fluctuation scale is suppressed toward the strongly interacting unit-filled limit.#
The one-body density matrix, \(g^{(1)}(r)\), and \(S_n(q)\) are built directly from creation, annihilation, and number operators, so their definitions remain identical throughout the interaction sweep.