I'm solving for a quantum system's evolution operator $U_S(t)$ using two different Interaction Pictures.
The physical evolution is described by the Schrodinger equation for the evolution operator $U(t)$:$$i \frac{d}{dt}U(t) = H(t) U(t)$$
The "Interaction Picture" is a mathematical change of reference frame via transformation $U_0(t)$. The underlying physical evolution of the system is independent of this choice, so the final evolution operator in the original "lab frame" (the Schrödinger Picture) must be the same. Assuming $U_0(0)$ is an identity matrix, the final result is calculated via $U_S(t) = U_0(t) \cdot U_I(t)$, which must be independent of the choice of $U_0(t)$.
Transformation of the Hamiltonian following the rule: $$H_I(t) = U_0^\dagger(t) H_S(t) U_0(t) - i U_0^\dagger(t) \frac{d}{dt}U_0(t)$$
After solving in each picture and transforming back to the Schrödinger picture, the final results (UFinal1 and UFinal2) should be identical.
However, the outcomes solved by NDSolveValue is difference.
Minimal Working Code:
(*1. Setup*)ClearAll["Global`*"];
$PrePrint = If[MatrixQ[#], MatrixForm[#], #] &;
SI = IdentityMatrix[2]; SX = PauliMatrix[1]; SZ = PauliMatrix[3];
KRON = KroneckerProduct; ME = MatrixExp; FS = FullSimplify;
X1 = KRON[SI, SX]; Z1 = KRON[SI, SZ]; Z2 = KRON[SZ, SI];
Eavg = 15.0`30*2*Pi; \[CapitalDelta] = 0.3`30*2*Pi; \[CapitalOmega] =
0.01`30*2*Pi;
T = Pi/\[CapitalOmega]; \[Omega] = Eavg + \[CapitalDelta]/2;
H[t_] := \[CapitalOmega]*Cos[\[Omega]*t]*
X1 + \[CapitalDelta]/4 (Z1 - Z2) + Eavg/2*(Z1 + Z2);
(*2. Pre-calculate analytical Hamiltonians*)
U1[t_] = ME[-I*(\[CapitalDelta]/4 (Z1 - Z2) + Eavg/2*(Z1 + Z2))*t];
h1Analytical =
Inverse[U1[t]] . H[t] . U1[t] + I*D[Inverse[U1[t]], t] . U1[t] // FS;
U2[t_] = ME[-I*(Eavg/2*(Z1 + Z2))*t];
h2Analytical =
Inverse[U2[t]] . H[t] . U2[t] + I*D[Inverse[U2[t]], t] . U2[t] // FS;
(*3. Numerical Solution*)
sol1 = NDSolveValue[{-I*u'[t] == h1Analytical . u[t],
u[0] == IdentityMatrix[4]}, u, {t, 0, T},
WorkingPrecision -> 10][T];
UFinal1 = U1[T] . sol1
sol2 = NDSolveValue[{-I*u'[t] == h2Analytical . u[t],
u[0] == IdentityMatrix[4]}, u, {t, 0, T},
Method -> "StiffnessSwitching", WorkingPrecision -> 10,
AccuracyGoal -> 10, PrecisionGoal -> 10][T];
UFinal2 = U2[T] . sol2
(*4. Check Consistency*)
Print["Fidelity ", Tr[UFinal1\[ConjugateTranspose] . UFinal2]/4];