3. 弹簧-质量系统的自由振动分析

弹簧-质量系统的自由振动分析 学习卡片

弹簧-质量系统的自由振动分析

本节以单自由度弹簧-质量系统为对象,完成从建模、固有频率与振型计算,到自由振动响应仿真验证的完整流程。系统由质量块 m、线性弹簧 k 和固定支座组成,质量块仅沿水平方向运动,忽略摩擦与阻尼。

取质量块水平位移 x 为广义坐标,原点设在弹簧自然长度处。由牛顿第二定律或拉格朗日方程可得运动方程:

m·ẍ + k·x = 0
令 ωn = √(k/m)  →  ẍ + ωn²·x = 0

该方程的通解为 x(t) = A·cos(ωn·t) + B·sin(ωn·t),其中 A = x₀,B = v₀/ωn。固有频率 fn = ωn/(2π) 只由 m 和 k 决定,与初始条件无关;振幅和相位则由初始位移 x₀ 与初始速度 v₀ 决定。单自由度系统只有一个振型,即质量块沿弹簧轴线做纯平动,振型向量归一化后为 [1]。

固有频率是系统的内禀属性:改变 x₀ 或 v₀ 只改变振幅与相位,不改变 ωn。这是后续多自由度系统模态分析的基础。
物理模型 m x(t) k m 参数与计算结果 输入参数 m = 2.0 kg k = 200 N/m x₀ = 0.05 m, v₀ = 0 m/s 无阻尼自由振动 计算结果 ωn = √(k/m) = √(200/2) = 10 rad/s fn = ωn/(2π) ≈ 1.592 Hz T = 1/fn ≈ 0.628 s 振型:单自由度 → [1](纯平动) 自由振动响应 x(t) = x₀·cos(ωn·t) t x A = x₀ = 0.05 m T = 2π/ωn ≈ 0.628 s

下面用 Python 对上述模型进行数值仿真,并与解析解对比。采用四阶龙格-库塔法积分状态方程 [x, v]' = [v, -ωn²·x]。

import numpy as np
import matplotlib.pyplot as plt

# 系统参数
m = 2.0          # kg
k = 200.0        # N/m
x0 = 0.05        # m
v0 = 0.0         # m/s

wn = np.sqrt(k / m)          # 固有频率 rad/s
fn = wn / (2 * np.pi)        # Hz
T = 1.0 / fn                 # 周期 s

print(f"ωn = {wn:.4f} rad/s")
print(f"fn = {fn:.4f} Hz")
print(f"T  = {T:.4f} s")

# 状态方程: dx/dt = v, dv/dt = -wn^2 * x
def deriv(state):
    x, v = state
    return np.array([v, -wn**2 * x])

# RK4 积分
dt = 0.001
t_end = 2.0
n_steps = int(t_end / dt)
t = np.linspace(0, t_end, n_steps + 1)
state = np.array([x0, v0])
x_num = np.zeros(n_steps + 1)
x_num[0] = state[0]

for i in range(n_steps):
    k1 = deriv(state)
    k2 = deriv(state + 0.5 * dt * k1)
    k3 = deriv(state + 0.5 * dt * k2)
    k4 = deriv(state + dt * k3)
    state = state + (dt / 6.0) * (k1 + 2*k2 + 2*k3 + k4)
    x_num[i + 1] = state[0]

# 解析解
x_exact = x0 * np.cos(wn * t) + (v0 / wn) * np.sin(wn * t)

# 误差
err = np.max(np.abs(x_num - x_exact))
print(f"最大绝对误差 = {err:.2e} m")

# 绘图
plt.figure(figsize=(10, 4))
plt.plot(t, x_exact, 'r-', linewidth=2, label='解析解')
plt.plot(t, x_num, 'b--', linewidth=1.5, label='RK4 数值解')
plt.xlabel('时间 t (s)')
plt.ylabel('位移 x (m)')
plt.title('弹簧-质量系统自由振动响应')
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()

运行上述代码后,预期输出为:ωn = 10.0000 rad/s、fn = 1.5915 Hz、T = 0.6283 s,数值解与解析解的最大绝对误差应在 1e-6 m 量级(取决于步长)。曲线应呈现等幅余弦振荡,周期约 0.628 s,振幅 0.05 m。

验证要点:
  • 固有频率 ωn = √(k/m) 与初始条件无关,改变 x₀ 或 v₀ 后 ωn 不变。
  • 无阻尼时振幅恒定,不衰减;若出现衰减,说明数值积分引入了数值阻尼或模型误加了阻尼项。
  • 周期 T = 2π/ωn,可通过曲线相邻同向过零点间距验证。
  • 振型为纯平动,质量块无转动,位移方向始终沿弹簧轴线。
若仿真曲线振幅随时间明显衰减,检查是否误加了阻尼项或积分步长过大导致数值耗散。若频率与理论值偏差较大,检查 k 与 m 的单位是否统一为 N/m 与 kg。