Summary
Once the forward Euler-Lagrange integration has a per-column absolute tolerance (#480), W⁻¹ = U₁U₂⁻¹ stays Hermitian to roundoff between singular surfaces. The non-Hermiticity that remains is added at each ideal singular-surface crossing. This is the residual left over from #93 after that fix.
Figure: https://claude.ai/artifact/8VJSoYZRUPDZvKqryqY5aP
Evidence
DIIID-like_ideal_example, n = 1, fixed axis start (frobenius_psi_max = 0), ucrit = 1e3, on the #480 branch. Values are the stability check's ‖anti-Hermitian‖/‖Hermitian‖ of W⁻¹ at every saved step:
| Region |
Non-Hermiticity |
| Axis to the first rational surface (q = 2) |
median 1.2e-14, at most 3.2e-12 |
| After the q = 2 crossing |
about 9e-5, never returning to roundoff |
| Steps above the 1e-3 warning threshold |
6, all peaks between surfaces (q ≈ 2.54, 3.80, 4.67, 5.85) |
The jump happens exactly at the first crossing, and each later crossing leaves a similar level. The flagged steps are not at the surfaces: they are where the ~1e-4 defect is amplified between them.
Likely source
cross_ideal_singular_surf! zeroes one column, takes a two-point trapezoidal step across 2·dpsi, and substitutes the asymptotic small solution. That is the one operation in the integration that does not preserve U₁†U₂ − U₂†U₁ = 0.
Candidate fixes, from the discussion on #93:
- Re-project U onto the symplectic constraint right after each crossing.
- Replace the trapezoidal jump with a few sub-steps of the ODE integrator.
- Evaluate the asymptotic extraction (
sing_get_ca / sing_get_ua) in extended precision.
Related
Summary
Once the forward Euler-Lagrange integration has a per-column absolute tolerance (#480), W⁻¹ = U₁U₂⁻¹ stays Hermitian to roundoff between singular surfaces. The non-Hermiticity that remains is added at each ideal singular-surface crossing. This is the residual left over from #93 after that fix.
Figure: https://claude.ai/artifact/8VJSoYZRUPDZvKqryqY5aP
Evidence
DIIID-like_ideal_example, n = 1, fixed axis start (frobenius_psi_max = 0),ucrit = 1e3, on the #480 branch. Values are the stability check's ‖anti-Hermitian‖/‖Hermitian‖ of W⁻¹ at every saved step:The jump happens exactly at the first crossing, and each later crossing leaves a similar level. The flagged steps are not at the surfaces: they are where the ~1e-4 defect is amplified between them.
Likely source
cross_ideal_singular_surf!zeroes one column, takes a two-point trapezoidal step across2·dpsi, and substitutes the asymptotic small solution. That is the one operation in the integration that does not preserve U₁†U₂ − U₂†U₁ = 0.Candidate fixes, from the discussion on #93:
sing_get_ca/sing_get_ua) in extended precision.Related