人—座椅—车耦合系统模型的物流卡车减振振动特性【附代码】
✅博主简介:擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。
✅ 如需沟通交流,扫描文章底部二维码。
(1)多自由度人-座椅-车耦合动力学建模与DA动力吸振器匹配:
为了分析物流卡车在空载和满载状态下驾驶员所受振动,建立了包含座椅悬架、人体集中质量、驾驶室悬置以及车厢-货物的多自由度耦合动力学模型。空载模型为五自由度:座椅垂直、人体垂直、驾驶室垂向和俯仰以及底盘垂向;满载模型增加车厢垂向和俯仰自由度。在座椅下方引入改进的DA动力吸振器,由一个弹性元件和阻尼元件并联的质量块构成,其固有频率通过调整弹性刚度与人体敏感频率4~8Hz重频段匹配。通过MATLAB计算空载和满载状态下系统的幅频特性,确定DA吸振器最优参数:质量比0.1,阻尼比0.25,频率比0.9。在减速带脉冲激励仿真中,加装优化DA吸振器后驾驶员座椅的垂直加速度峰值由2.45m/s²降至1.68m/s²,加权加速度均方根值降低31.4%。满载时货物质量增大使座椅传递率在7Hz附近产生额外峰值,通过微调吸振器频率比至0.85可有效抑制,验证了参数匹配的重要性。
(2)道路激励模型与幅频特性分析:
构建了减速带脉冲激励和ISO随机路面激励两种道路模型。减速带采用半正弦脉冲模型,高度50mm,宽度300mm;随机路面采用滤波白噪声法生成C级路面谱。通过拉普拉斯变换推导出空载和满载状态下驾驶员加速度对路面输入的传递函数,在0.5~20Hz频率范围内计算幅频特性曲线。结果揭示空载时座椅共振峰在4.2Hz处幅值达1.8,安装DA吸振器后幅值降至1.1;满载时货物导致的附加质量使驾驶室俯仰模态与座椅共振发生耦合,在6.8Hz附近产生新的峰值,DA吸振器对该耦合峰值的抑制效果有限。通过灵敏度分析发现,驾驶室后悬置刚度和座椅阻尼对该耦合模态影响最大,因此进一步提出调节驾驶室后悬置刚度(从200N/mm增至260N/mm)配合DA吸振器,使满载座椅加速度均方根值从1.32m/s²降至1.01m/s²。
(3)遗传算法多参数协同优化与Simulink仿真:
对人-座椅-车耦合系统的12个设计参数(座椅刚度、阻尼、DA吸振器质量、刚度、阻尼比,驾驶室前后悬置刚度和阻尼,轮胎刚度和阻尼等)进行遗传算法多目标优化。优化目标为最小化驾驶员座椅垂直加速度均方根值和悬架动行程;约束为车轮动载荷比低于1/3以保证接地性。编码采用实数编码,种群规模100,交叉概率0.8,变异概率0.1,精英保留20%,迭代80代。获得Pareto前沿后,利用TOPSIS法选取折中最优解。将最优参数代入Simulink模型仿真,在C级路面80km/h匀速行驶工况下,最优方案的座椅加速度均方根值为0.89m/s²,较原始参数降低37%,同时悬架动行程和车轮动载荷均在约束范围内。DA吸振器质量仅占座椅系统质量的8%,实现了轻量化与舒适性平衡,为物流卡车减振设计提供了参数指导。
import numpy as np from scipy.signal import lsim, tf # 多自由度人-座椅-车模型传递函数构建 def build_seat_model(params): # params包含质量、刚度、阻尼等 m_seat = params['m_seat'] k_seat = params['k_seat']; c_seat = params['c_seat'] m_DA = params['m_DA']; k_DA = params['k_DA']; c_DA = params['c_DA'] # 简化的座椅-DA系统传递函数:加速度/位移激励 num = [m_DA*c_seat, (m_DA*k_seat + c_seat*c_DA), (k_seat*c_DA + k_DA*c_seat), k_seat*k_DA] den = [m_seat*m_DA, (m_seat*c_DA + m_DA*c_seat), (m_seat*k_DA + c_seat*c_DA + m_DA*k_seat), (k_seat*c_DA + k_DA*c_seat), k_seat*k_DA] return tf(num, den) # 幅频特性分析 def frequency_response(seat_tf, f_range=np.linspace(0.5,20,200)): omega = 2*np.pi*f_range _, H = seat_tf.freqresp(omega) return f_range, np.abs(H).flatten() # 遗传算法参数优化 import random def genetic_algorithm_optimize(bounds, objective_func, pop_size=100, n_gens=80): n_vars = len(bounds) pop = np.random.rand(pop_size, n_vars) for i in range(n_vars): low, high = bounds[i] pop[:,i] = low + pop[:,i]*(high-low) for gen in range(n_gens): fitness = np.array([objective_func(ind) for ind in pop]) # 精英保留 elite_idx = np.argsort(fitness)[:20] new_pop = pop[elite_idx] while len(new_pop) < pop_size: parents = pop[np.random.choice(pop_size, 2, p=(1/fitness)/sum(1/fitness))] cross_point = np.random.randint(1, n_vars) child1 = np.concatenate([parents[0][:cross_point], parents[1][cross_point:]]) child2 = np.concatenate([parents[1][:cross_point], parents[0][cross_point:]]) if random.random()<0.8: # 交叉 new_pop = np.vstack([new_pop, child1, child2]) if random.random()<0.1: # 变异 mutant = child1 + np.random.normal(0,0.1,n_vars) new_pop = np.vstack([new_pop, mutant]) pop = new_pop[:pop_size] best = pop[np.argmin([objective_func(ind) for ind in pop])] return best如有问题,可以直接沟通
👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇
