Skip to content

vibration.structural.experimental_sea

Experimental statistical energy analysis: coupling loss factors from measured energies (Norton & Karczub Ch. 6).

Statistical energy analysis (SEA) has two routes to the coupling loss factor eta_ij. The predictive route derives it from a wave transmission coefficient at the junction, which is what coupling_loss_factor does with the closed-form coefficients of junction_transmission. The experimental route, implemented here, inverts the steady-state power balance from measured subsystem energies: it needs no model of the junction at all, and it is the only route open for real joints (welds, bolt rows, spot welds, adhesives) whose wave behaviour is not tractable.

For two subsystems the steady-state power balance is (Norton Eqs. 6.10 and 6.11, generalised to a drive on either subsystem):

with the band energy of subsystem i (mass times the space- and time-averaged mean-square velocity), eta_i its internal loss factor and omega the band centre frequency in rad/s. Two inversions follow.

Single drive plus reciprocity (power_injection_clf). Drive subsystem 1 only. The second equation with gives one relation between eta_12 and eta_21; the SEA consistency (reciprocity) relationship (Eq. 6.8) supplies the second, so with the modal densities n_1, n_2 known (Eq. 6.15):

The input power reduces to the total dissipated power, as it must in the steady state: substituting the balance of subsystem 2 into Eq. (6.10) cancels the two coupling terms exactly. The bracket is positive exactly when the modal energy of the driven subsystem exceeds that of the receiver, ; a measurement that violates it is not a two-subsystem SEA system and is rejected.

Two drives, no reciprocity assumed (power_injection_matrix). The classical power-injection method drives each subsystem in turn and measures both energies each time, giving four equations for the four unknowns eta_1, eta_2, eta_12, eta_21 with no prior assumption at all. Reciprocity then becomes a check on the measurement rather than an input: PowerInjectionResult.modal_density_ratio compares the measured with the expected .

Modal densities for the usual subsystems are provided as well (flat_plate_modal_density, cylindrical_shell_modal_density, bar_modal_density, beam_modal_density), following Norton Eqs. 6.23-6.29. The flat-plate expression is the same quantity as EN 12354-4’s (modal_density), only parametrised by the plate itself rather than by its critical frequency; the two agree identically and a regression test pins that.

Auto-generated from the source docstrings by scripts/generate_api_docs.py (make api-docs). Do not edit by hand.

bar_modal_density(length: float, longitudinal_wave_speed: float) -> float

Modal density of a uniform bar in longitudinal vibration (Eq. 6.23).

, independent of frequency.

Parameters

NameDescription
lengthBar length L, in m (> 0).
longitudinal_wave_speedBar wave speed , in m/s (> 0).

Returns: The modal density n(f), in modes per hertz.

Raises

ExceptionWhen
ValueErrorfor a non-positive input.
beam_modal_density(
frequency: ArrayLike,
length: float,
mass_per_length: float,
bending_stiffness: float,
) -> NDArray[np.float64]

Modal density of a uniform beam in flexure (Norton Eq. 6.24).

: unlike every other subsystem here, it decreases with frequency.

Parameters

NameDescription
frequencyBand centre frequency f, in hertz (scalar or array, > 0).
lengthBeam length L, in m (> 0).
mass_per_lengthMass per unit length rho A, in kg/m (> 0).
bending_stiffnessFlexural stiffness E I, in N.m^2 (> 0).

Returns: The modal density n(f), in modes per hertz.

Raises

ExceptionWhen
ValueErrorfor a non-positive input.
cylindrical_shell_modal_density(
frequency: ArrayLike,
area: float,
thickness: float,
mean_radius: float,
longitudinal_wave_speed: float,
*,
band: str = 'octave',
) -> NDArray[np.float64]

Average modal density of a thin-walled cylinder (Norton 6.27-6.29).

The semi-empirical approximations of Szechenyi, as collected by Clarkson & Pope, in three regimes of around the ring frequency ring_frequency:

with the bandwidth factor . These are average values: they do not resolve the large fluctuations that the cut-on of successive circumferential orders produces below the ring frequency, which for long thin shells can be substantial.

Parameters

NameDescription
frequencyBand centre frequency f, in hertz (scalar or array, > 0).
areaShell surface area S, in m^2 (> 0).
thicknessWall thickness t, in m (> 0).
mean_radiusMean shell radius a_m, in m (> 0).
longitudinal_wave_speedPlate wave speed cL, in m/s (> 0).
bandAnalysis bandwidth, "octave" (Default, ) or "third" ().

Returns: The modal density n(f), in modes per hertz.

Raises

ExceptionWhen
ValueErrorfor a non-positive input or an unknown band.
flat_plate_modal_density(
area: float,
thickness: float,
longitudinal_wave_speed: float,
) -> float

Modal density of a flat plate in flexure (Norton Eq. 6.25).

, independent of frequency, with the plate (quasi-longitudinal) wave speed .

Parameters

NameDescription
areaPlate surface area S, in m^2 (> 0).
thicknessPlate thickness t, in m (> 0).
longitudinal_wave_speedPlate wave speed cL, in m/s (> 0).

Returns: The modal density n(f), in modes per hertz.

Raises

ExceptionWhen
ValueErrorfor a non-positive input.
power_injection_clf(
frequency: ArrayLike,
energy1: ArrayLike,
energy2: ArrayLike,
internal_loss_factor1: ArrayLike,
internal_loss_factor2: ArrayLike,
modal_density1: ArrayLike,
modal_density2: ArrayLike,
) -> PowerInjectionResult

