17自由度铁道车辆横向动力学MATLAB程序

17自由度铁道车辆横向动力学仿真程序,包含:

  • 车体(3 DOF:横移 (ycy_cyc)、侧滚 (ϕc\phi_cϕc)、摇头 (ψc\psi_cψc))
  • 前转向架构架(3 DOF:(yt1,ϕt1,ψt1y_{t1},\phi_{t1},\psi_{t1}yt1,ϕt1,ψt1))
  • 后转向架构架(3 DOF:(yt2,ϕt2,ψt2y_{t2},\phi_{t2},\psi_{t2}yt2,ϕt2,ψt2))
  • 四个轮对各2 DOF:横移 (ywiy_{wi}ywi)、摇头 (ψwi\psi_{wi}ψwi)((i=1,2,3,4i=1,2,3,4i=1,2,3,4))

总计 (3+3+3+8=17) 个自由度。


一、数学模型概要

采用 Newton-Euler 方法建立运动方程,写成矩阵形式:

Mq¨+Cq˙+Kq=F(t)\mathbf{M}\ddot{\mathbf{q}} + \mathbf{C}\dot{\mathbf{q}} + \mathbf{K}\mathbf{q} = \mathbf{F}(t)Mq¨+Cq˙+Kq=F(t)

其中:

  • (q\mathbf{q}q) 为17维广义坐标向量
  • (M\mathbf{M}M) 为质量/惯量矩阵
  • (C\mathbf{C}C) 为阻尼矩阵(含悬挂阻尼和蠕滑阻尼)
  • (K\mathbf{K}K) 为刚度矩阵(含悬挂刚度和蠕滑等效刚度)
  • (F(t)\mathbf{F}(t)F(t)) 为轨道不平顺激励力

轮轨蠕滑力采用 Kalker线性理论(忽略自旋),横向蠕滑力:

Fy=−f22y˙w−λeywr0(简化等效锥模型)F_y = -f_{22}\frac{\dot{y}_w - \lambda_e y_w}{r_0} \quad (\text{简化等效锥模型})Fy=−f22r0y˙w−λeyw(简化等效锥模型)

其中 (f22f_{22}f22) 为横向蠕滑系数,(λe\lambda_eλe) 为等效锥度,(r0r_0r0) 为车轮半径。


二、完整MATLAB代码

将以下代码保存为 vehicle_17dof_lateral.m 并直接运行。

matlab 复制代码
%% 17自由度铁道车辆横向动力学仿真
clear; clc; close all;

%% ===================== 1. 参数定义 =====================
% 质量与惯量(kg, kg·m^2)
m_c  = 34000;   Jc_phi = 54000;  Jc_psi = 1970000;   % 车体
m_t  = 3200;    Jt_phi = 2400;   Jt_psi = 3100;      % 转向架构架
m_w  = 1700;    Jw_psi = 760;                         % 轮对

% 二系悬挂(每台转向架,等效到一侧)
k2y = 350e3;   c2y = 58000;       % 横向刚度/阻尼(N/m, N·s/m)
k2phi= 480e3;  c2phi= 23000;      % 侧滚刚度/阻尼(N·m/rad, N·m·s/rad)
k2psi= 5200e3; c2psi= 78000;      % 摇头刚度/阻尼(N·m/rad, N·m·s/rad)

% 一系悬挂(每轮对)
k1y = 880e3;   c1y = 125000;      % 横向
k1phi= 330e3;  c1phi= 19000;      % 侧滚

% 轮轨参数
r0 = 0.457;                       % 车轮半径(m)
lambda_e = 0.165;                 % 等效锥度
f22 = 8500e3;                     % 横向蠕滑系数(N)
N0 = m_w * 9.81;                  % 静轮重(N)

% 几何尺寸(m)
Lc = 8.65;                        % 车体半长(两转向架中心距的一半)
LT = 1.275;                       % 转向架轴距之半(轮对到构架中心的纵向距离)
b2 = 1.215;                       % 二系悬挂横向跨距之半(m)
b1 = 1.025;                       % 一系悬挂横向跨距之半(m)

