简介:面向车辆工程、车辆动力学学习与悬架控制分析的读者,这份MATLAB脚本围绕二自由度悬架模型展开,用传递函数刻画车轮与车身在垂直方向的动态响应,并支持不同阻尼系数下的曲线与时域响应对比,适合课程设计、论文复现和参数调优参考。压缩包为zip格式,仅含1个.m文件,体积约1KB,核心内容集中在传递函数计算脚本中,便于直接阅读、运行和按需修改。已有1598人学习下载,可作为悬架频域分析与多阻尼方案比较的轻量级练习材料。读者可据此理解双质量悬架建模中车轮质量、车身质量、弹簧刚度与阻尼系数的设置方式,观察共振频率、振幅衰减以及多阻尼方案对舒适性与操控稳定性的影响,并以此为基础扩展频域分析和时域仿真,为悬架参数匹配与性能评估形成可复用的分析框架。
1. 加硬减振器反而更颠:二自由度悬架传递函数里的反直觉结论
很多开发者第一次调悬架参数时,都会带着一个朴素的直觉:减振器阻尼越大,车就越「整」,越不晃。把车辆悬架的传递函数画出来,这个直觉会在某个频率段被直接否定——在 10 Hz 出头的车轮跳动共振区,阻尼比从 0.1 拉到 0.5,簧上质量的振动传递率不是下降,而是抬高;再往高频走,整条隔振曲线跟着一起往上走。原因并不难理解:阻尼器把簧上质量和簧下质量在动态上「连接」在一起,轮子的每一次跳动都被更忠实地送进车身。搞懂这件事的价值在于,它决定了一个悬架调校的边界——低频段可以靠阻尼来改善,高频段反而会被阻尼破坏,想改善只能靠降低簧下质量、加大轮胎柔度。而这一切的入口,就是那个四阶分母的二自由度传递函数。
2. 从两个质量块到四阶分母:二自由度模型怎么变成传递函数
2.1 自由度为什么是 2 而不是 3
先把模型建立起来。四分之一车模型把一辆车沿纵向切开,只取一个车轮所在的那一片,假设车身在这一片上只做垂向平动。于是独立坐标只有两个:簧上质量 m2 的垂向位移 z2,和簧下质量 m1 的垂向位移 z1。路面高程 z0(t) 作为已知激励输入,不参与自由度计数——它不是系统自己「能动」的坐标,而是被强加给轮胎底部的边界条件。
这就是「二自由度」的确切含义:两个惯性元件、两条独立运动方程、一个外部输入。俯仰、侧倾、纵向力全部被四分之一车假设砍掉了,所以这个模型对车身弹跳和车轮跳动这两件事解释得极准,对过弯侧倾、急加速后蹲这类现象则完全无解释力。知道它的适用边界比会推公式更重要,很多调校讨论中的争论,本质是有人把四分之一车的结论用到了它管不着的地方。
| 符号 | 含义 | 典型乘用车量级 |
|---|---|---|
| m2 | 簧上质量(车身、乘员、行李) | 300 kg |
| m1 | 簧下质量(轮辋、轮胎、制动、部分悬架件) | 40 kg |
| k2 | 悬架弹簧刚度(折算到轮心) | 20 kN/m |
| k1 | 轮胎径向刚度 | 200 kN/m |
| c | 减振器阻尼系数 | 0.1~0.7 倍临界阻尼 |
悬架部分是一个弹簧 k2 与一个阻尼器 c 并联,连接 m1 和 m2;轮胎简化成一个只有刚度没有阻尼的弹簧 k1,连接 m1 和路面。轮胎阻尼通常只有轮胎刚度的千分之几量级,在 20 Hz 以下的垂向分析里可以忽略,这是行业里被反复验证过的简化,不是偷懒。
2.2 运动方程、矩阵形式与拉普拉斯变换
按牛顿第二定律对两个质量分别列方程,位移都以静平衡位置为原点、向上为正。悬架力对 m2 是阻力,对 m1 是反作用力;轮胎力只作用在 m1 上,方向指向路面。
m2·z2'' = -k2(z2 - z1) - c(z2' - z1') m1·z1'' = +k2(z2 - z1) + c(z2' - z1') - k1(z1 - z0)
整理成矩阵形式 M·q'' + C·q' + K·q = F·z0,其中 q = [z2, z1]^T:
M = [[m2, 0], [0, m1]] C = [[c, -c], [-c, c]] K = [[k2, -k2], [-k2, k2 + k1]] F = [0, k1]^T
质量矩阵是对角的,阻尼矩阵和刚度矩阵是耦合的、非对角的——耦合项就是「相对运动」这件事在矩阵上的体现。注意 K 的 (2,2) 位置是 k2 + k1,因为簧下质量同时被悬架弹簧和轮胎弹簧顶着;而 K 的 (1,1) 位置只有 k2,因为簧上质量下面只挂着悬架。这个不对称,后面会变成两个共振峰分离的根本原因。
对零初值做拉普拉斯变换,微分算子 s 直接替换掉求导:
(M·s² + C·s + K)·Q(s) = F·Z0(s)
于是 Q = (M·s² + C·s + K)^(-1)·F·Z0,两个传递函数的分母都是这个 2×2 矩阵的行列式。用符号计算把这一步做干净,比手推省事得多:
import sympy as sp s = sp.Symbol('s') m1, m2, k1, k2, c = sp.symbols('m1 m2 k1 k2 c', positive=True) Z0, Z1, Z2 = sp.symbols('Z0 Z1 Z2') # 拉普拉斯域下两条运动方程,零初值 eq1 = sp.Eq((m2*s**2 + c*s + k2)*Z2 - (c*s + k2)*Z1, 0) eq2 = sp.Eq(-(c*s + k2)*Z2 + (m1*s**2 + c*s + k2 + k1)*Z1, k1*Z0) sol = sp.solve([eq1, eq2], [Z1, Z2], dict=True)[0] H2 = sp.simplify(sol[Z2] / Z0) # 簧上位移 / 路面位移 H1 = sp.simplify(sol[Z1] / Z0) # 簧下位移 / 路面位移 # 取出公共分母,做多项式展开 den = sp.denom(sp.together(H2)) print(sp.expand(den)) print(sp.simplify(H2))跑出来的分母对两个传递函数完全相同,展开后是四阶多项式。这一步的意义在于:分母是系统的固有属性,和你看哪个输出无关。簧上位移、簧下位移、簧上加速度、轮胎动载荷,这些量的传递函数分子各不相同,但分母铁定是同一个,说明它们的共振频率是共享的。凡是看到两个「不同输出」的共振峰不重合,基本可以断定是算错了。
2.3 分母 Δ(s) 展开后每一项在说什么
展开后的公共分母长这样:
Δ(s) = m1·m2·s⁴ + c(m1 + m2)·s³ + [k2(m1 + m2) + k1·m2]·s² + c·k1·s + k1·k2
五个系数逐项读一遍,每一项都在讲一个物理事实:
s⁴ 项系数是两个质量的惯性积,决定最高频段的渐近行为。s³ 项系数里出现的是 c 乘以 (m1 + m2),说明阻尼作用的对象是「两个质量的相对运动」,等效惯性是总质量,而不是某一个单独的质量。s² 项系数由两部分相加:k2 通过总质量起作用,k1 只通过簧上质量起作用——因为轮胎弹簧下面没有别的惯量可以推,它只能间接推动簧上质量。
s 项只有 c·k1 这一项,没有 c·k2。这一项反映的是悬架弹簧的静变形在相对坐标里被抵消了,剩下的只有轮胎刚度参与的高频阻尼路径。这一项的存在,是后面高频段「加阻尼反而更颠」的根本原因:频率越高,s 项和高阶项的相对权重变化,使得阻尼的作用从「抑制相对运动」转向「强行传递运动」。
常数项 k1·k2 是两个弹簧串联的静刚度乘积。如果让 s → 0,传递函数趋于 k1·k2/(k1·k2) = 1,也就是静态下簧上位移完全跟随路面,符合直觉:车停在坡上,车身就是跟着地面一起倾斜。
分子那边,H2(s) = k1(c·s + k2)/Δ(s),H1(s) = k1(m2·s² + c·s + k2)/Δ(s)。簧下位移的分子多了一个 m2·s² 项,意味着在高频处簧下位移会先「自己振起来」,而簧上还来不及响应。这两个分子的差别,就是「车轮跳」和「车身跳」在数学上的分工。
3. 两个共振峰从哪来:特征多项式与零极点的物理对应
3.1 特征方程近似解耦:k2/m2 与 (k1+k2)/m1
令 Δ(s) = 0 得到特征方程,四个根对应两个振动模态。严格求解要解四次方程,工程上一般用解耦近似:当 m1 远小于 m2 时,两个模态的频率可以分开估。
低频模态(车身弹跳)近似 ω1² ≈ k2/m2。代入典型值 20 kN/m 和 300 kg,ω1 ≈ 8.16 rad/s,即 1.30 Hz。这个频率区间正好落在人体最敏感的 0.5~2 Hz 附近,所以车身弹跳的幅值控制直接决定乘坐感受。
高频模态(车轮跳动)近似 ω2² ≈ (k1 + k2)/m1。代入 220 kN/m 和 40 kg,ω2 ≈ 74.2 rad/s,即 11.8 Hz。这一段的振动主要通过方向盘、座椅底板和地板传进来,主观感受是「麻」和「碎」。
两个频率相差约 9 倍,说明解耦近似在这个参数下站得住。如果簧下质量被做大(比如重型越野车的整体桥),m1 上去了,ω2 会掉到 8 Hz 附近,和车身模态靠得太近,两个峰开始互相影响,解耦近似失效,这时候就必须老老实实解四次方程。
这里有一个极易被忽略的细节:同一个阻尼系数 c,对应两个不同的阻尼比。定义 ζ1 = c / (2√(k2·m2)),ζ2 = c / (2√((k1+k2)·m1))。代入数值,临界阻尼 c_crit1 = 2√(20000×300) ≈ 4899 N·s/m,而 c_crit2 = 2√(220000×40) ≈ 5933 N·s/m。当 c = 1470 时,ζ1 ≈ 0.30,ζ2 ≈ 0.248。所以「阻尼比 0.3」这句话,如果不说是对哪个模态说的,就是一句不完整的话。调校沟通里因为这件事出现错误判断,并不少见。
3.2 传递函数的零点与高频渐近斜率
H2(s) 的分子是 k1(c·s + k2),有一个实零点 s = -k2/c。这个零点对应一个「反共振」现象:在某个频率附近,簧上质量的响应会出现一个局部极小值。物理上可以这么理解——车轮在跳,但车身恰好不动,因为悬架力和惯性力在这个频率上互相抵消了。这个反共振点的位置随 c 变化,阻尼越小,零点越靠近虚轴,反共振坑越深、越明显。
更关键的是高频渐近。令 s → ∞,分母由 m1·m2·s⁴ 主导,分子由 k1·c·s 主导:
|H2(jω)| ≈ k1·c / (m1·m2·ω³)
这条式子信息量极大。幅值随 ω 的三次方衰减,在对数坐标上是 -60 dB/dec,比单自由度系统的 -40 dB/dec 更陡,多出来的那 20 dB 来自轮胎这个「二级弹簧」。同时幅值正比于 c,反比于 m1 和 m2。想让高频隔振变好,只能减小阻尼、减小簧下质量——这两个方向都和低频段的需求相反。这就是悬架调校里那个经典的矛盾,它在传递函数上就是一个分子分母的对抗。
顺带说一句,-60 dB/dec 这个斜率在实车上很少能完整测到,因为车身上还有大量局部模态、衬套非线性、内饰板共振,实测曲线在 30 Hz 以后往往就乱了。所以拿仿真曲线去做高频结论时,要对 30 Hz 以上的部分保持一份警惕。
3.3 轮胎刚度 k1 是影响全局但容易被忽略的参数
k1 在传递函数里出现了四次:s² 项里的 k1·m2、s 项里的 c·k1、常数项里的 k1·k2、以及分子里的 k1(c·s + k2)。它不像 k2 那样只影响一个频段,而是同时改变两个模态。
把 k1 从 200 kN/m 提到 400 kN/m(相当于从普通胎换成低扁平比的高性能胎),ω2 从 11.8 Hz 升到 √(420000/40)/2π ≈ 16.3 Hz,车轮模态被推高;同时高频渐近幅值直接翻倍。主观上就是「路感变清晰、细碎振动变多、过接缝更硬」。这不是心理作用,是传递函数上实打实的两处变化。
反过来,把 k1 降到 150 kN/m,ω2 掉到约 10.3 Hz,高频隔振改善,但轮胎静变形加大,转向响应变迟钝,滚动阻力上升。所以 k1 从来不是「舒适性参数」,它是舒适性、操控、耐久三者共享的一个约束。认识到这一点,就不会再指望通过改轮胎配方来单独解决某一个频段的问题。
4. 多阻尼扫频对比:把 ζ 从 0.1 拉到 0.7 会发生什么
4.1 数值实现:从符号推导切到复数频率响应
符号推导给出了解析结构,但要看清「多阻尼对比」这件事,还是得把频率响应算出来。方法很直接:把 s 沿虚轴取值 s = jω,代入传递函数,扫一遍 ω 就得到幅频特性。这一步不需要解微分方程,也不需要时域仿真,纯代数。
import numpy as np def quarter_car_frf(m1, m2, k1, k2, c, f): """返回簧上位移传递率和簧下位移传递率,f 单位 Hz""" s = 1j * 2 * np.pi * f # 拉普拉斯变量沿虚轴取值 den = ((m1*s**2 + c*s + k2 + k1) * (m2*s**2 + c*s + k2) - (c*s + k2)**2) # 公共分母 Δ(s) H2 = k1 * (c*s + k2) / den # 簧上位移 / 路面位移 H1 = k1 * (m2*s**2 + c*s + k2) / den return H2, H1函数里的 den 就是上一章展开的那个四阶多项式,只不过这里保留未展开形式,避免高次幂在数值上丢精度。f 用数组广播,一次能算出整条曲线。注意 s 的取值是 1j * 2πf,不是 1j * f——这个 2π 漏掉,整条曲线会整体右移 6.28 倍,是排查时最先要看的点。
m1, m2 = 40.0, 300.0 k1, k2 = 200_000.0, 20_000.0 c_crit = 2 * np.sqrt(k2 * m2) # 车身模态临界阻尼,约 4899 N·s/m f = np.logspace(-1, 2, 3000) # 0.1 Hz ~ 100 Hz,对数分布 print(f"{'zeta':>5} {'车身峰':>8} {'车轮峰':>8} {'30Hz':>9} {'60Hz':>9}") for z in [0.10, 0.20, 0.30, 0.50, 0.70]: c = z * c_crit H2, _ = quarter_car_frf(m1, m2, k1, k2, c, f) mag = np.abs(H2) # 位移传递率,无量纲 body_peak = mag[(f > 0.8) & (f < 2.5)].max() wheel_peak = mag[(f > 8) & (f < 16)].max() at30 = np.interp(30, f, mag) at60 = np.interp(60, f, mag) print(f"{z:>5.2f} {body_peak:>8.2f} {wheel_peak:>8.3f} {at30:>9.5f} {at60:>9.5f}")代码按车身模态定义阻尼比,因为工程上调校习惯先说车身。改成按车轮模态定义也行,只要全程统一,否则对比就失去意义。f 的扫描范围选 0.1 到 100 Hz,覆盖两个模态及其隔振区;点数 3000 保证在对数坐标上足够平滑,同时不会让高次幂的浮点误差放大。
4.2 低频峰与高频隔振区此消彼长
跑出来的结果定性上是这样的(数值随参数变化,量级参考):
| 阻尼比 ζ1 | 1.3 Hz 车身峰 | 11.8 Hz 车轮峰 | 30 Hz 传递率 | 60 Hz 传递率 |
|---|---|---|---|---|
| 0.10 | ~5.0 | ~0.10 | 1.5e-3 | 1.9e-4 |
| 0.20 | ~2.6 | ~0.11 | 3.0e-3 | 3.8e-4 |
| 0.30 | ~1.8 | ~0.13 | 4.4e-3 | 5.6e-4 |
| 0.50 | ~1.3 | ~0.15 | 6.6e-3 | 9.4e-4 |
| 0.70 | ~1.15 | ~0.17 | 8.7e-3 | 1.3e-3 |
低频车身峰随阻尼上升而快速下降,这条曲线几乎所有教材都会画,也是「加阻尼更稳」这个直觉的来源。但把另外三列放在一起看,故事就变了:车轮峰随阻尼上升而缓慢抬升,30 Hz 和 60 Hz 的传递率几乎是线性增长的,ζ 从 0.1 到 0.7,高频隔振能力恶化了将近 7 倍。
这个现象在实际驾驶中的对应非常直接。减振
本文还有配套的精品资源,点击获取