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.