%% ===================== 2. 自由度编号 =====================
% q = [yc, phic, psic, yt1, phit1, psit1, yt2, phit2, psit2, ...
%      yw1, psiw1, yw2, psiw2, yw3, psiw3, yw4, psiw4]'
nDOF = 17;

% 质量矩阵 M
M = diag([m_c, Jc_phi, Jc_psi, ...
          m_t, Jt_phi, Jt_psi, ...
          m_t, Jt_phi, Jt_psi, ...
          m_w, Jw_psi, m_w, Jw_psi, m_w, Jw_psi, m_w, Jw_psi]);

%% ===================== 3. 组装刚度矩阵 K =====================
K = zeros(nDOF);

% --- 二系悬挂(车体-构架)---
% 前转向架 (index 4~6)
K(1,1) = K(1,1) + 2*k2y;                % yc
K(1,4) = K(1,4) - 2*k2y;                % yc - yt1
K(1,3) = K(1,3) - 2*k2y*Lc;             % yc - psic
K(3,1) = K(1,3);
K(4,4) = K(4,4) + 2*k2y;                % yt1
K(4,1) = K(4,1) - 2*k2y;
K(4,3) = K(4,3) + 2*k2y*Lc;             % yt1 - psic
K(3,4) = K(4,3);

% 侧滚
K(2,2) = K(2,2) + 2*k2phi;              % phic
K(2,5) = K(2,5) - 2*k2phi;              % phic - phit1
K(5,2) = K(2,5);
K(5,5) = K(5,5) + 2*k2phi;

% 摇头
K(3,3) = K(3,3) + 2*k2psi;              % psic
K(3,6) = K(3,6) - 2*k2psi;              % psic - psit1
K(6,3) = K(3,6);
K(6,6) = K(6,6) + 2*k2psi;

% 后转向架 (index 7~9) 类似,注意 Lc 符号
K(1,1) = K(1,1) + 2*k2y;
K(1,7) = K(1,7) - 2*k2y;
K(1,3) = K(1,3) + 2*k2y*Lc;             % 后转向架引起 yc + psic*Lc
K(3,1) = K(1,3);
K(7,7) = K(7,7) + 2*k2y;
K(7,1) = K(7,1) - 2*k2y;
K(7,3) = K(7,3) - 2*k2y*Lc;
K(3,7) = K(7,3);

K(2,2) = K(2,2) + 2*k2phi;
K(2,8) = K(2,8) - 2*k2phi;
K(8,2) = K(2,8);
K(8,8) = K(8,8) + 2*k2phi;

K(3,3) = K(3,3) + 2*k2psi;
K(3,9) = K(3,9) - 2*k2psi;
K(9,3) = K(3,9);
K(9,9) = K(9,9) + 2*k2psi;

% --- 一系悬挂(构架-轮对)---
% 前转向架:轮对1(前)、轮对2(后)
% 轮对1 (index 10~11) 连接到构架1 (index 4~6)
% 横向
K(4,4) = K(4,4) + 2*k1y;
K(4,10)= K(4,10) - 2*k1y;
K(10,4)= K(4,10);
K(10,10)= K(10,10) + 2*k1y;

% 侧滚(构架侧滚与轮对横移耦合)
K(5,5) = K(5,5) + 2*k1phi;
K(5,10)= K(5,10) + 2*k1phi*LT;          % 构架侧滚引起轮对横移力臂
K(10,5)= K(5,10);
K(10,10)= K(10,10) + 2*k1phi*LT^2;

% 轮对2 (index 12~13) 类似,注意 LT 符号(另一侧)
K(4,4) = K(4,4) + 2*k1y;
K(4,12)= K(4,12) - 2*k1y;
K(12,4)= K(4,12);
K(12,12)= K(12,12) + 2*k1y;

K(5,5) = K(5,5) + 2*k1phi;
K(5,12)= K(5,12) - 2*k1phi*LT;          % 另一侧符号相反
K(12,5)= K(5,12);
K(12,12)= K(12,12) + 2*k1phi*LT^2;

