4. Single-Degree-of-Freedom Occupant Model Response to Pulse
Why a Single-Degree-of-Freedom Model Is the Right First Tool
Before attributing an occupant injury outcome to a specific pulse feature, you need a reference system whose response you can predict analytically. The linear single-degree-of-freedom (SDOF) occupant model is that reference. It reduces the occupant–restraint system to one effective mass m, one linear stiffness k, and one viscous damping coefficient c, all driven by the base acceleration a_p(t) measured on the vehicle floor or sled. The model does not attempt to reproduce belt geometry, airbag deployment, or contact with the interior. Its value is diagnostic: it tells you which pulse characteristics the occupant kinematics are structurally sensitive to, and it gives you a clean baseline against which a real occupant signal can be compared.
The equation of motion is written in the relative coordinate z(t) = x_occ(t) − x_base(t), where x_occ is the occupant displacement and x_base the vehicle displacement:
m·z̈ + c·ż + k·z = −m·a_p(t)
z̈ + 2ζω_n·ż + ω_n²·z = −a_p(t)
ω_n = sqrt(k/m), ζ = c / (2·sqrt(k·m))
The absolute occupant acceleration, which is what an accelerometer on the occupant chest would record, is a_occ(t) = z̈(t) + a_p(t). This distinction matters: the relative displacement z describes how far the occupant moves into the restraint, while a_occ describes the loading the occupant actually experiences. A pulse can produce a large z with a modest a_occ, or the reverse, depending on how the pulse frequency content aligns with ω_n.
Building the Model from a Measured Pulse
The workflow below assumes a sampled pulse a_p[n] at sample interval dt, already baseline-corrected and time-zero aligned. The implementation uses a state-space form and a fixed-step Runge–Kutta integrator so the result is reproducible without external libraries beyond NumPy.
import numpy as np
def sdof_response(a_p, dt, fn_hz, zeta):
"""Linear SDOF base-excited response.
a_p : base acceleration samples (m/s^2), positive = vehicle forward decel convention
dt : sample interval (s)
fn_hz : undamped natural frequency (Hz)
zeta : damping ratio (dimensionless)
Returns z (relative displacement, m), z_dd (relative accel), a_occ (absolute accel).
"""
wn = 2.0 * np.pi * fn_hz
n = len(a_p)
z = np.zeros(n)
zd = np.zeros(n)
zdd = np.zeros(n)
def deriv(state, ap):
zz, vv = state
acc = -ap - 2.0 * zeta * wn * vv - wn * wn * zz
return np.array([vv, acc])
state = np.array([0.0, 0.0])
for i in range(n):
ap = a_p[i]
k1 = deriv(state, ap)
k2 = deriv(state + 0.5 * dt * k1, ap)
k3 = deriv(state + 0.5 * dt * k2, ap)
k4 = deriv(state + dt * k3, ap)
state = state + (dt / 6.0) * (k1 + 2*k2 + 2*k3 + k4)
z[i] = state[0]
zd[i] = state[1]
zdd[i] = -ap - 2.0 * zeta * wn * zd[i] - wn * wn * z[i]
a_occ = zdd + a_p
return z, zdd, a_occ
Two conventions must be fixed before running anything. First, the sign of a_p: in this model a positive a_p is the vehicle deceleration magnitude, so the inertial forcing term is −a_p. Second, the initial condition: the occupant starts at rest relative to the vehicle, so z(0) = 0 and ż(0) = 0. If you feed a pulse with the opposite sign convention, the relative displacement will be inverted but its magnitude and timing will be unchanged — a useful sanity check when comparing against a reference signal.
Reference Parameters and a Worked Run
Use a representative restrained-occupant equivalent: m = 75 kg, k = 12 kN/m, c = 1.2 kN·s/m. These give ω_n ≈ 12.65 rad/s, f_n ≈ 2.01 Hz, and ζ ≈ 0.63. The damping is deliberately high because a belted occupant with pretensioner and load limiter behaves closer to a heavily damped system than to a bare mass on a spring.
Drive the model with a synthetic half-sine pulse of amplitude 30 g and duration 60 ms, sampled at dt = 0.1 ms. The expected qualitative outcome, which you should confirm by running the code, is a relative displacement peak on the order of 0.10–0.15 m occurring roughly 20–40 ms after the pulse peak, and an absolute occupant acceleration peak that is lower than the pulse peak because the occupant lags the vehicle. That lag is the physical meaning of the model: the occupant does not track the floor.
Now change one parameter at a time and observe the regime shift:
| Case | Pulse amplitude | Pulse duration | Dominant regime | What to watch |
|---|---|---|---|---|
| A | 30 g | 60 ms | Quasi-static (pulse ≫ 1/f_n) | z tracks pulse shape; a_occ ≈ a_p scaled by transmissibility |
| B | 30 g | 20 ms | Transient / ringing | z peaks after pulse ends; a_occ shows oscillation at f_n |
| C | 60 g | 60 ms | Amplitude-scaled quasi-static | z and a_occ scale nearly linearly with amplitude |
| D | 60 g | 20 ms | Impulsive | Peak z set by velocity change, not by peak acceleration |
The regime boundary is set by the ratio of pulse duration T to the occupant natural period T_n = 1/f_n ≈ 0.5 s. When T ≪ T_n, the pulse delivers an impulse and the response is governed by the velocity change Δv = ∫a_p dt. When T ≫ T_n, the occupant quasi-statically follows the pulse and the response is governed by peak acceleration. Case B and Case D are the ones that most often surprise analysts: doubling the amplitude while shortening the pulse can leave peak z nearly unchanged if Δv is preserved, yet the a_occ waveform changes shape dramatically.
Reading the Response and Diagnosing the Regime
After running the model, extract four scalars from each response: peak relative displacement max|z|, peak absolute occupant acceleration max|a_occ|, time of peak z relative to pulse onset, and the residual oscillation amplitude after the pulse ends. These four numbers are enough to classify the regime without plotting anything.
- Peak
zoccurs during the pulse anda_occpeak is close toa_ppeak: quasi-static regime. The occupant is following the vehicle; restraint loading is dominated by peak deceleration. - Peak
zoccurs after pulse end anda_occoscillates atf_n: transient regime. The occupant is ringing on the restraint stiffness; the pulse delivered an impulse. - Peak
zscales withΔvrather than with peaka_p: impulsive regime. CompareΔvacross pulses before comparing amplitudes.
Δv / ω_n. With Δv = 30 g × 20 ms ≈ 5.9 m/s and ω_n = 12.65 rad/s, that gives ≈ 0.47 m before damping — damping will reduce it substantially, but the order of magnitude confirms whether your numerical result is plausible. If your simulated peak z is an order of magnitude away from this estimate, check the sign convention and the initial conditions before trusting the output.Common Failure Symptoms
Three symptoms account for most incorrect SDOF results. First, inverted relative displacement: the sign of a_p was flipped relative to the convention in the equation of motion. Second, response that starts before the pulse: the pulse array contains pre-trigger samples that were not zeroed, so the integrator sees a nonzero forcing before t = 0. Third, peak a_occ exceeding peak a_p by a large factor in the quasi-static regime: this usually means f_n was set too high relative to the pulse content, pushing the model into a resonance-like response that the real restrained occupant would not exhibit. Verify f_n against the intended occupant–restraint equivalent before interpreting any regime classification.
The model's output is a diagnostic baseline, not a prediction of injury. Its role in root cause diagnosis is to answer a narrow question: given this pulse, is the occupant response dominated by peak deceleration, by velocity change, or by the transition between them? Once that regime is identified, the next diagnostic step is to compare the model's a_occ and z against the measured occupant channel and attribute the residual to restraint behavior, contact, or pulse features the SDOF model cannot represent.