Floquet analysis of the periodic system
The multi-blade transform of the Linearized dynamics and the multi-blade transform page removes the azimuth
dependence of (1) only for an isotropic system: identical blades on an
axisymmetric support in uniform inflow. Wind shear, tower shadow, gravity, a two-bladed
rotor, or a floating support whose mooring and hydrodynamics break the rotational
symmetry leave the transformed model time-periodic, and the azimuth-averaged model
(4) becomes an approximation. Floquet theory is the exact treatment of the
periodic system. VANE computes it (vane.modal.floquet) and uses it as the
reference for measuring the error of the averaged model.
Floquet decomposition
For the periodic system \(\dot{\mathbf x} = \mathbf A(\psi)\,\mathbf x\) with \(\mathbf A(\psi+2\pi) = \mathbf A(\psi)\) and \(\psi = \Omega t\), Floquet’s theorem [Floquet1883] writes every solution as
with \(T = 2\pi/\Omega\). The Floquet exponents \(\lambda\) are the modal eigenvalues of the periodic system. The natural frequency \(|\lambda|\) and the damping ratio \(-\operatorname{Re}\lambda/|\lambda|\) are read from them as in the time-invariant case. The periodic factor carries the harmonic mode-shape components
VANE provides two independent routes to the exponents, following the wind-turbine
literature on Floquet analysis [Skjoldan2009] [Bir2008]: Hill’s harmonic-balance
method [Hill1886], which recovers the frequencies unfolded
(vane.modal.floquet_modes()), and the monodromy matrix, an independent check
(vane.modal.monodromy_exponents()). Both take the stack of frozen-time matrices
\(\mathbf A(\psi_k)\) over one revolution (for example MBCResult.per_azimuth_a,
kept with retain_per_azimuth=True), the azimuths in radians, and the rotor speed
\(\Omega\) in rad/s.
Hill’s harmonic-balance method
Expand the periodic matrix in a Fourier series and substitute (1). With
\(\mathbf A(\psi) = \sum_n \mathbf A_n e^{j n\psi}\) and
\(\mathbf p(t) = \sum_m \mathbf p_m e^{j m\Omega t}\), matching harmonics turns the
periodic eigenproblem into an ordinary (infinite) eigenproblem for the Hill matrix.
Truncated at \(|m|\le M\) (n_harmonics, default 4), its blocks are
The Fourier coefficients are estimated from the azimuth samples by the discrete transform
The Hill blocks need coefficients up to order \(2M\), so
floquet_modes() requires at least \(4M+1\) samples. With the
default \(M = 4\) this is 17 azimuths; a 36-azimuth sweep allows \(M \le 8\).
Limitation: Hill’s method needs near-uniform azimuths
(3) gives every sample the same weight, which is exact only on a uniform
grid. floquet_modes() therefore requires every azimuth interval,
including the one that closes the revolution, to equal the mean interval within a
relative \(10^{-3}\) (HILL_UNIFORM_RTOL). OpenFAST
linearizes at the time steps nearest the requested azimuths, so the delivered grid
is uneven unless the time step is commensurate with the azimuth spacing
(commensurate_time_step()) and the rotor
runs at its trimmed speed. On an uneven grid floquet_modes(), and
averaging_error(), which uses it, raise a ValueError that
names the worst interval and its relative deviation. Analyse a delivered, uneven
grid with the monodromy route below, which weights each matrix by its own interval
and accepts any distinct azimuths.
The eigenvalues of (2) come in families shifted by \(j m\Omega\); the principal exponents are the physical ones. VANE selects them as the eigenvalues whose eigenvectors concentrate their energy in the fundamental \(m=0\) harmonic block. Candidates are taken in descending order of \(\lVert\mathbf v^{(0)}\rVert / \lVert\mathbf v\rVert\), and one is rejected as a shifted copy of an exponent \(\lambda_a\) already kept when it equals \(\lambda_a + jk\Omega\) (to a small tolerance) and its eigenvector is \(\lambda_a\)’s eigenvector shifted by \(k\) harmonic blocks. The selection stops at \(n\) distinct solutions for \(n\) states. Keeping the \(n\) highest scores is not enough: inside a parametric-resonance region (a mode near \(\Omega/2\), real negative multipliers) the exponents are \(\sigma_{1,2} + j\Omega/2\). The conjugate \(\sigma_1 - j\Omega/2\) of one is its own shifted copy with an equal score, so the top-\(n\) rule would return that pair twice and drop the other family, which may be the unstable one. The eigenvector test keeps distinct solutions that share a multiplier (a repeated eigenvalue, or an isotropic mode at exactly \(\Omega/2\) whose \(\pm j\Omega/2\) pair coincide in the Hill spectrum); a degenerate Hill eigenspace is first rotated so that its basis is ordered by fundamental energy. Ties between a conjugate-symmetric pair prefer the non-negative imaginary part.
The selected set is then compared with the monodromy multipliers below
(\(e^{\lambda T}\), compared modulo \(j\Omega\)), and a RuntimeWarning is
issued if they differ by more than \(10^{-2}\Omega\). The retained eigenvector
blocks are the harmonic mode shapes \(\mathbf p_m\)
(FloquetSolution.harmonic_mode_shapes). Because the frequency is read from the
fundamental block rather than from a wrapped logarithm, Hill’s method returns the
frequencies unfolded, with no ambiguity of a multiple of \(\Omega\). In the
isotropic limit every \(\mathbf A(\psi)\) is equal, so \(\mathbf A_n = 0\) for
\(n\neq 0\), the Hill matrix is block-diagonal, and the \(m=0\) block is
\(\mathbf A_0\). Hill’s method then reduces exactly to the eigenvalues of
\(\mathbf A_0\), the same answer as the averaged model.
The monodromy matrix
The second route integrates the state-transition matrix over one revolution. Holding each sample constant over the azimuth interval that follows it, the monodromy matrix is the ordered product of matrix exponentials
whose eigenvalues are the Floquet multipliers \(\mu = e^{\lambda T}\). The exponents follow from
This route needs no uniform sampling: each matrix is held over its own interval \(\Delta\psi_k\), so it works on any sweep of distinct azimuths, including the uneven grids OpenFAST delivers. It is an independent check on Hill’s method: different arithmetic, no Fourier fit, and no selection rule. Its limitation is intrinsic. The multiplier \(\mu\) is invariant under \(\lambda \mapsto \lambda + j k\Omega\), so (5) fixes the real part (damping or growth rate) exactly but the imaginary part (frequency) only modulo \(\Omega\). The principal branch of the logarithm folds the frequency into the strip \((-\Omega/2,\ \Omega/2]\), so a mode whose damped frequency exceeds \(\Omega/2\) is returned aliased: a 0.8 Hz mode under a 1 Hz rotor comes back at 0.2 Hz. The monodromy exponents are therefore an exact check on damping and on frequencies inside the strip, and Hill’s method gives the unfolded spectrum.
The azimuth-averaging error
The practical use of the Floquet analysis is to measure the error of the averaged
Campbell diagram. vane.modal.averaging_error() compares the Floquet natural
frequencies (from Hill’s method) with those of the averaged model, the eigenvalues of
the mean \(\tfrac{1}{N_\psi}\sum_k \mathbf A(\psi_k)\) that the MBC path uses, and
returns the largest gap
where the matching \(\sigma\) is the optimal one-to-one assignment (Hungarian) between the two spectra, not a pairing by sorted position. Under strong anisotropy the two spectra reorder, and a positional difference would compare different physical modes and could either inflate or hide the gap. For an isotropic rotor \(e_{\text{avg}} = 0\); it grows with anisotropy and indicates when the averaged diagram should be replaced by the Floquet spectrum.
Route |
Sampling |
Frequency |
Role |
|---|---|---|---|
Hill ((2)) |
uniform, \(\ge 4M+1\) |
unfolded |
principal spectrum and harmonic mode shapes |
Monodromy ((4)) |
any distinct azimuths |
folded into \((-\Omega/2,\Omega/2]\) |
independent check of damping and in-strip frequencies |
Both reduce to the averaged answer as the system becomes isotropic. The Floquet analysis therefore reproduces the averaged eigenanalysis when averaging is valid and gives the exact periodic spectrum, with a measured difference, when it is not.
Error estimates without a periodic solution
The same errors can be predicted for each branch from the averaged eigensolution and the
harmonic content of the samples, without solving the periodic problem.
vane.modal.estimate_averaging_error() assembles these estimates; usage is described
in Azimuth averaging. The quantities below use the conventions of
vane.modal.averaging, with azimuths in radians.
Quadrature on the delivered grid. CalcSteady takes each snapshot at the first
time step at or past its target azimuth, so the delivered azimuths are slightly
non-uniform. vane.modal.interval_weights() gives the weights of the periodic
piecewise-linear interpolant of the samples. With the azimuths sorted and
\(g_\ell = \psi_{\ell+1}-\psi_\ell\) the periodic gaps,
which reduces to \(1/N\) on a uniform grid. The difference between the arithmetic mean that the MBC transform applies and this interval-weighted mean is the quadrature error term.
Sampling and aliasing. Represent the samples by a harmonic model
\(\mathbf A(\psi)=\sum_h \mathbf A_h e^{jh\psi}\) (vane.modal.fit_harmonics()).
A weighted mean \(\sum_\ell w_\ell\mathbf A(\psi_\ell)\) then equals
\(\sum_h W(h)\,\mathbf A_h\), with the weight kernel
(vane.modal.weight_kernel())
The matrix error of a grid \(S\) relative to a reference grid is therefore
On a uniform \(N\)-point grid with equal weights, \(W(h)=e^{jh\psi_0}\) when \(N\) divides \(h\) and zero otherwise, so only harmonics at multiples of \(N\) alias onto the mean. For a rotor of \(B\) identical blades the fixed-frame content after MBC lies only at multiples of \(B\), so the first harmonic that aliases is
(first_alias_order()). A count \(N\) that
is not a multiple of \(B\) moves the first alias from \(N\) to \(BN\).
vane.modal.alias_free_azimuth_count() returns the smallest \(N\) with
\(\operatorname{lcm}(N, B)\) above a given harmonic order, and
vane.modal.azimuth_count_table() predicts the error of each uniform count from
the fitted harmonics. The effect of \(\mathbf E\) on each branch follows from
eigenvalue perturbation of the averaged eigensolution, to first or second order, or
with a structured predictor that treats the rotor-azimuth state exactly.
Periodicity. With biorthonormal left and right eigenvectors
\(\mathbf u_k^{\mathsf H}\mathbf v_k = 1\) of the averaged matrix
\(\mathbf A_0\), second-order perturbation of the Hill matrix (2) gives the
sideband correction of mode \(j\) (sideband_correction()),
the estimate of the Floquet exponent minus the averaged eigenvalue. Every mode \(k\) is kept in the sum; truncating it to the modes nearest in detuning is not admissible. The denominator shows where averaging fails: when a mode lies close to a harmonic shift \(\lambda_k - jh\Omega\) of another, the correction grows large.
Azimuth consistency. For a linearization about a periodic orbit, the time derivative
of that orbit solves the linearized equations, so one Floquet exponent is exactly zero.
vane.modal.azimuth_consistency() locates the generator-azimuth and rotor-speed
states, condenses the averaged model onto that pair, and checks that one of the two
sideband-corrected exponents vanishes. The result’s assessment is
"consistent", "inconsistent-but-harmless" or "inconsistent-and-risky".