% 后转向架:轮对3 (14~15)、轮对4 (16~17) 类似
K(7,7) = K(7,7) + 2*k1y;
K(7,14)= K(7,14) - 2*k1y;
K(14,7)= K(7,14);
K(14,14)= K(14,14) + 2*k1y;

K(8,8) = K(8,8) + 2*k1phi;
K(8,14)= K(8,14) + 2*k1phi*LT;
K(14,8)= K(8,14);
K(14,14)= K(14,14) + 2*k1phi*LT^2;

K(7,7) = K(7,7) + 2*k1y;
K(7,16)= K(7,16) - 2*k1y;
K(16,7)= K(7,16);
K(16,16)= K(16,16) + 2*k1y;

K(8,8) = K(8,8) + 2*k1phi;
K(8,16)= K(8,16) - 2*k1phi*LT;
K(16,8)= K(8,16);
K(16,16)= K(16,16) + 2*k1phi*LT^2;

% --- 蠕滑等效刚度(轮对横向)---
% 轮对横向等效刚度:k_creep = f22*lambda_e / r0
k_creep = f22 * lambda_e / r0;
for i = [10,12,14,16]  % 轮对横移自由度
    K(i,i) = K(i,i) + k_creep;
end

%% ===================== 4. 组装阻尼矩阵 C =====================
C = zeros(nDOF);
% 阻尼结构与刚度类似,只需将刚度系数替换为阻尼系数
% 这里直接使用与刚度相同的结构,但阻尼系数不同
% 为简化,我们手动填入主要阻尼项(完整代码应类似刚度组装)
% 注意:蠕滑也产生阻尼项(f22/r0 * dy/dt)
c_creep = f22 / r0;

% 二系阻尼(仅关键项)
C(1,1) = 2*c2y;          C(1,4) = -2*c2y;          C(1,3) = -2*c2y*Lc;
C(4,1) = -2*c2y;         C(4,4) = 2*c2y;           C(4,3) = 2*c2y*Lc;
C(3,1) = -2*c2y*Lc;      C(3,4) = 2*c2y*Lc;        C(3,3) = 2*c2psi;

% 一系阻尼
C(4,4) = C(4,4) + 2*c1y; C(4,10)= -2*c1y;          C(10,4)= -2*c1y;
C(10,10)= C(10,10) + 2*c1y;
% 其他类似,为节省篇幅省略完整填充(实际运行时应补全)

% 蠕滑阻尼(轮对横向)
for i = [10,12,14,16]
    C(i,i) = C(i,i) + c_creep;
end

%% ===================== 5. 轨道不平顺激励 =====================
% 采用美国六级谱简化模拟(横向不平顺)
V = 30;                             % 车速 m/s
f = @(t) 0.002*sin(2*pi*0.87*V*t); % 简化正弦激励(左右轨反相)
yL = @(t) f(t);                     % 左轨
yR = @(t) -f(t);                    % 右轨

%% ===================== 6. 状态空间与积分 =====================
% 状态向量 x = [q; qd]
A = [zeros(nDOF), eye(nDOF);
     -M\K,         -M\C];
B = [zeros(nDOF,4); M\eye(nDOF,4)];  % 4个轮对的不平顺输入

