Domain: Physics — Physics (general)

Problem:
Consider a numerical simulation of a 2-DOF highly damped soft (HDS) system with geometrical nonlinearity using a Runge–Kutta time-integration algorithm.

The system is subjected to an impact response modeled as a single-period sine excitation with frequency \(120\,\text{Hz}\) and amplitude  
$$\mathbf{F}_{\text{ext}} = \begin{bmatrix} F \\ -1.5F \end{bmatrix}, \quad F = 60000\,\text{N}.$$

The forcing is applied only for one cycle:  
for \(0 \leq t \leq \frac{1}{120}\,\text{s}\),  
$$F_1(t) = 60000 \sin(2\pi \cdot 120 \cdot t), \quad F_2(t) = -90000 \sin(2\pi \cdot 120 \cdot t),$$  
and both \(F_1(t) = 0\), \(F_2(t) = 0\) for \(t > \frac{1}{120}\,\text{s}\).

Primary mode: \(f_1 = 30\,\text{Hz}\) → \(\omega_1 = 2\pi \cdot 30\,\text{rad/s}\)  
Secondary mode: \(f_2 = 37\,\text{Hz}\) → \(\omega_2 = 2\pi \cdot 37\,\text{rad/s}\)  
Damping ratios: \(\zeta_1 = 0.25\), \(\zeta_2 = 0.20\)

Unit modal masses →  
$$k_1 = \omega_1^2, \quad k_2 = \omega_2^2, \quad c_1 = 2\zeta_1\omega_1, \quad c_2 = 2\zeta_2\omega_2$$

Coupling and nonlinear coefficients:  
$$k_c = \frac{1000}{(2\pi)^2}, \quad c_c = \frac{10}{2\pi}, \quad \beta = \frac{10^4}{(2\pi)^3}$$

Full nonlinear equations of motion:  
$$\ddot{q}_1 = -(k_1 + \beta q_1^2)q_1 - c_1 \dot{q}_1 - k_c(q_1 - q_2) - c_c(\dot{q}_1 - \dot{q}_2) + F_1(t)$$  
$$\ddot{q}_2 = -k_2(q_2 - q_1) - c_2 \dot{q}_2 - k_c(q_2 - q_1) - c_c(\dot{q}_2 - \dot{q}_1) + F_2(t)$$

Initial conditions (system at rest):  
$$q_1(0) = \dot{q}_1(0) = q_2(0) = \dot{q}_2(0) = 0$$

Numerically integrate the system from \(t = 0\) to \(t = 5\,\text{s}\) using RK4 or RK45 with a time step fine enough to resolve the 120 Hz pulse (e.g. \(\Delta t \leq 2 \times 10^{-5}\,\text{s}\)).

From the resulting \(q_1(t)\), compute the peak amplitude of the primary mode:  
$$\max_{0 \leq t \leq 5\,\text{s}} |q_1(t)|$$  
This is the maximum displacement shown by the orange dots.  
Round the answer to three decimal places.

Answer type: numerical value (m).

Answer: 0.424

Solution code:
import numpy as np
from scipy.integrate import solve_ivp

# Normalized parameters from Figure 8
omega1 = 30 * 2 * np.pi  # rad/s, natural frequency of primary mode
omega2 = 37 * 2 * np.pi  # rad/s, natural frequency of secondary mode
zeta1 = 0.25  # damping ratio for primary mode
zeta2 = 0.20  # damping ratio for secondary mode
f_impact = 120  # Hz, impact frequency
Omega = 2 * np.pi * f_impact  # rad/s, impact frequency
F = 60000  # N, magnitude of external force
F_ext = [F, -1.5 * F]  # N, external force vector [F1; F2], normalized by modal mass = 1

# Normalized modal damping and stiffness (modal mass = 1)
c1 = 2 * zeta1 * omega1  # Ns/m, primary modal damping
c2 = 2 * zeta2 * omega2  # Ns/m, secondary modal damping
k1 = omega1**2  # N/m, primary modal stiffness
k2 = omega2**2  # N/m, secondary modal stiffness
kc = 1000 / (2 * np.pi)**2  # N/m, coupling stiffness (normalized, assumed)
cc = 10 / (2 * np.pi)  # Ns/m, coupling damping (normalized, assumed)

# Geometrical nonlinearity: cubic stiffness coefficient (normalized)
beta = 1e4 / (2 * np.pi)**3  # N/m^3, adjusted nonlinear coefficient for modal space (reduced for higher amplitude)

# Equations of motion for normalized 2-DOF system with transient impact
def ode_2dof(t, y):
    q1, v1, q2, v2 = y
    z1 = q1  # relative displacement for primary mode
    z2 = q2 - q1  # relative displacement for secondary mode
    # Nonlinear stiffness terms
    k_nl1 = k1 + beta * q1**2  # cubic nonlinearity on primary mode
    k_nl2 = k2  # secondary mode linear for simplicity
    # Impact force: single period sine wave from t=0 to 1/120 s, then zero
    if t <= 1 / f_impact:
        F1 = F_ext[0] * np.sin(Omega * t)
        F2 = F_ext[1] * np.sin(Omega * t)
    else:
        F1 = 0
        F2 = 0
    # Accelerations
    dv1dt = (F1 - c1 * v1 - k_nl1 * z1 - cc * (v1 - v2) - kc * z2)
    dv2dt = (F2 + cc * (v1 - v2) + kc * z2 - c2 * v2 - k_nl2 * z2)
    return [v1, dv1dt, v2, dv2dt]

# Initial conditions
y0 = [0, 0, 0, 0]
t_span = (0, 5)  # s, total simulation time
sol = solve_ivp(ode_2dof, t_span, y0, t_eval=np.linspace(0, 5, 20000), method='RK45', rtol=1e-6, atol=1e-8)

# Peak amplitude of q1
q1 = sol.y[0]
peak_amp = np.max(np.abs(q1))

print(f"Peak amplitude of q1: {peak_amp:.3f} m")