Random Vibration Response Analysis (structures/loads/random-vibration-analysis)
Use when a structure or equipment item must be checked against a
random vibration environment described by a base-input acceleration
power spectral density (PSD, in g^2/Hz). The item is modeled as a
single-degree-of-freedom (SDOF) oscillator at its natural frequency
f_n with damping ratio zeta; the analysis computes the response PSD
through the acceleration transmissibility, the RMS response in g
from the Miles equation (flat input at resonance) or by numerical
integration of the response PSD (arbitrary spectrum), the 3-sigma
peak level, and the equivalent static load factor used for equipment
qualification screening. This is the other dynamic loads input
alongside discrete gust and maneuver loads, feeding the same
structural sizing and fatigue flows. The response-level model here is
deliberately confined to SDOF random vibration response; cycle
counting and cumulative fatigue damage of the vibration response are
owned by the fatigue pack.
Domain quick reference
SDOF base-excitation model: frequency ratio r = f/f_n and the
acceleration transmissibility (response to base acceleration)
|H(f)|^2 = 1 / ((1 - r^2)^2 + (2*zeta*r)^2)
|H(f)|^2 equals 1 at f = 0 (rigid-body limit) and Q^2 = 1/(2*zeta)^2
at f = f_n, and rolls off as (f_n/f)^4 well above resonance.
Response PSD: G_out(f) = |H(f)|^2 * G_in(f), with G_in in g^2/Hz and
G_out in g^2/Hz. The response PSD peaks near the damped resonance
f_nsqrt(1 - 2zeta^2), which is the dominant response frequency.
Amplification factor at resonance: Q = 1/(2*zeta) (about 10 at
zeta = 0.05, about 5 at zeta = 0.10).
Miles equation (flat, band-limited input at the resonance):
sigma = sqrt((pi/2) * f_n * Q * G_in(f_n))
in g_rms, with f_n in Hz. It follows from integrating |H(f)|^2 over
all frequencies: the integral equals (pi/2)f_nQ, so
sigma^2 = G_in * (pi/2) * f_n * Q.
Numerical path (input not flat at f_n): sigma^2 = integral of
G_out(f) df, trapezoidal rule on the supplied spectrum points. The
grid must resolve the response peak, whose half-power width is about
2zetaf_n (4 Hz at f_n = 40 Hz, zeta = 0.05); a spectrum sampled
coarser than that underestimates the integral.
3-sigma peak and equivalent static load factor: for a narrowband
Gaussian random response the peak accelerations reach about
3sigma, so peak = n_eq = 3sigma in g. The load factor n_eq is a
screening value only: it assumes the response at resonance dominates
and the item behaves as the SDOF oscillator modeled here.
Units: f, f_n in Hz; zeta dimensionless in (0, 1); G in g^2/Hz;
sigma in g_rms; peaks and load factors in g.
Context: transport certification FAR 25.301/25.303 frames the limit
loads context (reference only); equipment random vibration test
levels follow MIL-STD-810H (random vibration test method) and
DO-160G Section 8 (vibration tests of airborne equipment), which
this analysis converts into item response levels. Standard text is
named and paraphrased, never reproduced.
Workflow
- Gather the item's first natural frequency f_n (Hz) and damping
ratio zeta, from the modal analysis or a resonance survey, and the
input base-acceleration PSD spectrum as (f, G_in) points in
g^2/Hz over the test band.
- Confirm the amplification factor with quality_factor(zeta):
Q = 1/(2*zeta). Typical equipment damping runs 2-10% of critical.
- Get the transmissibility at any frequency with
transmissibility(f, f_n, zeta) or transmissibility_squared for the
PSD amplification |H(f)|^2.
- For a flat band-limited input at resonance, use the Miles closed
form miles_sigma(f_n, zeta, g_in_at_resonance): sigma =
sqrt((pi/2)f_nQ*G_in(f_n)).
- For an arbitrary spectrum, build the response PSD with
response_psd(spectrum, f_n, zeta) and integrate with
numerical_sigma(spectrum, f_n, zeta) (trapezoidal on the provided
points; at least two points required). Check the grid resolves the
response peak (step 1 quick reference).
- Run the full analysis with random_vibration_analysis(f_n, zeta,
spectrum): returns sigma_rms_g (numerical), sigma_miles_g (Miles
value with the input level interpolated at f_n, None when f_n lies
outside the spectrum coverage), psd_response_points, f_n, q,
dominant_response_frequency, peak_3sigma_g and n_eq_g.
- Report the 3-sigma level with peak_three_sigma(sigma) and the
equivalent static load factor with
equivalent_static_load_factor(sigma) for the qualification
screening against the item's test-withstand level.
- Feed the response levels into the fatigue flow (Miner damage)
when the vibration environment contributes to the load spectrum;
cycle counting and damage accumulation live in the fatigue pack,
not here.
Worked example
Equipment item at f_n = 40 Hz with zeta = 0.05 (Q = 10) under a flat
base-input PSD of G = 0.01 g^2/Hz over 20-500 Hz.
- Miles: sigma = sqrt((pi/2)40100.01) = sqrt(6.2831853) =
2.5066 g_rms; the 3-sigma peak is 32.5066 = 7.52 g and the
equivalent static load factor is n_eq = 7.52 g for screening.
- Response PSD at resonance: G_out(40) = 0.01 * Q^2 = 0.01 * 100 =
1.0 g^2/Hz; the dominant response frequency is
40sqrt(1 - 20.05^2) = 39.90 Hz.
- Numerical cross-check: trapezoidal integration of G_out over the
20-500 Hz band on a 1 Hz grid gives sigma = 2.458 g_rms, about 2%
below the Miles value (the deficit is the input band truncation
below 20 Hz, far from the resonance); a 2 Hz grid gives 2.462 g_rms,
still within a few percent. Both confirm the Miles result when the
input is flat around resonance.
- An avionics box with f_n = 90 Hz and zeta = 0.03 (Q = 16.7) under
the same flat 0.01 g^2/Hz input responds at sigma =
sqrt((pi/2)9016.67*0.01) = 4.854 g_rms, a 3-sigma level of
14.6 g, which would fail a 10 g equipment screening; the case
demonstrates how strongly the response level scales with f_n and Q.
Pitfalls
- Using Miles on a non-flat spectrum: the Miles equation assumes a
flat band-limited input level at the resonance; for an arbitrary
spectrum the response PSD must be integrated numerically, and the
module returns None for the Miles value when f_n lies outside the
input coverage.
- Sampling the spectrum coarser than the response peak: the half-
power width of the peak is about 2zetaf_n (4 Hz at f_n = 40 Hz,
zeta = 0.05), so a grid coarser than that underestimates the
integrated response.
- Quoting a 3-sigma level as a hard peak: for a narrowband Gaussian
random response the peak reaches about 3sigma and n_eq = 3sigma
is a screening load factor that assumes the response at resonance
dominates and the item is SDOF.
- Reading the transmissibility at resonance as the amplification:
|H(f)|^2 peaks at Q^2 = 1/(2*zeta)^2 (100 at zeta = 0.05) while Q
itself is 10; the response PSD scales with the squared factor.
- Feeding an out-of-range damping: zeta must lie in (0, 1); zeta = 0
makes the amplification infinite and zeta >= 1 is not an
oscillator, and both raise ValueError.
- Doing the fatigue damage here: this leaf stops at response levels
(sigma, 3-sigma, n_eq); cycle counting and cumulative Miner damage
of the vibration response belong to the fatigue pack.
Verification
- miles_sigma(40, 0.05, 0.01) returns 2.5066 g_rms and
peak_three_sigma gives 7.52 g, both within 1% of the hand calc.
- quality_factor(0.05) returns 10 and transmissibility_squared at
f = f_n returns Q^2 = 100.
- numerical_sigma over the flat 20-500 Hz band (2 Hz grid) returns a
value within 3% of the Miles sigma (worked example cross-check).
- random_vibration_analysis returns the dict with sigma_rms_g,
psd_response_points, f_n, q and dominant_response_frequency, and
reports sigma_miles_g = None when f_n falls outside the input band.
- Every non-physical input raises ValueError: non-positive f_n,
zeta <= 0 or zeta >= 1, negative PSD ordinates, empty or
single-point spectra for integration, non-increasing frequencies,
and negative frequencies.
- Deterministic contract: scripts/test_random_vibration_analysis.py.
Related leaves
- structures/loads/gust-maneuver-loads: discrete gust and maneuver
load factors, the other dynamic loads input that joins random
vibration in the loads pack.
- structures/fem/modal-analysis: natural frequencies and damping used
as the f_n and zeta inputs of this response analysis.
- structures/fatigue/miner-damage: cumulative damage of the cycles
implied by the vibration response; this leaf stops at response
levels, the fatigue pack owns the damage estimate.
- structures/thermal-structures/thermal-stress-analysis: thermal
environment loads assessed alongside the vibration qualification.
Behavior contract (gate 3)
Run the deterministic contract test (stdlib unittest, offline):
python3 scripts/test_random_vibration_analysis.py
The test covers the worked example (Miles sigma 2.5066 g_rms and
3-sigma level 7.52 g within 1% of the hand calc), the numerical
cross-check on the flat band within a few percent of Miles, the
Q^2 = 100 response amplification at resonance, the (f_n/f)^4
roll-off, the response PSD construction, sigma scaling with
sqrt(G), sqrt(f_n) and 1/sqrt(zeta), the Miles round-trip that
recovers the input PSD, interpolation of the input level at f_n,
the analysis dict contents, and ValueError rejection of non-positive
f_n, out-of-range zeta, negative ordinates, and empty, single-point
or non-monotonic spectra.
Compliance
- FAR 25 is US government work (public domain); summary and physics
values only, per standards-map.yaml. MIL-STD-810H and DO-160G
Section 8 are named as equipment test-level context and paraphrased,
never reproduced.
- compliance: STANDARDS-REF, gated: false.
1---2name: random-vibration-analysis3description: Use when you must compute the random vibration response of a structure or equipment item to a base-input acceleration power spectral density: single-degree-of-freedom transmissibility |H(f)|^2 = 1/((1-r^2)^2 + (2*zeta*r)^2), response PSD G_out(f) = |H(f)|^2 * G_in(f), RMS response in g from the Miles equation sigma = sqrt((pi/2)*f_n*Q*G_in(f_n)) with Q = 1/(2*zeta), numerical integration of the response PSD over a supplied spectrum, 3-sigma peak level, and the equivalent static load factor n_eq = 3*sigma for equipment qualification screening. Produces response PSD points, g-rms and 3-sigma response levels, and screening load factors. Trigger: random vibration, PSD response, Miles equation, transmissibility, base excitation, g-rms, power spectral density, vibration qualification.4license: Apache-2.05---67# Random Vibration Response Analysis (structures/loads/random-vibration-analysis)89Use when a structure or equipment item must be checked against a10random vibration environment described by a base-input acceleration11power spectral density (PSD, in g^2/Hz). The item is modeled as a12single-degree-of-freedom (SDOF) oscillator at its natural frequency13f_n with damping ratio zeta; the analysis computes the response PSD14through the acceleration transmissibility, the RMS response in g15from the Miles equation (flat input at resonance) or by numerical16integration of the response PSD (arbitrary spectrum), the 3-sigma17peak level, and the equivalent static load factor used for equipment18qualification screening. This is the other dynamic loads input19alongside discrete gust and maneuver loads, feeding the same20structural sizing and fatigue flows. The response-level model here is21deliberately confined to SDOF random vibration response; cycle22counting and cumulative fatigue damage of the vibration response are23owned by the fatigue pack.2425## Domain quick reference2627- SDOF base-excitation model: frequency ratio r = f/f_n and the28 acceleration transmissibility (response to base acceleration)2930 |H(f)|^2 = 1 / ((1 - r^2)^2 + (2*zeta*r)^2)3132 |H(f)|^2 equals 1 at f = 0 (rigid-body limit) and Q^2 = 1/(2*zeta)^233 at f = f_n, and rolls off as (f_n/f)^4 well above resonance.34- Response PSD: G_out(f) = |H(f)|^2 * G_in(f), with G_in in g^2/Hz and35 G_out in g^2/Hz. The response PSD peaks near the damped resonance36 f_n*sqrt(1 - 2*zeta^2), which is the dominant response frequency.37- Amplification factor at resonance: Q = 1/(2*zeta) (about 10 at38 zeta = 0.05, about 5 at zeta = 0.10).39- Miles equation (flat, band-limited input at the resonance):4041 sigma = sqrt((pi/2) * f_n * Q * G_in(f_n))4243 in g_rms, with f_n in Hz. It follows from integrating |H(f)|^2 over44 all frequencies: the integral equals (pi/2)*f_n*Q, so45 sigma^2 = G_in * (pi/2) * f_n * Q.46- Numerical path (input not flat at f_n): sigma^2 = integral of47 G_out(f) df, trapezoidal rule on the supplied spectrum points. The48 grid must resolve the response peak, whose half-power width is about49 2*zeta*f_n (4 Hz at f_n = 40 Hz, zeta = 0.05); a spectrum sampled50 coarser than that underestimates the integral.51- 3-sigma peak and equivalent static load factor: for a narrowband52 Gaussian random response the peak accelerations reach about53 3*sigma, so peak = n_eq = 3*sigma in g. The load factor n_eq is a54 screening value only: it assumes the response at resonance dominates55 and the item behaves as the SDOF oscillator modeled here.56- Units: f, f_n in Hz; zeta dimensionless in (0, 1); G in g^2/Hz;57 sigma in g_rms; peaks and load factors in g.58- Context: transport certification FAR 25.301/25.303 frames the limit59 loads context (reference only); equipment random vibration test60 levels follow MIL-STD-810H (random vibration test method) and61 DO-160G Section 8 (vibration tests of airborne equipment), which62 this analysis converts into item response levels. Standard text is63 named and paraphrased, never reproduced.6465## Workflow66671. Gather the item's first natural frequency f_n (Hz) and damping68 ratio zeta, from the modal analysis or a resonance survey, and the69 input base-acceleration PSD spectrum as (f, G_in) points in70 g^2/Hz over the test band.712. Confirm the amplification factor with quality_factor(zeta):72 Q = 1/(2*zeta). Typical equipment damping runs 2-10% of critical.733. Get the transmissibility at any frequency with74 transmissibility(f, f_n, zeta) or transmissibility_squared for the75 PSD amplification |H(f)|^2.764. For a flat band-limited input at resonance, use the Miles closed77 form miles_sigma(f_n, zeta, g_in_at_resonance): sigma =78 sqrt((pi/2)*f_n*Q*G_in(f_n)).795. For an arbitrary spectrum, build the response PSD with80 response_psd(spectrum, f_n, zeta) and integrate with81 numerical_sigma(spectrum, f_n, zeta) (trapezoidal on the provided82 points; at least two points required). Check the grid resolves the83 response peak (step 1 quick reference).846. Run the full analysis with random_vibration_analysis(f_n, zeta,85 spectrum): returns sigma_rms_g (numerical), sigma_miles_g (Miles86 value with the input level interpolated at f_n, None when f_n lies87 outside the spectrum coverage), psd_response_points, f_n, q,88 dominant_response_frequency, peak_3sigma_g and n_eq_g.897. Report the 3-sigma level with peak_three_sigma(sigma) and the90 equivalent static load factor with91 equivalent_static_load_factor(sigma) for the qualification92 screening against the item's test-withstand level.938. Feed the response levels into the fatigue flow (Miner damage)94 when the vibration environment contributes to the load spectrum;95 cycle counting and damage accumulation live in the fatigue pack,96 not here.9798## Worked example99100Equipment item at f_n = 40 Hz with zeta = 0.05 (Q = 10) under a flat101base-input PSD of G = 0.01 g^2/Hz over 20-500 Hz.102103- Miles: sigma = sqrt((pi/2)*40*10*0.01) = sqrt(6.2831853) =104 2.5066 g_rms; the 3-sigma peak is 3*2.5066 = 7.52 g and the105 equivalent static load factor is n_eq = 7.52 g for screening.106- Response PSD at resonance: G_out(40) = 0.01 * Q^2 = 0.01 * 100 =107 1.0 g^2/Hz; the dominant response frequency is108 40*sqrt(1 - 2*0.05^2) = 39.90 Hz.109- Numerical cross-check: trapezoidal integration of G_out over the110 20-500 Hz band on a 1 Hz grid gives sigma = 2.458 g_rms, about 2%111 below the Miles value (the deficit is the input band truncation112 below 20 Hz, far from the resonance); a 2 Hz grid gives 2.462 g_rms,113 still within a few percent. Both confirm the Miles result when the114 input is flat around resonance.115- An avionics box with f_n = 90 Hz and zeta = 0.03 (Q = 16.7) under116 the same flat 0.01 g^2/Hz input responds at sigma =117 sqrt((pi/2)*90*16.67*0.01) = 4.854 g_rms, a 3-sigma level of118 14.6 g, which would fail a 10 g equipment screening; the case119 demonstrates how strongly the response level scales with f_n and Q.120121122## Pitfalls123124- Using Miles on a non-flat spectrum: the Miles equation assumes a125 flat band-limited input level at the resonance; for an arbitrary126 spectrum the response PSD must be integrated numerically, and the127 module returns None for the Miles value when f_n lies outside the128 input coverage.129- Sampling the spectrum coarser than the response peak: the half-130 power width of the peak is about 2*zeta*f_n (4 Hz at f_n = 40 Hz,131 zeta = 0.05), so a grid coarser than that underestimates the132 integrated response.133- Quoting a 3-sigma level as a hard peak: for a narrowband Gaussian134 random response the peak reaches about 3*sigma and n_eq = 3*sigma135 is a screening load factor that assumes the response at resonance136 dominates and the item is SDOF.137- Reading the transmissibility at resonance as the amplification:138 |H(f)|^2 peaks at Q^2 = 1/(2*zeta)^2 (100 at zeta = 0.05) while Q139 itself is 10; the response PSD scales with the squared factor.140- Feeding an out-of-range damping: zeta must lie in (0, 1); zeta = 0141 makes the amplification infinite and zeta >= 1 is not an142 oscillator, and both raise ValueError.143- Doing the fatigue damage here: this leaf stops at response levels144 (sigma, 3-sigma, n_eq); cycle counting and cumulative Miner damage145 of the vibration response belong to the fatigue pack.146## Verification147148- miles_sigma(40, 0.05, 0.01) returns 2.5066 g_rms and149 peak_three_sigma gives 7.52 g, both within 1% of the hand calc.150- quality_factor(0.05) returns 10 and transmissibility_squared at151 f = f_n returns Q^2 = 100.152- numerical_sigma over the flat 20-500 Hz band (2 Hz grid) returns a153 value within 3% of the Miles sigma (worked example cross-check).154- random_vibration_analysis returns the dict with sigma_rms_g,155 psd_response_points, f_n, q and dominant_response_frequency, and156 reports sigma_miles_g = None when f_n falls outside the input band.157- Every non-physical input raises ValueError: non-positive f_n,158 zeta <= 0 or zeta >= 1, negative PSD ordinates, empty or159 single-point spectra for integration, non-increasing frequencies,160 and negative frequencies.161- Deterministic contract: scripts/test_random_vibration_analysis.py.162163## Related leaves164165- structures/loads/gust-maneuver-loads: discrete gust and maneuver166 load factors, the other dynamic loads input that joins random167 vibration in the loads pack.168- structures/fem/modal-analysis: natural frequencies and damping used169 as the f_n and zeta inputs of this response analysis.170- structures/fatigue/miner-damage: cumulative damage of the cycles171 implied by the vibration response; this leaf stops at response172 levels, the fatigue pack owns the damage estimate.173- structures/thermal-structures/thermal-stress-analysis: thermal174 environment loads assessed alongside the vibration qualification.175176## Behavior contract (gate 3)177178Run the deterministic contract test (stdlib unittest, offline):179180 python3 scripts/test_random_vibration_analysis.py181182The test covers the worked example (Miles sigma 2.5066 g_rms and1833-sigma level 7.52 g within 1% of the hand calc), the numerical184cross-check on the flat band within a few percent of Miles, the185Q^2 = 100 response amplification at resonance, the (f_n/f)^4186roll-off, the response PSD construction, sigma scaling with187sqrt(G), sqrt(f_n) and 1/sqrt(zeta), the Miles round-trip that188recovers the input PSD, interpolation of the input level at f_n,189the analysis dict contents, and ValueError rejection of non-positive190f_n, out-of-range zeta, negative ordinates, and empty, single-point191or non-monotonic spectra.192193## Compliance194195- FAR 25 is US government work (public domain); summary and physics196 values only, per standards-map.yaml. MIL-STD-810H and DO-160G197 Section 8 are named as equipment test-level context and paraphrased,198 never reproduced.199- compliance: STANDARDS-REF, gated: false.