3. Splitting methods

fh_comm supports common splitting methods, also called product rules, by computing the corresponding coefficients for the matrix exponentials.

[1]:
import fh_comm as fhc

A basic example is the Strang (second order Suzuki) splitting method for two Hamiltonian terms: given \(H = A + B\), we can approximate the quantum time evolution operator (matrix exponential of \(H\)) for a time step \(t\) as

\[e^{-i t H} = e^{-i t A/2} \, e^{-i t B} \, e^{-i t A/2} + \mathcal{O}(t^3),\]

where one assumes that the exponentials on the right are easier to evaluate than \(e^{-i t H}\) directly.

[8]:
# fhc.SplittingMethod.suzuki(nterms, k) constructs
# the Suzuki product rule for `nterms` terms and order `2 k`
strang = fhc.SplittingMethod.suzuki(2, 1)
print(strang)
Splitting method of order 2 for 2 terms using 3 layers,
  indices: [0, 1, 0]
  coeffs:  [0.5, 1.0, 0.5]

Here, coeffs are the coefficients in the matrix exponentials, and indices the respective indices of the Hamiltonian terms (i.e., whether to use \(A\) or \(B\)).

The Strang splitting method for three Hamiltonian terms, \(H = A + B + C\), reads

\[e^{-i t H} = e^{-i t A/2} \, e^{-i t B/2} \, e^{-i t C} \, e^{-i t B/2} \, e^{-i t A/2} + \mathcal{O}(t^3).\]

Let’s see how this is reflected in the coefficients and indices:

[9]:
strang3 = fhc.SplittingMethod.suzuki(3, 1)
print(strang3)
Splitting method of order 2 for 3 terms using 5 layers,
  indices: [0, 1, 2, 1, 0]
  coeffs:  [0.5, 0.5, 1.0, 0.5, 0.5]

The symmetric integration method by Yoshida of order 4:

[14]:
print(fhc.SplittingMethod.yoshida4(2))
Splitting method of order 4 for 2 terms using 7 layers,
  indices: [0, 1, 0, 1, 0, 1, 0]
  coeffs:  [0.6756035959798289, 1.3512071919596578, -0.17560359597982889, -1.7024143839193155, -0.17560359597982889, 1.3512071919596578, 0.6756035959798289]

As final example, we construct the fourth-order Suzuki method:

[10]:
print(fhc.SplittingMethod.suzuki(2, 2))
Splitting method of order 4 for 2 terms using 11 layers,
  indices: [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0]
  coeffs:  [0.20724538589718786, 0.4144907717943757, 0.4144907717943757, 0.4144907717943757, -0.12173615769156357, -0.6579630871775028, -0.12173615769156357, 0.4144907717943757, 0.4144907717943757, 0.4144907717943757, 0.20724538589718786]

fh_comm implements Suzuki methods of arbitrary order.