本节摘要:弹簧挂上一个质量,系统就有了自己的"心跳"——固有频率;阻尼决定它安静下来的速度;外部激励一旦踩上固有频率的步点,振幅便成倍放大,这就是共振。本节用拉格朗日方程立起单自由度振子的标准方程,把固有频率、阻尼比、共振放大倍数逐项算清,并用数值仿真复现自由振动的衰减与受迫振动的峰值。
上一章的拉格朗日方程在振动上最顺手:选离开平衡位置的位移作广义坐标,动能与势能写出来一减,振子方程自动成形。标准形是质量乘加速度加阻尼乘速度加刚度乘位移等于外激励——三项各管一摊:惯性定节奏,阻尼管衰减,刚度定归宿。整套脾气只用两个参数概括:固有频率(刚度与质量之比的平方根)与阻尼比(实际阻尼与临界阻尼之比)。这两个数是机器的体检指标:转子转速避开固有频率、结构减振先估阻尼比,工程核算的第一步都是先把它们要出来。
标准病例:一公斤质量挂在每米一百牛顿的弹簧下,阻尼系数取每秒每米二牛顿。固有频率十弧度每秒,阻尼比零点一——欠阻尼,系统会振着衰减。数值仿真把位移曲线走一遍,包络线按指数收敛,衰减快慢由阻尼比直接定价。
# 手术一:欠阻尼自由振动仿真 m*x'' + c*x' + k*x = 0 import math m, c, k = 1.0, 2.0, 100.0 wn = math.sqrt(k / m) # 固有频率 zc = c / (2 * math.sqrt(k * m)) # 阻尼比 wd = wn * math.sqrt(1 - zc**2) # 阻尼振动频率 print("固有频率 =", wn, "rad/s 周期 =", round(2*math.pi/wn, 4), "s") # 0.6283 s print("阻尼比 =", zc, " 阻尼频率 =", round(wd, 4), "rad/s") # 0.1 9.9499 # 解析包络:x 峰值按 e^(-zc*wn*t) 收敛 for t in (0.0, 0.5, 1.0, 2.0): print(f"t={t:4.1f}s 包络 = {math.exp(-zc*wn*t):.4f} × 初幅") # t= 0.0s 包络 = 1.0000 × 初幅 # t= 0.5s 包络 = 0.9048 × 初幅 # t= 1.0s 包络 = 0.8187 × 初幅 # t= 2.0s 包络 = 0.6703 × 初幅 # 判别三种归宿:阻尼比小于一振着停,等于一最快停,大于一爬着停 print("临界阻尼系数 =", 2 * math.sqrt(k * m), "N·s/m") # 20.0
包络读数给出"安静下来"的定价:阻尼比零点一时,每过一秒振幅缩掉近两成,想三秒内把残余振幅压到一成以下,阻尼比得加到零点七七——减振设计的定量依据就在这几行指数里。
给同一振子加上正弦激励,振幅放大倍数只随一个比值变:激励频率除以固有频率。比值一附近的峰值高度由阻尼比独家把守——阻尼比零点零五时放大近十倍,加大到零点二五峰值压到二倍出头。下面把放大曲线逐点算出,图上画的就是这三条曲线。
# 手术二:共振放大倍数 M(r) = 1/sqrt((1-r^2)^2 + (2*zeta*r)^2),r = 激励/固有 import math def M(r, zeta): return 1.0 / math.sqrt((1 - r*r)**2 + (2*zeta*r)**2) print("r=0.5 时的放大:", [round(M(0.5, z), 3) for z in (0.05, 0.1, 0.25)]) # r=0.5 时的放大:[1.33, 1.322, 1.265] print("r=1.0 时的放大:", [round(M(1.0, z), 3) for z in (0.05, 0.1, 0.25)]) # r=1.0 时的放大:[10.0, 5.0, 2.0] —— 峰值恰为 1/(2*zeta) print("r=2.0 时的放大:", [round(M(2.0, z), 3) for z in (0.05, 0.1, 0.25)]) # r=2.0 时的放大:[0.333, 0.33, 0.316] —— 远离共振反而隔振 # 隔振要点:激励频率高于约 1.4 倍固有频率后(与阻尼有关),放大倍数小于一 r_iso = math.sqrt(2 - 4 * 0.1 ** 2) print("隔振临界比 =", round(r_iso, 4), " 此处放大 =", round(M(r_iso, 0.1), 4)) # 1.4 1.0
曲线上的三行读数各有一条工程结论:激励频率过低时系统跟着外力走,放大约一;踩上固有频率时峰值严格等于阻尼比倒数的两倍,阻尼是共振唯一的天敌;频率高过固有频率约一点四倍后放大倍数跌破一——减振台故意把固有频率做得很低,就是要让干扰频率落到"隔振区"。

⚠️ 常见坑:共振峰不精确落在 r 等于一上。有阻尼时峰值频率略低于固有频率,工程上嫌差别小可以忽略,但精密仪器标定必须用有阻尼峰值公式——差之毫厘,放大倍数能差出一截。
共振曲线往右走是隔振区,但隔振系统自己也要"过减速带"——设备起动时激励频率必然从零爬升,中途必经共振点。工程的对策是"快速冲过峰值":起动够快,共振只来得及晃两下。评价隔振品质的量是传递率——传到基础的力幅与激励力幅之比,它恰好等于振幅放大倍数,阻尼在这里扮演尴尬角色:峰值要它压,隔振区里它反而把传递率抬高。
# 隔振对账:r=3 处的传递率随阻尼的变化 import math def M(r, zeta): return 1.0 / math.sqrt((1 - r*r)**2 + (2*zeta*r)**2) for z in (0.02, 0.1, 0.3): print(f"阻尼比 {z}: r=3 传递率 = {M(3.0, z):.4f}") # 阻尼比 0.02: r=3 传递率 = 0.125 # 阻尼比 0.1: r=3 传递率 = 0.1246 # 阻尼比 0.3: r=3 传递率 = 0.122 # 隔振区读数:传递率都压到 0.12 附近,阻尼越小反而略净——与共振区"加阻尼压峰"的诉求正相反 print("r=3 的无阻尼传递率 =", round(M(3.0, 0.0001), 4)) # 0.125
三行传递率给出隔振设计的分寸:工作点定在 r 大于三,阻尼只留最低限度防冲击。共振与隔振对阻尼的相反诉求,是同一条曲线两侧的貌合神离——看懂这一点,减振方案之争就不再是口味问题。
要点复盘:
振子挨了外力会抖,物与物相撞怎么办?下一节进入时间尺度更狠的病例:冲量一步清账,恢复系数定分配。