Trapped-Ion Position-Grid Emulation

This example builds a static single-ion Hamiltonian with trapped_ion(). Each ion is one MPO site, and the local basis is a finite position grid. The Hamiltonian contains a finite-difference kinetic term and a harmonic trap.

We initialize a displaced harmonic-oscillator ground-state wavepacket in a static central well. In the continuum limit, its center follows \(\langle x(t)\rangle = x_0 \cos(\omega t)\), so after half a trap period it reaches the opposite turning point.

Static central well

 1import numpy as np
 2
 3from mqt.yaqs import AnalogSimParams, Hamiltonian, MPO, Simulator, State
 4
 5omega = 1.0
 6initial_displacement = 1.0
 7half_period = np.pi / omega
 8
 9positions = np.linspace(-8.0, 8.0, 33)
10grid_dim = len(positions)
11
12initial_grid_state = np.exp(-0.5 * (positions - initial_displacement) ** 2).astype(np.complex128)
13initial_grid_state /= np.linalg.norm(initial_grid_state)
14
15hamiltonian = Hamiltonian.from_mpo(MPO.trapped_ion(positions, masses=[1.0], omega=omega))
16state = State(length=1, vector=initial_grid_state, physical_dimensions=[grid_dim])
17
18params = AnalogSimParams(
19    observables=[],
20    elapsed_time=half_period,
21    dt=half_period / 16,
22    max_bond_dim=None,
23    svd_threshold=1e-12,
24    krylov_tol=1e-12,
25    preset="exact",
26    get_state=True,
27    sample_timesteps=False,
28)
29
30result = Simulator(parallel=False, show_progress=False).run(state, hamiltonian, params)
31assert result.output_state is not None
32final_state = result.output_state.vector
33final_x = float(np.sum(positions * np.abs(final_state) ** 2))
34
35print(f"Initial <x>       = {initial_displacement:.6f}")
36print(f"Final <x> at T/2  = {final_x:.6f}")
37print(f"Continuum target  = {-initial_displacement:.6f}")
Initial <x>       = 1.000000
Final <x> at T/2  = -0.981441
Continuum target  = -1.000000

The final value is close to \(-x_0\) but not exact because the simulation uses a finite grid and a finite-difference kinetic operator.