阻尼比是无量纲的阻尼度量:小于 1 为欠阻尼(振荡衰减),等于 1 为临界阻尼(最快不振荡)。模态分析把多自由度振动分解为若干单自由度"振型"的叠加,每一阶振型有自己的固有频率。本节完成阻尼的实测估算、受迫振动的稳态求解、两自由度系统的特征值分析,打通通向有限元动力计算的最后一公里。
上一节把共振曲线立起来了,这一节补上两块:阻尼怎么量(它决定共振峰多高),多自由度怎么拆(真实结构频率不止一个)。它与第 7 章的接头最密:实验模态辨识测的就是本节定义的量,有限元特征值求解器算的就是本节的方程。
阻尼的物理来源驳杂(材料内摩擦、连接面滑移、空气阻力),工程上统一折算成等效粘滞阻尼,用阻尼比描述强弱。钢焊接结构约 1%–3%,混凝土结构 3%–8%,有阻尼器的结构可以设计到 15% 以上。实测的通行办法是"对数减缩":量自由衰减相邻两峰的幅值比取对数,除以周期。
import numpy as np from scipy.integrate import solve_ivp # 给单自由度系统加阻尼,模拟衰减曲线并反推阻尼比 m, k, zeta = 10.0, 4000.0, 0.03 c = 2 * zeta * np.sqrt(m * k) # 阻尼系数由阻尼比折算 w_n = np.sqrt(k/m) def rhs(t, s): return [s[1], -(c/m)*s[1] - (k/m)*s[0]] sol = solve_ivp(rhs, [0, 8], [0.05, 0.0], t_eval=np.linspace(0, 8, 4000), rtol=1e-10) # 找位移峰:局部极大 y = sol.y[0]; t = sol.t peaks = [i for i in range(1, len(y)-1) if y[i] > y[i-1] and y[i] > y[i+1]] amps = y[peaks]; times = t[peaks] delta = np.log(amps[0] / amps[1]) # 对数减缩(相邻峰) zeta_est = delta / np.sqrt(4*np.pi**2 + delta**2) print(f"真实阻尼比 0.03,对数减缩反推 {zeta_est:.4f}") print(f"相邻峰间隔 {times[1]-times[0]:.3f} s,阻尼固有周期略长于无阻尼周期 {2*np.pi/w_n:.3f} s") print(f"衰减包络:约 {1/(2*np.pi*zeta):.0f} 个周期后幅值降到 1/e")
阻尼比 3% 的系统要荡 50 多个周期才衰减到三分之一幅值——钢桥在重车过后余振不息,原因就在这里。反过来做实验:敲一下结构量衰减率,阻尼比就到手,这是第 7 章模态实验的敲门砖。
简谐激励下欠阻尼系统的响应分两段:瞬态段(自有振动按阻尼衰减)与稳态段(跟随激励频率的简谐运动)。工程关心的几乎全是稳态段:幅值放大系数、相位滞后(共振点附近相位翻转 180 度,这是辨识共振的实验特征——幅值未必精确可测,相位翻转骗不了人)。
import numpy as np # 稳态响应扫描:激励频率扫过固有频率,记录幅值与相位 m, k, zeta, F0 = 10.0, 4000.0, 0.03, 50.0 w_n = np.sqrt(k/m) print(f"{'频率比':>6} {'幅值mm':>8} {'相位deg':>8}") for r in [0.3, 0.7, 0.95, 1.0, 1.05, 1.3, 2.0]: w = r * w_n X = F0 / k / np.sqrt((1-r**2)**2 + (2*zeta*r)**2) # 稳态幅值 phi = np.degrees(np.arctan2(2*zeta*r, 1-r**2)) # 相位滞后 print(f"{r:6.2f} {X*1000:8.2f} {phi:8.1f}") print("相位在频率比 1 附近从不到 90 度跳到超过 90 度——共振判据比峰值更稳")
真实结构有分布的质量与刚度,离散后就是多自由度。振动方程写成矩阵形式后,特征值问题给出全部固有频率与振型:每一阶振型是结构的一种"固定舞步",初始扰动按各阶振型分解,各自以自己的频率振荡、以自己的速率衰减。两自由度系统足以展示全部核心现象:
import numpy as np # 两层框架简化:两层质量各 5 t,层刚度各 20000 kN/m m = 5000.0; k = 2e7 M = np.diag([m, m]) K = np.array([[2*k, -k], [-k, k]]) # 广义特征值问题:K phi = w^2 M phi eigvals, eigvecs = np.linalg.eig(np.linalg.solve(M, K)) idx = np.argsort(eigvals) w = np.sqrt(eigvals[idx].real) V = eigvecs[:, idx].real print(f"第一阶固有频率 {w[0]:.2f} rad/s,第二阶 {w[1]:.2f} rad/s") print(f"第一阶振型 {V[:,0]/V[0,0]}:同向,层间相对位移小") print(f"第二阶振型 {V[:,1]/V[0,1]}:反向,出现一个节点") # 模态质量归一化检查 for i in range(2): print(f"第 {i+1} 阶广义质量 = {V[:,i] @ M @ V[:,i]:.0f} kg(振型缩放任意,通常归一化)") # 与单层对比:每层单独的固有频率 print(f"单层等效固有频率 {np.sqrt(k/m):.2f} rad/s——耦合后劈成一低一高两阶")
第一阶两质量同向摆(整栋楼平移倾向),第二阶反向错动(层间互压)。地震反应谱分析先算前几阶频率与振型,就是把多自由度问题拆成一串单自由度分别应对再叠加——模态叠加法的全部思想就是这一句话。

💡 关键直觉:振型是"形状"不是"大小"——特征向量天然差一个缩放系数,工程上读完振型看的是节点位置与相对幅值,问"顶层位移是底层的几倍"有意义,问"顶层振型值等于几毫米"没有意义。
振动理论已经备齐。下一章进入收官:用实验验证预测、用有限元放大算力、用疲劳断裂补上时间维度的失效。