Coupling loss factors from a single-drive energy measurement.

Subsystem 1 is driven and subsystem 2 receives power only through the junction. Inverting the steady-state balance of subsystem 2 together with the reciprocity relationship gives

Energies are with M_i the subsystem mass and the space- and time-averaged mean-square velocity in the band.

Parameters

NameDescription
frequencyBand centre frequencies f, in hertz (> 0).
energy1Band energy E_1 of the driven subsystem, in J (> 0).
energy2Band energy E_2 of the receiving subsystem, in J (> 0).
internal_loss_factor1eta_1 (> 0), scalar or per band.
internal_loss_factor2eta_2 (> 0), scalar or per band.
modal_density1n_1, in modes per hertz (> 0).
modal_density2n_2, in modes per hertz (> 0).

Returns: A PowerInjectionResult (method "single-drive").

Raises

ExceptionWhen
ValueErrorfor a non-positive input, mismatched band lengths, or a measurement with (the receiving subsystem holds at least as much modal energy as the driven one, so no two-subsystem SEA model fits it).
power_injection_matrix(
frequency: ArrayLike,
energies: ArrayLike,
input_powers: ArrayLike,
) -> PowerInjectionResult

Full two-drive power-injection inversion (no reciprocity assumed).

Each subsystem is driven in turn with a known injected power while both band energies are measured, giving four equations for the four unknowns eta_1, eta_2, eta_12, eta_21. Because reciprocity is not used, PowerInjectionResult.modal_density_ratio becomes an independent check on the measurement.

Parameters

NameDescription
frequencyBand centre frequencies f, in hertz (> 0), shape (nb,).
energiesMeasured band energies, in joules, shape (2, 2, nb): energies[i][j] is the energy of subsystem i while subsystem j is driven (all > 0).
input_powersInjected powers, in watts, shape (2, nb): input_powers[j] is the power injected into subsystem j during test j (all > 0).

Returns: A PowerInjectionResult (method "two-drive"); its energy1/energy2 and input_power1/input_power2 report the first test (subsystem 1 driven).

Raises

ExceptionWhen
ValueErrorfor a bad shape, a non-positive value, or a singular energy matrix in some band.
PowerInjectionResult(
frequencies: NDArray[np.float64],
coupling_loss_factor12: NDArray[np.float64],
coupling_loss_factor21: NDArray[np.float64],
internal_loss_factor1: NDArray[np.float64],
internal_loss_factor2: NDArray[np.float64],
energy1: NDArray[np.float64],
energy2: NDArray[np.float64],
input_power1: NDArray[np.float64],
input_power2: NDArray[np.float64],
modal_density1: NDArray[np.float64] | None,
modal_density2: NDArray[np.float64] | None,
method: str,
)

Loss-factor budget of a two-subsystem SEA model, per band.

All arrays share the band axis frequencies.

Attributes

NameDescription
frequenciesBand centre frequencies f, in hertz.
coupling_loss_factor12eta_12, subsystem 1 to 2.
coupling_loss_factor21eta_21, subsystem 2 to 1.
internal_loss_factor1eta_1 of subsystem 1.
internal_loss_factor2eta_2 of subsystem 2.
energy1Band energy E_1, in joules.
energy2Band energy E_2, in joules.
input_power1Power injected into subsystem 1, in watts.
input_power2Power injected into subsystem 2, in watts.
modal_density1Modal density n_1, in modes per hertz, or None when the inversion did not need it.
modal_density2Modal density n_2, or None.
method"single-drive" (reciprocity assumed) or "two-drive" (full power-injection matrix).

property

Coupling ratio .

SEA subsystems should be weakly coupled: values well below 1 mean the junction leaks far less power than the subsystem dissipates, the regime where the two-subsystem model is trustworthy.

property

Total power dissipated internally, in watts.

, which equals input_power in the steady state and is the round-trip check of the inversion.

property

Total power injected into the system, in watts.

property

Ratio implied by the measured coupling loss factors.

From the reciprocity relationship , so it equals . For a "two-drive" inversion, where reciprocity was never assumed, comparing this with the modal densities computed from the geometry is the consistency check on the measurement.

PowerInjectionResult.plot(
ax: Axes | None = None,
*,
language: str = 'en',
**kwargs: Any,
) -> Axes

Plot the loss-factor budget against frequency.

The two coupling loss factors and the two internal loss factors on one log axis: their ordering is the whole diagnosis, because SEA is only valid where the coupling stays below the internal damping.

Requires matplotlib (pip install phonometry[plot]); returns the Axes.

Parameters

NameDescription
axExisting axes, or None to create a figure.
languageLabel language, "en" (default) or "es".
kwargsForwarded to the eta_12 curve.

property

Net power flowing from subsystem 1 to 2, in watts.

; negative when the net flow runs the other way.

ring_frequency(mean_radius: float, longitudinal_wave_speed: float) -> float

Ring frequency of a cylindrical shell (Norton Eq. 6.26).

: the frequency at which the shell vibrates uniformly in the breathing mode. Above it a cylinder behaves like a flat plate; below it the modes group by circumferential order and the modal density is no longer a simple function of frequency.

Parameters

NameDescription
mean_radiusMean shell radius a_m, in m (> 0).
longitudinal_wave_speedPlate wave speed cL, in m/s (> 0).

Returns: The ring frequency fr, in hertz.

Raises

ExceptionWhen
ValueErrorfor a non-positive input.