Floquet analysis¶
Stability of time-periodic flows by the Hill method: the Floquet exponents are eigenvalues of one large, structured problem.
For a linear system with a periodic coefficient, \(\dot q + L(t)\,q = 0\) with period \(2\pi/\omega\), solutions are \(q = e^{\mu t} p(t)\) with \(p\) periodic. Expanding \(p = \sum_n p_n e^{i n \omega t}\) turns the problem into the Hill eigenvalue problem
block-banded, with time discretised spectrally like space. The exponents \(\mu\) are defined modulo \(i\omega\).
A first example: Mathieu’s equation¶
import numpy as np
from conatus.expert import HillBlocks, exponents_dense
a, q = 1.5, 0.5 # Mathieu x'' + (a - 2q cos 2t) x = 0, period pi
L0 = np.array([[0, -1], [a, 0]], complex)
C = np.array([[0, 0], [-q, 0]], complex) # -2q cos 2t = -q (e^{2it} + e^{-2it})
H = HillBlocks(diag=lambda mu, n: L0 + (mu + 2j * n) * np.eye(2), couplings={1: C, -1: C},
Nh=24, size=2, label="Mathieu", omega=2.0, mass=np.eye(2))
mus = exponents_dense(H, finite_cap=1e3) # every Floquet exponent, modulo i omega
print(H.explain())
HillBlocks takes the diagonal block, the couplings by harmonic and the number of harmonics Nh.
exponents_dense returns all exponents; secant_root refines one of them on the exact
determinant and returns a SecantRoot (mu, converged, residual = the scaled determinant at
mu, iterations, reasons). A search that ends on max_iterations raises ConvergenceError
carrying the last iterate (err.result) unless allow_unconverged=True, which returns it with
converged=False.
A discretised time-periodic problem¶
For a time-periodic flow given as a discretised problem, hill_from_plan builds the Hill operator
from the harmonics of the base flow, and checks that the operator is linear in it: the blocks
\(L_m\) of the formula above are read from the plan, not written by hand. No resolution is chosen
for you: the spatial resolution, the number of harmonics Nh and the number of base-flow harmonics
kept are all arguments.
Any model about a periodic base flow¶
In the native layer, m.linearize(about={u: lambda y, t: ...}, period=P).floquet(N, k=..., method="hill", Nh=..., targets=[...], tol=1e-12) gives the exponents of one wavenumber, from the same
operator as the transient gain (Non-modal analysis). The expert form
conatus.growth.floquet_exponents(build, base_harmonics, kx, kz, method=..., fields=...) takes a
linear problem per wave; method="monodromy" compares with the eigenvalues of the time-stepped
monodromy matrix.
In a spherical shell, where the Hill operator would be very large, conatus.floquet.shell_floquet
uses the one-period map of the time stepper and Arnoldi iteration instead: Spherical shells.
Validation¶
An exponent is trusted when it is found again: refine the spatial resolution and the number of
harmonics Nh until its digits stop moving, and check that its residual (residual of a
SecantRoot, residuals of a native floquet result) stays at round-off. Exponents are defined
modulo \(i\omega\): compare them after folding the imaginary part into one band.
See also: HillBlocks, hill_from_plan, secant_root, and the mathematics in Floquet–Hill analysis of time-periodic flows.