ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

车桥耦合振动分析:基于Matlab和Newmark法的实现与验证

车桥耦合振动分析:基于Matlab和Newmark法的实现与验证 1. 车桥耦合问题的定位与建模思路1.1 什么是车桥耦合振动车桥耦合振动简单说就是车辆过桥时车辆和桥梁谁也没法“撇开对方单独算”。一辆重车驶过一座简支梁桥轮胎不断给桥面施加竖向压力桥面因此产生挠度和振动而桥面一旦上下运动车轮的支撑点也随之上上下下车辆的惯性、悬挂弹簧和减振器在这种运动中被持续激发。两边互相输入、互相反馈运动方程必须放到同一个时间轴上联立求解。这个现象在工程上有多重要最直接的一个后果就是动态冲击效应。车辆荷载不是静止地压在桥上而是跑起来的速度、路面平整度、车辆悬挂特性都会让桥梁实际响应的峰值比静载算出来的大一些。桥梁设计规范里通常会用冲击系数来考虑这个放大但规范给的往往是一个包络性的经验值。研究具体桥梁、具体车型尤其在做旧桥评估、特种车辆过桥、高速铁路桥梁设计时只靠规范系数常常不够必须通过数值仿真把动态过程算清楚这就是车桥耦合分析存在的意义。Matlab做这个事非常合适矩阵运算方便内置线性求解器和绘图工具齐全算法逻辑透明适合课程设计、科研前期验证和工程快速评估。而Newmark法作为结构动力学里最经典的直接时间积分算法稳定、直观、代码量小被大量用在车桥耦合程序里算得上是这个方向的“标准答案”。1.2 为什么选择Newmark法而非其他方法结构动力学求解无非两大路线频域法和时域法。频域法在平稳随机激励下有优势但车桥系统里车辆在移动接触位置随时间变化系统刚度矩阵是时变的频域处理非常别扭。时域直接积分法就自然多了——一步一个脚印把整个响应算出来。在直接积分法内部又有多种选择中心差分法简单但它是显式方法步长受稳定性限制对桥梁这种低频结构还能接受一旦车辆模型含有较高自振频率成分时间步长会被卡得很小计算量暴涨。Wilson-θ法和Newmark法都是隐式方法无条件稳定在合适参数下时间步长可以按工程精度选取不用过分担心数值发散。我实际写代码时偏爱Newmark法还有个原因它可以在同一个算法框架里同时处理车辆子系统和桥梁子系统把两个方程组装成一个大系统来推进逻辑非常统一排查错误也容易。参数选取上常用的是平均加速度法即γ1/2、β1/4。此时Newmark法是无条件稳定的意味着时间步长可以主要由计算精度要求来定而非稳定性限制。工程上我习惯取桥梁基本周期的1/10到1/20作为步长再结合车辆高频成分做一些调整这个稍后在调试部分会详细展开。2. 动力学模型的数学化拆解2.1 桥梁子系统模态叠加还是有限元离散桥梁怎么建模直接影响计算精度和成本。常见的做法分两类。一类是连续梁或有限元离散把桥梁离散成若干单元每个节点有竖向位移和转角自由度组集质量矩阵、刚度矩阵和阻尼矩阵。这个办法最通用能处理变截面、多跨连续梁、墩梁相互作用等复杂情况缺点是自由度多矩阵规模大但Matlab下几百个自由度求解仍然很快所以不少精细分析都选这条路。另一类是模态叠加法。先把桥梁的自振频率和振型求出来比如简支梁可以用解析振型或者从有限元模型里提取前若干阶模态然后只对模态坐标做积分。模态截断能把自由度从几百降到十几二十个计算速度飞快。它的限制是必须保证被截断的高阶模态对响应贡献不大而车辆荷载含有高频成分时这个假设不一定成立需要谨慎。我自己的习惯是做方案对比和参数扫描时用模态叠加把前5阶甚至前3阶模态保留就够了需要看局部应力和复杂约束作用时用有限元离散。课程设计或者教学演示如果桥梁是简支梁用模态叠加反而更能突出车桥耦合的物理本质因为你能清楚地看到每一阶模态是怎么被移动荷载激活的。把桥梁运动方程写成矩阵形式[ M_b ]{ü_b } [ C_b ]{u_b } [ K_b ]{u_b } { F_b(t) }其中u_b是桥梁位移向量F_b(t)是车辆作用在桥面上的移动集中力。阻尼矩阵如果拿不准工程上常用瑞利阻尼即C_b α M_b β K_b两个系数用两阶目标阻尼比反算。2.2 车辆子系统从四分之一车模型到整车模型车辆模型有各种复杂程度。最常用的入门模型是四分之一车模型也就是把单侧车轮加对应的四分之一的簧上质量画成一个两自由度体系车身质量m_s连接着悬挂弹簧刚度和阻尼下方是车轮质量m_u车轮再通过轮胎刚度与桥面接触。别小看这两个自由度它能抓住车身和车轮两个主要振动频带很多研究中用这个模型已经能很好地模拟桥梁冲击效应。车辆运动方程的一般形式[ M_v ]{ü_v } [ C_v ]{u_v } [ K_v ]{u_v } { F_v(t) }这里的F_v(t)来自轮胎和桥面的接触包含两部分一个是轮胎刚度造成的弹性力一个是轮胎阻尼造成的内摩擦力。接触点的位移是车辆轮轴位移减去桥面接触点位移再减去路面不平顺高程。如果把路面粗糙度r(x)放进去接触压缩量可以写成δ z_w - w_b(x, t) - r(x)其中z_w是轮轴绝对位移w_b是桥梁在车轮位置的挠度。轮胎力则写成F_t k_t δ c_t δ这就是车辆和桥梁交换信息的接口整个耦合分析的“心脏”。更复杂的还有半车模型前后两轴车体有俯仰自由度和整车空间模型四个车轮、车身有垂直、俯仰、侧倾运动。自由度越多计算越接近真实车辆但参数获取难度也直线上升。我建议先跑通四分之一车模型的程序把耦合迭代逻辑练熟再往半车、整车扩展代码结构基本不变只是矩阵变大。2.3 耦合系统的组装与时变特征把车辆和桥梁方程摆在一起时会发现整个系统矩阵并不能像普通结构那样一成不变地组装好车轮在桥面上的位置n时刻在变桥梁自由度只存在于它经过的节点上等效刚度矩阵里会混入车辆的质量、刚度、阻尼贡献而且这些贡献随接触点位置移动而改变。换句话说这是一个时变系数系统。处理这个问题的办法主要有两种显式迭代和整体组装。显式迭代的思路是每一步先假定桥梁位移算出轮胎力把轮胎力作为外荷载代入车辆方程求轮轴位移再把轮胎力作用到桥梁上求解新的桥梁位移反复迭代直到收敛。这个办法实现简单但迭代收敛性在车速高、刚度大时可能出问题。整体组装则把车辆自由度和桥梁自由度合并成一个系统向量q [q_b; q_v]在每一步按当前车轮所在单元插值出桥梁位移拼出当前时刻的等效M、C、K矩阵然后统一做Newmark积分。这个办法更稳定也更好理解。我写的程序采用的就是后者实际跑下来收敛行为很顺。后面讲代码实现时也按照这个整体组装的逻辑来拆。3. Newmark法原理与在耦合系统中的落地策略3.1 Newmark法的基本递推关系Newmark法本质上是给加速度在时间步内假设一个变化规律然后利用泰勒展开推导出位移和速度的递推关系。基本公式如下对tΔt时刻u_{tΔt} u_t Δt·v_t Δt²/2·[(1-2β)·a_t 2β·a_{tΔt}]v_{tΔt} v_t Δt·[(1-γ)·a_t γ·a_{tΔt}]其中γ、β是两个控制参数。β控制了一个时间步内加速度插值形状γ则控制速度递推式的阻尼特性。当γ1/2时算法不引入多余的数值阻尼当β1/4时相当于假设加速度在步内保持为常数即平均加速度法。有了这个递推关系再加上tΔt时刻的运动方程M·a_{tΔt} C·v_{tΔt} K·u_{tΔt} F_{tΔt}把速度、位移的递推式代进去就能整理出关于a_{tΔt}的等效方程。实际写程序时更方便的是先引入“等效刚度矩阵”K_eff M γ·Δt·C β·Δt²·K然后求解K_eff·a_new F_new - C·v_pred - K·u_pred其中v_pred、u_pred是根据t时刻状态外推得到的预测值。求出a_new以后再回代更新u_new和v_new。3.2 稳定性、精度与参数选取Newmark法不是随便选参数都能稳定。对线性系统无条件稳定需要满足γ ≥ 1/2 β ≥ (γ 1/2)²/4也就是说当γ1/2时β必须不小于1/4。β1/4正好是边界称为平均加速度法它没有数值阻尼周期误差也很小是默认选择。如果选用β1/6线性加速度法虽然没有数值阻尼但是条件稳定时间步长必须小于系统最小周期的某个倍数否则计算会飞出天际。很多新手看到“无条件稳定”就以为步长可以随便给这是错的。无条件稳定说的是不会出现指数型发散但积分精度是另外一码事。步长太大高频成分会被严重“抹平”低频响应的幅值和相位也会偏移。车桥耦合系统里车辆车轮质量对应的频率往往到十几赫兹如果步长取0.005秒一个周期里只有十几个点算出来的冲击过程就可能失真。所以步长选择要看系统最高有效频率而不是只看桥梁自振频率。3.3 把Newmark法应用到时变耦合系统在耦合系统里实施Newmark法最大的变化是矩阵每一时刻都可能不同。车辆和桥梁的接触力依赖桥梁位移和车速这会导致等效刚度和等效荷载都要在循环体内重新计算。我的做法是先把原始M、C、K矩阵组装出来其中车辆部分矩阵是常定的桥梁部分矩阵也是常定的只有“耦合项”是时变的也就是车轮与桥梁接触节点之间插值出来的那部分。为了贴近有限元思路我会把车轮支撑点看成一根“虚拟弹簧-阻尼器”连接在桥面某个单元内的插值点上。这样组装时虚拟弹簧刚度需要乘上插值系数分配到两个节点自由度上等效矩阵里就出现了随接触点移动的项。这一步是程序里最容易写错的地方。如果只在荷载向量上把轮胎力加到桥梁节点而不去更新等效刚度矩阵遇到刚性很大的轮胎时迭代就会振荡甚至发散。把耦合刚度真正并入系统矩阵后程序稳定性会好很多。后面代码示例中我会特别注意演示这一块的写法。4. Matlab代码实现全流程4.1 参数定义与预处理第一步把物理参数全部整理成一个结构体方便修改和扩展。我习惯分几类桥梁参数、车辆参数、路面参数和计算参数。桥梁参数主要是跨度、单位长度质量、弹性模量、截面惯性矩、阻尼比和要保留的模态数。车辆参数包括车体质量、悬挂刚度、悬挂阻尼、车轮质量、轮胎刚度、轮胎阻尼、轴距和车速。路面参数指路面不平顺可以用一条功率谱密度曲线生成也可以简化成单一正弦波。计算参数包括总模拟时长、时间步长、Newmark的β和γ。如果采用模态叠加法桥梁部分预计算很简单用解析式生成简支梁第i阶模态的圆频率和振型函数。我通常会先跑一次特征值分析把前几阶频率打印出来和手算结果对照一下确保参数没给错。这一步看似多余但能避免后面“仿真结果离谱”时到处找原因的窘境。下面是一段参数定义的示意代码% 桥梁参数 bridge.L 30; % 跨度单位m bridge.m 18000; % 单位长度质量kg/m bridge.EI 2.5e10; % 抗弯刚度N·m^2 bridge.zeta 0.02; % 阻尼比 bridge.nmode 5; % 保留模态数 % 车辆参数1/4车模型 vehicle.ms 10000; % 车体质量(1/4)kg vehicle.ks 300000; % 悬挂刚度N/m vehicle.cs 12000; % 悬挂阻尼N·s/m vehicle.mu 1000; % 车轮质量(单轮)kg vehicle.kt 2000000; % 轮胎刚度N/m vehicle.ct 1000; % 轮胎阻尼N·s/m vehicle.v 20; % 车速m/s % 计算参数 sim.dt 0.002; % 时间步长s sim.T 3; % 总模拟时长s sim.Nt round(sim.T/sim.dt); sim.beta 1/4; % Newmark参数 sim.gamma 1/2;桥梁模态参数我一般单独写一个函数去生成返回模态位移矩阵、频率向量和质量矩阵。简支梁第n阶模态振型是sin(nπx/L)在计算车轮接触点位移时用插值函数把这些模态位移插值到车轮位置即可。4.2 主循环里的三步计算主循环是整个程序的核心。结构上分成三步组装当前时刻系统矩阵、用Newmark法求解、更新车辆位置和桥梁变形。下面给出主体流程% 初始化状态向量 qb zeros(bridge.nmode, 1); % 桥梁模态位移 vb zeros(bridge.nmode, 1); ab zeros(bridge.nmode, 1); qv zeros(size(vehicle.mass_matrix)); % 车辆位移 ... % 初始条件设置 % 预存储响应 hist_b zeros(bridge.nmode, sim.Nt); hist_qv zeros(vehicle.ndof, sim.Nt); for n 1:sim.Nt t (n-1) * sim.dt; xv vehicle.v * t; % 车辆当前位置 % 第一步根据轮轴位置计算桥梁插值矩阵 phi bridge_mode_shape_at(xv, bridge.L, bridge.nmode); dphi ...; % 如果需要速度耦合则计算导数 % 第二步组装时变耦合矩阵 [K_eff, F_eff] assemble_system(K_const, M_const, C_const, ... phi, vehicle, t, qb, qv); % 第三步Newmark求解 adot_new K_eff \ F_eff; ... % 更新状态再更新桥梁模态力 end组装函数里最容易忽略的是车辆自重这一项。车辆质量并不只是通过动态耦合效应作用到桥梁上还有恒定不变的静载需要在荷载向量里额外加一个重力分量。如果不加你会算出一个“零初始挠度”的奇怪结果车辆像是浮在空中过桥。组装时的大致公式是在tΔt时刻考虑系统方程M·a_new C·v_new K·u_new F_ext整理后K_eff M γΔt C βΔt² KF_eff F_ext - C·(v_t Δt(1-γ)a_t) - K·(u_t Δt v_t Δt²/2 (1-2β) a_t)注意这里的K、C、M都需要包含车辆和桥梁的贡献并且耦合刚度项随车轮位置变化。我把这部分封装成一个函数输入是车轮所在位置和当前状态向量输出是完整的K_eff和F_eff主循环就非常干净方便扩展。4.3 结果后处理与可视化要点算完以后不要急着画一条位移曲线就完事。我一般会输出三类结果桥梁跨中挠度时程、车辆车身加速度时程、以及轮胎力时程。这三条曲线的组合能看出很多问题。跨中挠度时程可以直接和静载挠度对比算动态冲击系数。车辆加速度时程能体现乘坐舒适性也能检查车辆自振是否被正确激发。轮胎力时程则是桥梁输入荷载的直观记录如果这一条曲线出现剧烈振荡往往是数值参数有问题。可视化方面我建议把桥梁变形画成“动画回放”式的图用subplot把桥梁瞬时变形和车辆位置画在一起再配上跨中挠度时程。这一步虽然不增加任何新计算结果但调试时会有很大帮助——当系统发散位移图会以肉眼可见的速度飞出去你能立刻判断是哪一步矩阵写错了。Matlab里用drawnow逐帧更新即可数据量大时先把结果存进数组最后再统一绘图速度会快很多。5. 参数调试、收敛判据与常见报错5.1 时间步长怎么定才稳这是一个每次写代码都会遇到的老问题。时间步长既要保证精度又要控制计算量。我的经验是先做一个粗略估计找出车辆系统和桥梁系统中最高有效自振频率。四分之一车模型里车轮质量与轮胎刚度组合的频率往往在10到20赫兹有时更高。要求一个周期内至少取20个点时间步长大约为该最高频率对应周期的1/20。假设最高频率是20Hz对应周期0.05秒Δt取0.0025秒是合理的如果取0.005秒一个周期只有10个点虽然平均加速度法数值上不会发疯但加速度峰值和轮胎力波形会明显失真。相反如果桥梁是低频、仅需要前几阶模态Δt取0.005也够用。所以不要照搬别人的步长要根据自己的模型算一遍。判断收敛的一个通用做法是把Δt减半再跑一遍对比跨中挠度和车辆加速度曲线。如果两条曲线差异很小比如峰值变化在2%以内说明步长基本合适。这比任何理论公式都直接。做参数扫描时也可以先跑一次官方默认步长再抽几个关键工况做收敛验证省时又不丢精度。5.2 我踩过的三个经典坑第一个坑是单位不一致。车辆参数用公斤、牛、米、秒桥梁参数如果用了厘米甚至毫米那整个矩阵组装完就是一团乱麻。最坑的是这种错误不会立刻报错而是表现为响应幅度“看起来差了几个数量级”却方向正确。我会在程序开头用一段assert检查所有参数的数值范围质量必须是正数且在合理区间刚度在1万到1亿之间车速不超过几百这样能挡掉大部分低级的单位错误。第二个坑是模态截断带来的“车过桥响应为零”的假象。如果只保留第1阶模态车辆速度恰好接近某个高阶模态的共振速度时计算结果会完全漏掉这一部分激励。我调试时习惯先把桥梁的前10阶频率打印出来然后估算车辆激励频率车轴间距除以车速看看有没有可能激起高阶模态。如果模型本身只关心低阶响应那保留前5阶可以接受但如果想研究高速列车桥耦合就得多保几阶。第三个坑是轮胎刚度很大时系统矩阵容易出现病态。轮胎刚度动辄每米百万牛量级而桥梁等效刚度可能要小几个数量级组装后矩阵条件数变大直接求解虽然不会出错但对数值误差会更敏感。解决的办法一是选择合适的单位二是必要时对位移做归一化三是尽量用双精度计算。Matlab默认就是双精度但如果你在某一步意外用了single类型就会莫名其妙地出现噪声放大。5.3 常见问题排查速查表现象可能原因排查与解决办法跨中挠度持续增大直至发散时间步长过大缩小Δt检查Newmark系数是否满足无条件稳定条件车辆过桥但桥梁无响应模态截断太少打印车辆激励频率增加保留模态数响应幅度比静载小很多单位不一致或轮胎刚度错误核对物理参数尤其注意刚度单位轮胎力出现高频振荡车辆模型刚度太大步长不够提高采样率更换更高刚度轮胎的插值策略车辆单独验证正确但耦合系统振荡耦合刚度未并入矩阵检查装配时虚拟弹簧是否插值到了正确节点曲线起始阶段有个突然跳变初始条件未设置静载平衡让初始静位移参与初始化或先预加载再释放程序跑得很慢每一步都在重新插值整条桥梁模态预计算插值矩阵只随位置变化单独存储再查表这张表是我调试多个版本程序后总结出来的。遇到异常时建议从最“笨”的现象开始排查先看初始条件对不对再看单位是否统一最后才往算法稳定性上想。很多时候问题都在最简单的地方。6. 计算结果的物理验证与工程解读6.1 动态冲击系数的提取仿真算完不是终点工程上还要把结果翻译成设计参数。最常用的一个就是动态冲击系数定义为动态响应的最大峰值与相应静载最大响应的比值减1或者直接表示成动力放大系数。实际提取时要注意“峰值”的定义。桥梁跨中挠度时程会有一条围绕静挠度波动的曲线车辆还没上桥的那一段要排除完全离桥后的余振段也要选择合适的窗。我自己习惯取车辆从入桥到出桥这一整段的最大值除以该车辆以静载方式过桥时的最大挠度。静载响应可以在同一程序里把速度和阻尼设成零来算也可以解析求解两边对上了才敢用。一个人为错误是用“峰值减静挠度”直接除以静挠度这会把时间历程里的负峰值部分也混进来。规范里说的冲击系数对应的是总响应峰值不是振幅。具体取法要看你的分析目的如果做强度验算关心的是绝对最大内力如果做疲劳分析关心的是应力幅这时才需要提取波动幅值。目的不同特征量不同不能一套程序走天下。6.2 怎样验证你的程序结果是对的车桥耦合程序最容易出现的问题是“看起来合理其实错得离谱”。我强烈建议在做正式分析之前至少完成三个验证步骤。第一步是无车桥自由振动验证。把车辆质量设成极小或直接去掉车载项给桥面一个初始位移用程序算桥梁的自由衰减振动和解析解对比确认桥梁刚度、质量和阻尼矩阵组装正确。这一步能过滤掉一大半矩阵组装错误。第二步是移动静载验证。把车辆速度设成极低比如0.1米每秒让计算过程近似静态过程得到的跨中挠度时程应该和静载加载的中午位置挠度曲线几乎重合。如果这一关过不了说明耦合力的传递路径肯定有问题。第三步才是动态验证——用一个已知解析解或文献基准算例对拍比如简支梁受移动常数荷载的经典解把车辆模型简化成移动集中力将耦合效应关闭对比桥梁响应是否吻合。我写过很多次车桥耦合程序每次新搭一个模型都按这三步走一遍。不要嫌麻烦程序一旦跑偏前两步能帮你把问题定位到“到底是矩阵错、耦合错还是激励错”直接排查比漫天猜快得多。等这套验证流程变成肌肉记忆后面换车型、换桥型、改参数都会顺手很多。6.3 从仿真数据到工程结论的一点体会算完冲击系数很多人会急着直接拿去跟规范值对比说“程序结果偏小所以不安全”。这里要泼一盆冷水仿真模型是对现实的简化路面不平顺的随机性、车辆多轴叠加、桥梁边界条件、温度影响都没有包括在内。程序结果能反映趋势能揭示共振速度区间能对比不同方案的相对优劣但不应该拍板做最终设计。正确的用途是配合规范方法在规范包络值不明确或者特例车型过桥时提供权重更高的动态分析支撑。我在实际项目中通常会把冲击系数随车速变化的曲线做成一张图标出共振峰出现的位置。这个信息比单一数值有用得多因为你能直接看到“哪个速度区间对这座桥特别不利”。如果再叠加不同路面不平顺等级的曲线就能评估路面养护状态对桥梁受力的影响程度这是规范给不了的细致答案。车桥耦合数值分析的价值不在于算出一个绝对精确的数字而在于给出一个可解释、可对比、可决策的量化趋势这一点想清楚了程序怎么扩展都不会跑偏。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进