2. 弹簧-质量-阻尼系统的多领域仿真
系统构成与建模思路
弹簧-质量-阻尼平移系统是二阶机械动力学最典型的载体。本例把质量块 m、弹簧 k、阻尼器 c 三个物理元件分别建模,再通过“力平衡”这一物理连接关系组装成完整系统。多领域仿真的价值在于:机械平移域中的力、速度、位移与电气域中的电压、电流、转矩可以共用同一套求解框架,后续案例只需替换或增加域元件即可。
取质量块位移 x 向右为正,弹簧和阻尼器一端固定于墙、另一端连接质量块。外力 F(t) 作用于质量块。根据牛顿第二定律,质量块受力平衡关系为:
m·x''(t) + c·x'(t) + k·x(t) = F(t)
其中 m·x'' 为惯性力,c·x' 为阻尼力,k·x 为弹簧恢复力。系统无阻尼固有频率 ωn = √(k/m),阻尼比 ζ = c / (2√(km))。本例取 m = 1 kg、k = 100 N/m,则 ωn = 10 rad/s;通过改变 c 使 ζ 分别取 0.1、0.3、0.7、1.0,观察阶跃力 F = 10 N 下的位移响应。
多领域仿真实现
在支持多领域统一建模的仿真环境中,平移机械域通常提供质量、弹簧、阻尼、力源等标准元件。建模时把三个元件的一端连接到固定参考点(墙),另一端连接到同一个质量块节点,力源施加于质量块。求解器自动根据连接关系组装方程并积分。下面给出一个不依赖特定商业软件的 Python 数值实现,用于验证建模逻辑并生成响应曲线。
import numpy as np
from scipy.integrate import solve_ivp
import matplotlib.pyplot as plt
# 系统参数
m = 1.0 # 质量 kg
k = 100.0 # 弹簧刚度 N/m
F_step = 10.0 # 阶跃力 N
# 阻尼比扫描
zeta_list = [0.1, 0.3, 0.7, 1.0]
wn = np.sqrt(k / m) # 10 rad/s
def system(t, y, c):
x, v = y
dxdt = v
dvdt = (F_step - c * v - k * x) / m
return [dxdt, dvdt]
t_span = (0, 3.0)
t_eval = np.linspace(0, 3.0, 3000)
plt.figure(figsize=(9, 5))
for zeta in zeta_list:
c = 2 * zeta * np.sqrt(k * m)
sol = solve_ivp(system, t_span, [0, 0], args=(c,),
t_eval=t_eval, rtol=1e-8, atol=1e-10)
plt.plot(sol.t, sol.y[0], label=f'ζ={zeta}, c={c:.1f} N·s/m')
plt.axhline(F_step / k, color='gray', linestyle='--', linewidth=1,
label='稳态位移 0.1 m')
plt.xlabel('时间 t (s)')
plt.ylabel('位移 x (m)')
plt.title('不同阻尼比下的阶跃位移响应')
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
运行后应观察到:ζ = 0.1 时振荡剧烈、超调约 73%;ζ = 0.3 时超调约 37%;ζ = 0.7 时超调约 4.6%,接近临界阻尼;ζ = 1.0 时无超调,缓慢趋近稳态值 F/k = 0.1 m。所有曲线最终都收敛到同一稳态位移,说明阻尼只影响动态过程,不改变静态平衡位置。
若仿真环境提供“参数扫描”或“批处理”功能,可直接把
c 设为扫描变量,一次性生成多条响应曲线,避免手动重复运行。判断超调量时,读取响应峰值与稳态值之差再除以稳态值即可。结果判读与验证要点
- 稳态验证:所有阻尼比下位移最终应趋于
F/k = 0.1 m,若偏离说明力平衡或单位有误。 - 超调趋势:阻尼比越小,超调越大、振荡次数越多;
ζ ≥ 1后不再出现超调。 - 固有频率验证:对
ζ = 0.1的曲线测量相邻峰值时间间隔,应接近2π/ωd,其中ωd = ωn√(1-ζ²)。 - 能量视角:弹簧势能与动能周期性交换,阻尼器持续耗散能量,因此振幅逐渐衰减。
数值求解时若步长过大或容差过松,小阻尼比下的振荡峰值可能被低估。建议对
ζ = 0.1 的工况使用更小的相对容差(如 1e-8)并加密输出点,确保峰值捕捉准确。