% 定义右端函数(含时变激励)
odefun = @(t,x) vehicle_rhs(t, x, A, B, yL, yR, nDOF, ...

%% ===================== 7. 主循环(直接积分) =====================
tspan = [0 10];
x0 = zeros(2*nDOF,1);
[T, X] = ode45(odefun, tspan, x0);

%% ===================== 8. 结果提取与绘图 =====================
q = X(:,1:nDOF);
yc = q(:,1); phic = q(:,2); psic = q(:,3);
yt1= q(:,4); phit1= q(:,5); psit1= q(:,6);
yt2= q(:,7); phit2= q(:,8); psit2= q(:,9);
yw1= q(:,10); psiw1= q(:,11);
yw2= q(:,12); psiw2= q(:,13);
yw3= q(:,14); psiw3= q(:,15);
yw4= q(:,16); psiw4= q(:,17);

figure('Position',[100 100 1100 750]);
subplot(3,2,1); plot(T, yc*1e3); ylabel('y_c (mm)'); grid; title('车体横移');
subplot(3,2,2); plot(T, phic*180/pi); ylabel('\phi_c (deg)'); grid; title('车体侧滚');
subplot(3,2,3); plot(T, psic*180/pi); ylabel('\psi_c (deg)'); grid; title('车体摇头');
subplot(3,2,4); plot(T, yw1*1e3); hold on; plot(T, yw2*1e3); 
                ylabel('y_w (mm)'); legend('轮对1','轮对2'); grid; title('前转向架轮对横移');
subplot(3,2,5); plot(T, yw3*1e3); hold on; plot(T, yw4*1e3);
                ylabel('y_w (mm)'); legend('轮对3','轮对4'); grid; title('后转向架轮对横移');
subplot(3,2,6); plot(T, psiw1*180/pi); hold on; plot(T, psiw2*180/pi);
                ylabel('\psi_w (deg)'); legend('轮对1','轮对2'); grid; title('轮对摇头');

sgtitle('17自由度铁道车辆横向动力学响应','FontSize',14,'FontWeight','bold');

%% ===================== 辅助函数 =====================
function dx = vehicle_rhs(t, x, A, B, yL, yR, nDOF, ...)
    % 计算轨道激励向量(4个轮对的不平顺)
    yL1 = yL(t); yR1 = yR(t);
    % 假设前后轮对经历相同不平顺(可加延时)
    F = zeros(2*nDOF,1);
    F(nDOF+10) = k1y*yL1;  % 轮对1左轨
    F(nDOF+12) = k1y*yR1;  % 轮对1右轨(实际应分左右,简化)
    % 完整激励需根据轮对位置和左右轨分别施加
    dx = A*x + F;
end

注意:上述代码为演示框架,阻尼矩阵和激励项未完全展开。实际运行时需补充完整的一系/二系阻尼矩阵组装(与刚度矩阵结构相同,系数替换为阻尼系数),以及正确的轨道不平顺施加到每个轮对的左右轨。完整可运行版本较长,若需要可直接联系获取。

参考代码 17自由度铁道车辆横向动力学程序 www.youwenfan.com/contentcsv/81170.html

三、关键结果示例

运行后得到车体横移、侧滚、摇头及轮对横移的时间历程,可用于分析:

  • 临界速度(通过增加车速观察是否收敛)
  • 脱轨系数(轮轨横向力/垂向力)
  • 轮重减载率

四、扩展建议

  1. 完善阻尼矩阵 :按照刚度矩阵的组装方式,将 k 替换为 c 即可。
  2. 真实轨道谱 :用 interp1 插值美国六级谱或德国谱。
  3. 非线性轮轨关系:引入轮缘接触、饱和蠕滑力模型。
  4. 参数化分析:改变悬挂刚度、等效锥度,观察对临界速度的影响。
相关推荐
大蚂蚁2号1 小时前
Python 项目架构深度解析:从混乱到清晰
开发语言·python·架构
yaoxin52112310 小时前
434. Java 日期时间 API - Period 基于日期的时间段
java·开发语言·python
凡人叶枫10 小时前
Effective C++ 条款30:透彻了解 inlining 的里里外外
linux·开发语言·c++·嵌入式开发·effective c++
学逆向的10 小时前
C++纯虚函数
开发语言·c++·网络安全
程序员二叉11 小时前
【JUC】ThreadLocal底层原理|内存泄漏|弱引用|跨线程传递方案
java·开发语言·面试·职场和发展·juc
程序员二叉11 小时前
【JUC】线程池全套深度详解|参数|流程|拒绝策略|调优|异常处理
java·开发语言·jvm·算法·面试·juc
凡人叶枫12 小时前
Effective C++ 条款22:将成员变量声明为 private
linux·开发语言·c++
Qt程序员12 小时前
掌握 Linux 内核调度:从原理到实现(进程篇)
java·开发语言
code bean12 小时前
【LangChain】检索器完全指南:从向量检索到生产级 RAG 架构
java·开发语言·微服务