ARTICLE · INTELLIGENCE

战地情报 · 详情页

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

MATLAB实现车桥耦合振动分析:Newmark-β法与轨道不平顺模拟

MATLAB实现车桥耦合振动分析:Newmark-β法与轨道不平顺模拟 直接把程序甩出来容易但真正让这个程序跑通、算得准、能应对导师和审稿人的连环追问才是关键。这篇博文我尽量按一套完整可落地的思路来拆从理论推导、参数选定到MATLAB代码实现和坑位排查全部覆盖。1. 车桥耦合问题的核心建模思路车桥耦合分析说到底是把“移动的车辆”和“承受车辆荷载的桥梁”放在同一个时间轴上联立求解。标题里提到的“车辆-无砟轨道-桥梁耦合”实际上是一个三层串联的振动系统车辆通过轮轨接触传递给轨道轨道通过扣件和底座板传递给桥梁桥梁再把位移和加速度反馈给车辆。这个闭环关系就是耦合的本质。1.1 车辆子模型的自由度设定做车桥耦合仿真车辆模型不能太简单也不能过于复杂。我通常推荐半车模型Half Vehicle Model起步它既能抓住车体的点头和沉浮又不至于像整车模型那样自由度过大。半车模型一般包含以下几个部分车体2个自由度垂向位移 (Z_c) 和点头转角 (\theta_c)转向架2个自由度垂向位移 (Z_{t1})、(Z_{t2})轮对4个自由度垂向位移 (Z_{w1}) 到 (Z_{w4})每个轮对通过一条悬挂系和一系悬挂连接到转向架和车体。注意一系和二系悬挂的刚度、阻尼参数直接决定车辆的低频响应和高频振动分配。以前我在参数选取上吃过亏原以为这些只要大概取一个量级就行后来发现二系悬挂刚度和阻尼对车体加速度的影响非常显著尤其是计算响应谱时频率错一点峰值偏移就大了。1.2 桥梁子模型与无砟轨道建模桥梁这里采用有限元梁单元建模即可。对一个简支梁桥把它离散成若干Euler-Bernoulli梁单元每个节点有两个自由度挠度 (w) 和转角 (\theta)。系统方程是典型的[ M_b \ddot{d}_b C_b \dot{d}_b K_b d_b F_b ]其中 (M_b)、(C_b)、(K_b) 是桥梁的整体质量、阻尼和刚度矩阵。阻尼矩阵可以方便地用瑞利阻尼来处理取 (C_b \alpha M_b \beta K_b)两个系数用前两阶模态阻尼比和圆频率来算。无砟轨道这一层我习惯用连续弹性支撑的叠合梁模型钢轨看作一根无限长Euler梁扣件、轨道板、底座板统一等效为多组弹簧-阻尼单元按轨道板长度做分布支撑。这样虽然牺牲了一些高频细节但工程精度完全够用而且程序不至于慢到离谱。1.3 耦合机制的数学表达耦合关系的建立是整个程序的核心。车辆轮对与钢轨接触点处的位移协调条件和力平衡条件决定了两个子系统如何“咬合”在一起。轮轨接触处位移满足[ Z_{wi} Z_{ri} r_i ]其中 (Z_{wi}) 是轮对位移(Z_{ri}) 是接触点轨道位移(r_i) 是轨道不平顺。接触力通过Hertz非线性弹性接触理论计算但为了简化很多做车桥耦合的论文里用线性化弹簧接触刚度 (k_h)。这个位移协调方程是整个耦合程序的“灵魂”因为你在写Newmark循环时每一步都要用这个关系把车辆和桥梁的位移、速度、加速度联系在一起。我见过很多人把耦合程序写成了“车轮给桥梁一个固定的移动力”那其实只是移动荷载分析不是车桥耦合分析。两者的区别就好比“你把一袋米扔到桥上”和“一个会蹲起的人从桥上走过去”的区别反馈路径完全不同。1.4 为什么需要双向迭代耦合有些程序用迭代法做耦合每一步先算桥梁响应再算车辆响应反复迭代到收敛。我的习惯是无条件稳定的直接积分方案但前期判断程序正确性时双向迭代是一个非常好的调试工具不推荐直接跳步。双向迭代的流程是在某一时刻 (t)先由上一时刻的桥梁状态预测接触点位移反推轮对位移和接触力再把接触力加载到桥梁上更新桥梁状态重新校验接触点位移与轮对位移是否协调。如果误差在容许范围内就进入下一步长否则继续迭代。第一次做的时候我卡在“先更新谁”这个问题上反复试了很多次最后还是回归到逐步积分的同步更新逻辑。程序内部结构清晰了之后才真正跑顺。2. Newmark-β法原理与程序实现细节标题里点名了Newmark法这里我多写一些程序相关的实现细节因为直接套用教材公式写代码经常会遇到稳定性问题。2.1 Newmark-β法的基本递推公式Newmark-β法把结构动力学方程在离散时间点上写开通过两个参数 (\gamma) 和 (\beta) 控制数值积分过程中的人工阻尼与稳定性。对于时刻 (t\Delta t)位移和速度的更新公式是[ d_{n1} d_n \Delta t \dot{d}_n \frac{\Delta t^2}{2} \left( (1-2\beta) \ddot{d}n 2\beta \ddot{d}{n1} \right) ][ \dot{d}_{n1} \dot{d}_n \Delta t \left( (1-\gamma) \ddot{d}n \gamma \ddot{d}{n1} \right) ]参数选 (\gamma 0.5)(\beta 0.25) 时是平均加速度法这是我最常用的配置因为它是无条件稳定的并且没有数值耗散。在一些需要过滤高频噪声的场景可以选择 (\gamma 0.5) 引入数值阻尼但这就需要对结果做参数敏感性验证。2.2 有效刚度矩阵的“固定流程”Newmark法的核心技巧在于每次时间步都会生成一个有效刚度矩阵[ \hat{K} K \frac{\gamma}{\beta \Delta t} C \frac{1}{\beta \Delta t^2} M ]这个矩阵在车辆和桥梁两个子系统里都是恒定的前提是系统本身线性。也就是说你可以预先对它做一次Cholesky分解或LU分解然后在每个时间步用有效荷载向量替换右端项回代即可这是做出高效MATLAB程序的关键之一。另外一个经验是对每个子系统独立积分而不是把整套大矩阵组装起来求逆。这样做有几个好处一是矩阵规模小运算快二是便于在每个子系统中更换车辆参数时不影响桥梁矩阵的预分解。后来我写这个程序干脆把车辆和桥梁的Newmark积分封装成了两个独立的函数外部用耦合条件把它们绑在一起这是程序架构上最值得推荐的做法。2.3 初始条件与时间步长选取初始条件方面我习惯让车辆一开始就处于自重静力平衡位置也就是把重力荷载作为初始节点力加载到桥梁系统上求解静力位移之后再开始积分。如果不做这一步相当于车辆一启动就砸在桥上瞬间冲击会引发严重的虚假高频振荡后面要花很长时间才能衰减掉。时间步长的选取需要考虑车辆速度、单元长度和系统的最高关心频率。我一般按照这个经验式来初步估算一个临界步长[ \Delta t \le \frac{\Delta x}{v} ]其中 (\Delta x) 是桥梁单元长度(v) 是车速。比如单元长度为1米车速为36 m/s那么步长至少应小于0.027 s再加上结构高频分量的需求实际上我会取到 (10^{-4} \sim 10^{-5}) 量级视系统的最高关心频率而定。这个步长选择合理的话程序算出来结果平滑不会出现锯齿状的毛刺。2.4 稳定性校验与收敛趋势写完积分器之后不要急着跑车桥耦合先对一个单自由度体系做一下验证这是我的铁律。构造一个已知解析解的振动系统比如无阻尼自由振动初始位移给一个单位积分1000步对比解析解与数值解的振幅误差。两种典型的错误我见过振幅随步长增长而逐渐发散这是步长太大或者参数 (\beta) 设置不当导致的。系统能稳定但相位滞后明显这是 (\gamma) 偏离0.5造成的。把这两个现象调对之后整个耦合程序的数值地基才算打牢。这部分代码我前后改过多个版本最后的经验是——尽量把Newmark部分独立成模块后续换模型时可以直接复用。3. 轨道不平顺的模拟与施加方式标题里特别强调了“考虑不平顺”轨道不平顺是车桥耦合振动的主要激励源之一。实际线路上的不平顺是一个随机过程无法用单一正弦波去描述国内工程中常用功率谱密度函数来定义。3.1 轨道不平顺的功率谱模型轨道不平顺按照方向主要分为轨向、高低、水平和轨距四种其中高低不平顺对车桥竖向耦合振动影响最大。中国铁道科学研究院提出的轨道不平顺功率谱密度函数是工程界用的比较多的模型形式类似于[ S(f) \frac{A (f^2 B f C)}{f^4 D f^3 E f^2 F f G} ]其中系数 (A, B, C, ...) 由线路等级决定。关于这些参数的取值我没有完全采用提出来时的原始建议值而是根据实际计算需要做了两组对比一组用高等级线路谱一组用低等级线路谱分别计算车桥响应幅值这样能看到不平顺等级对结构响应的敏感性也让计算结果更有说服力。3.2 三角级数法生成不平顺样本在MATLAB里生成不平顺样本我首推三角级数法谐波叠加法。核心思想是用一系列不同频率、不同幅值的正弦波叠加来逼近目标功率谱。[ r(x) \sum_{k1}^{N} \sqrt{2 S(f_k) \Delta f} \sin(2\pi f_k x \phi_k) ]这里 (f_k) 是第 (k) 个频率成分(\phi_k) 是相互独立的随机相位在0到 (2\pi) 之间均匀分布。频率下限和上限需要根据车辆速度和分析需要来定比如车速 (v)那么空间频率范围可以取0.01到10周期/米。每次执行时随机相位不同生成的不平顺样本就不同。这个特性对做蒙特卡洛统计分析非常有用但如果你只是做单个工况的确定性分析建议固定随机数种子保证结果可复现。3.3 不平顺数据的插值处理车辆行驶过程中轮对位置是不断变化的而不平顺样本是按固定空间采样点生成的所以每一步积分都要根据当前轮对纵向位置在样本上做线性插值。这段代码使用MATLAB的interp1函数即可但要留意一点当轮对位置超出样本覆盖范围时不能直接返回NaN否则整个积分会中断。比较稳妥的处理方式是在样本前后各外延一段零点或者采用镜像对称扩展。这两种做法都会引入边界效应但影响范围有限只要计算长度比桥梁长度余量充足边界影响可以忽略。3.4 多种不平顺工况的组合策略工程实践中不同类型的线路平顺状态差异很大我会以上述高低不平顺为基础构造以下几种计算工况无不平顺光滑轨道用于对照中等级不平顺低等级不平顺单一正弦不平顺波长接近桥梁基频对应速度下的激励波长用于共振效应分析这样四个工况跑完之后既能看平均意义上的随机响应也能看到最不利情况下的极值响应实测下来比较能说明问题。4. 车辆-无砟轨道-桥梁整体程序设计流程这一章是整个程序的具体实现路径。我采用模块化思路来组织代码每个部分遵循“输入-处理-输出”的清晰接口。4.1 主程序的整体框架我用一个结构体数组作为数据总线把所有参数放在一个结构体里这样既能少写很多全局变量又能提高代码可读性。程序整体框架如下%% 车桥耦合分析主程序 % 初始化 Para init_params(); % 参数定义 Bridge init_bridge(Para);% 桥梁有限元模型 Vehicle init_vehicle(Para); % 车辆模型 Irregularity gen_irregularity(Para); % 不平顺样本 % Newmark积分参数 dt Para.dt; nt floor(Para.total_time / dt); % 预分配存储 Response.d zeros(ndof_bridge, nt); Response.v zeros(ndof_bridge, nt); Response.a zeros(ndof_bridge, nt); % 初始静力平衡 [d0, v0, a0] static_initial(Bridge, Vehicle, Para); % 时间积分主循环 for i 1:nt t (i-1) * dt; % 获取当前轮对位置 x_pos vehicle_position(Vehicle, t, Para); % 插值不平顺 r interp1(Para.x_irr, Irregularity, x_pos, linear, extrap); % 车辆与桥梁耦合迭代 [Bridge, Vehicle] coupled_step(Bridge, Vehicle, r, dt); % 存储结果 end需要提醒的是这是一个简化框架真正的代码中每个函数体内的逻辑要比这复杂得多尤其在耦合迭代与矩阵更新部分细节非常多。4.2 车辆和桥梁子系统Newmark积分的函数实现车辆子系统和桥梁子系统的Newmark积分可以分别写成函数。核心在于有效刚度矩阵的预计算和有效荷载向量的更新。function [d, v, a] newmark_step(M, C, K, d_n, v_n, a_n, F_ext, dt, beta, gamma) % Newmark-Beta法单步积分 % 输入: M,C,K 系统矩阵, d_n,v_n,a_n 当前时刻状态, F_ext 外部荷载 % 输出: d,v,a 下一时刻状态 a1 1/(beta*dt^2); a2 gamma/(beta*dt); a3 1/(beta*dt); a4 1/(2*beta) - 1; a5 gamma/beta - 1; a6 dt*(gamma/(2*beta) - 1); Keff K a2*C a1*M; Feff F_ext M*(a1*d_n a3*v_n a4*a_n) ... C*(a2*d_n a5*v_n a6*a_n); d Keff \ Feff; a a1*(d - d_n) - a3*v_n - a4*a_n; v v_n dt*((1-gamma)*a_n gamma*a); end这里最重要的一点是Keff不重复装配。对整个桥梁系统你可以在进入时间积分循环之前先求逆或者做分解然后在单步函数里直接用分解后的结果回代。4.3 车辆-桥梁接触力计算与加载接触力的计算精度直接决定了桥梁和车辆的响应质量。我的做法是先用Hertz理论计算一个初始接触力然后做线性化处理。当轮对位移 (Z_w) 与轨道位移 (Z_r) 之间出现相对位移时接触力可以表达为[ F_c k_h (Z_w - Z_r)^{1.5} ]实现时为了保持线性系统矩阵形式不变我通常采用等效刚度 (k_{eq})在每轮迭代中根据当前压缩量更新[ k_{eq} k_h \cdot \sqrt{Z_w - Z_r} ]这样处理的好处是车辆与桥梁的等效刚度矩阵在每个时间步内直接加进去再结合Newmark积分公式里的有效刚度构成当前时间步总的切线刚度迭代收敛速度非常快。加载到桥梁上的节点力需要把轮对在轨道上的位置映射到对应的梁单元上用形函数把集中力分散到单元两端节点。类似地桥梁位移反馈到车辆时也要用同一组形函数插值。我在这里使用shape_function函数来完成映射。4.4 移动荷载的单元定位与形函数映射车辆每前进一步轮对可能横跨在两个相邻梁单元之间。这一步的逻辑很简单但极其容易出错找到轮对位置所在的单元编号计算局部坐标 (\xi (x_{wheel} - x_{node1}) / L)用Hermite插值形函数将接触力分配到四个节点自由度上function [F_nodes, Zi] apply_wheel_load(Bridge, x_wheel, F_contact, d_bridge) % 根据轮对位置分配节点力 % 找到所在单元 ele_id floor((x_wheel - Bridge.x0) / Bridge.Lele) 1; ele_id min(max(ele_id, 1), Bridge.nele); % 计算局部坐标xi xi (x_wheel - Bridge.node_coord(ele_id)) / Bridge.Lele; % Hermite形函数 N1 1 - 3*xi^2 2*xi^3; N2 Bridge.Lele*(xi - 2*xi^2 xi^3); N3 3*xi^2 - 2*xi^3; N4 Bridge.Lele*(xi^3 - xi^2); % 节点力分配 F_nodes zeros(4,1); F_nodes(1) N1 * F_contact; F_nodes(2) N2 * F_contact; F_nodes(3) N3 * F_contact; F_nodes(4) N4 * F_contact; % 插值轨道位移 d_local d_bridge(2*ele_id-1 : 2*ele_id2); Zi N1*d_local(1) N2*d_local(2) N3*d_local(3) N4*d_local(4); end这段函数的重点在于形函数的正确使用。梁单元是Hermite插值它兼顾了节点位移和转角的连续性因此节点力分配时转角自由度对应的形函数分量不能漏掉否则算出来的力分布不准确。4.5 程序调试与验证策略跑通程序只是第一步让它“算得对”才是核心。第一个验证方法是用移动常量力代替真实车辆模型计算桥梁跨中位移时程并与解析解做对比。移动荷载下简支梁的解析解在经典结构动力学教材里能找到这是最直观的程序验证手段。第二个方法是模拟低速行驶工况此时动态效应很小计算结果应与“车辆静载逐步移动”的拟静态解一致这可以检验桥梁刚度矩阵与荷载施加逻辑的正确性。第三个方法是检查能量平衡。计算系统总能量车辆动能势能桥梁动能势能阻尼耗散应当保持单调递减或基本恒定无阻尼时。如果能量曲线出现增加说明积分器有问题或者接触力施加有误。这三个验证做完程序的可信度才有保证后续数据分析才敢放心用。5. 常见问题与排查技巧实录在这个程序的实际开发过程中我踩了不少坑也帮朋友排查过不少问题。这里的每一条几乎都来源于真实调试经历按常见程度排个序。5.1 程序发散或振幅异常增长这是最常见的故障。通常的表现是计算到某一步之后桥梁位移或车辆加速度出现指数级增长很快溢出。排查顺序如下检查时间步长是否足够小。步长过大时即使Newmark平均加速度法无条件稳定也会因为激励频率过高导致结果失真。检查有效刚度矩阵中是否遗漏了耦合刚度项。轮轨接触弹簧在刚度矩阵中的贡献漏加是新手最容易犯的错误。检查不平顺插值是否出现跳变。不平顺样本生成时如果频率上限过高Nyquist频率附近会有混叠效应导致离散后的不平顺自带高频振荡。我在第一次调试时卡了整整两天最后发现是轮轨接触弹簧刚度的平方根被多乘了一次。这类错误非常隐蔽因为发散前的几千步看起来一切正常。5.2 车辆响应出现高频毛刺如果桥梁结果是光滑的而车辆加速度出现明显的高频毛刺多半是因为接触力的更新和动力方程求解之间存在时间错配。我处理这个问题的办法是在一个时间步内部先计算轮对处的轨道位移和速度再用它们更新轮轨接触力最后才做车辆和桥梁的位移更新。注意更新顺序不能反。反过来先更新位移、再更新接触力相当于响应滞后了半个步长高频分量的相位就乱了。另一个常见的做法是给车辆子系统增加一点阻尼但这治标不治本。程序的本质问题是接触算法的时间耦合精度不够应通过调整积分顺序来解决。5.3 支撑反力出现负值无砟轨道系统中扣件只传递压力不传递拉力。在强动态激励下扣件力可能出现负值这在实际线路中意味着扣件“脱空”。发现这个问题后我在程序里加入了扣件状态判断if F_fastener(k) 0 F_fastener(k) 0; end处理完扣件力之后整个系统矩阵需要重新装配因为一些支撑单元退出了工作。这样会使计算变成非线性问题在一个时间步内可能要多次迭代。我在程序里设置了最大迭代次数为10次多试几次之后发现收敛速度尚可。5.4 边界反射干扰使用有限元模型时桥梁边界处会出现反射波如果处理不当会影响跨中区域的响应计算精度。对于简支梁模型边界条件相对简单只需要在端部节点约束挠度即可但转角自由度要不要释放会影响结构刚度。关于这一点我建议做一次自由振动模态分析比较计算基频与理论基频如果偏差小于3%说明边界处理基本正确。对于更复杂的连续梁或多跨结构建议在端部设置吸收边界或足够大的虚拟延伸单元来降低反射波的污染。5.5 计算效率优化耦合分析的计算量主要体现在两个方面一是时间步数多二是每个时间步内的耦合迭代矩阵求解次数多。我的优化方案将矩阵分解提前到循环外时间步内只做回代车辆子系统和桥梁子系统分别做因子分解而不是合成一个巨型矩阵使用parfor并行计算多个工况这对参数研究和不同速度工况的批量计算很有用实测下来一个100米简支梁桥模型20个梁单元半车模型时间步长取 (10^{-4}) s计算总时长2秒在普通桌面级处理器上跑一个工况大约需要15分钟。如果步长放宽到 (5 \times 10^{-4}) s并且只做单向耦合分析桥梁响应不反馈给车辆时间可以压缩到1分钟以内但这样做就牺牲了耦合的精度。我的习惯是先跑快速模型摸清参数范围再用精细模型做最终计算效率和精度两头兼顾。6. 参数敏感性分析与后处理建议程序跑通了接下来就是怎么让结果更有说服力。做参数敏感性分析是写论文和工程报告时的一个重点工作但这部分内容的思路往往被忽视这里单独说一下。6.1 速度参数的多工况扫描车速是车桥耦合分析中最关键的工况参数。我的标准做法是选5~8个速度点从低速到高速覆盖关心范围同时专门设置一个“特征速度”通过共振车速公式估算[ v_{cr} \frac{3.6 \cdot f_b \cdot L}{n} ]其中 (f_b) 是桥梁竖向基频(L) 是桥梁跨径(n) 是半波数。当列车以这个速度通过时荷载频率会与桥梁基频接近引发共振。如果不做这个分析报告里就没有最亮眼的峰值响应数据。6.2 不平顺等级对响应的贡献标题里特别提到“考虑不平顺”所以不平顺的影响一定要单独量化。我常做的一个分析是保持车辆参数和桥梁参数不变把轨道平顺状态从好到差设置3个等级对比跨中位移和加速度极值的变化比例。通常结果是不平顺等级越差车辆加速度响应增幅越大而桥梁位移增幅可能并不明显。要想把这个逻辑说清楚程序输出的列车速度和加速度最大值曲线十分关键它和位移响应不一定是同向变化的。6.3 后处理与可视化建议MATLAB里做后处理我比较推荐先把核心时程结果存入结构体然后用一个独立脚本统一出图。典型输出包括桥梁跨中位移时程曲线车体加速度时程曲线轮轨接触力时程曲线弯矩包络图不同车速下的最大响应汇总曲线此外我习惯把结果导出成二进制.mat文件和文本.csv两种格式方便Origin或Tecplot进一步处理。出图时要注意设置合理的字体和线宽期刊论文一般要求不小于6号字线宽不小于0.5 pt。这个问题看似细枝末节但到投稿时会反复被编辑挑毛病。7. 程序扩展方向这个程序框架一旦搭好后续的扩展空间非常大。我自己在完成基础版本后至少做过以下三个方向的扩展都取得了不错的效果。7.1 扩展到三维整车模型半车模型只能考虑竖向振动如果想要分析横向稳定性就需要扩展为三维整车模型。整车模型有车体6个自由度每个转向架6个自由度每个轮对5个自由度总体上要增加到几十个自由度。改动量主要发生在车辆模型的矩阵组装和轮轨接触关系的坐标变换上。桥梁部分如果只关心竖向可以保持不变。我那一次扩展花了两天重点花在了轮轨几何关系的推导上后来直接用坐标变换矩阵把车辆在整体坐标系下的位移映射到轮轨接触坐标系里思路清晰了很多。7.2 考虑桥梁非线性与车-桥联合优化当桥梁振幅较大时不能简单使用线性梁单元需要考虑材料非线性如混凝土开裂或几何非线性如大变形。这时需要把Newmark积分中的有效刚度矩阵改成在每个时间步内基于当前切线刚度矩阵重新组装虽然计算量成倍增加但从结果上看动力响应的极值往往更真实。另一个方向是车-桥联合优化。可以先编好目标函数比如最小化桥梁跨中振动加速度以车辆悬挂参数为设计变量调用MATLAB的fmincon做优化。这个方案的优点是耦合程序和优化工具箱之间只是黑箱关系不需要改动核心分析函数调试起来比较省心。7.3 基于深度学习的快速预测这个算是我最近尝试的方向先把车桥耦合程序的输入输出数据批量生成比如车速、不平顺等级、桥梁阻尼比作为输入跨中位移峰值作为输出用这些数据训练一个BP神经网络或LSTM网络。训练好之后原本一个工况需要跑15分钟用模型预测只需要一秒钟不到。注意这个方向不意味着抛弃物理模型物理模型仍然是数据生成的依据和最终校核标准神经网络只是在参数空间中做快速插值。用这种“物理驱动数据驱动”的组合在处理大批量工况的时候非常实用特别是在参数优化和多目标决策场景下。车桥耦合分析这个方向扎实的力学功底和高效率的程序实现同样重要。别急着直接上来就写大程序先把半车模型跑通、把Newmark积分器验对、把不平顺样本调好后面的每一步都会顺畅很多。
RELATED READING

延伸阅读

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