用 MATLAB 绘制汽车的各种动力特性曲线
汽车理论这门课讲到汽车的动力性,书上一堆曲线图看着挺唬人,但其实都是从几个基础公式推出来的。正好课上有一道大题,给了一辆中型货车的全部参数,要求把几张特性曲线都画出来。我干脆全用 MATLAB 算,把整个流程从参数到图像走一遍,记下来。
题目
一辆中型货车,已知数据如下:
| 参数 | 数值 |
|---|---|
| 总质量 m | 9300 kg |
| 车轮滚动半径 r | 0.49 m |
| 传动系机械效率(直接挡) | 0.9 |
| 传动系机械效率(其他挡) | 0.85 |
| 滚动阻力系数 f | 0.015 |
| 空气阻力因素 Cd·A | 4 m² |
| 主减速器传动比 i₀ | 6.33 |
各挡传动比和旋转质量换算系数:
| 挡位 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| 传动比 | 7.31 | 4.31 | 2.45 | 1.54 | 1 |
| 旋转质量换算系数 | 3.17 | 1.77 | 1.27 | 1.12 | 1.07 |
发动机外特性(转速 n 对应转矩 Ttq):
| n (r/min) | 1200 | 1400 | 1600 | 1800 | 2000 | 2200 | 2400 | 2600 | 2800 |
|---|---|---|---|---|---|---|---|---|---|
| Ttq (N·m) | 326 | 334.5 | 343 | 340.5 | 338 | 332 | 326.5 | 313 | 300 |
要求:
- 计算并绘制驱动力与行驶阻力平衡图,求最大车速和最大爬坡度
- 计算并绘制直接挡加速时间曲线
- 计算并绘制动力特性图
- 计算并绘制功率平衡图
第一步:把参数存进 workspace
m=9300; r=0.49; efficiency_direct=0.9; efficiency_other=0.85;
f=0.015; cd_a=4; i_0=6.33; Ff=m*9.8*f;
gear_ratio(1)=7.31; gear_ratio(2)=4.31; gear_ratio(3)=2.45; gear_ratio(4)=1.54; gear_ratio(5)=1;
gear_i(1)=3.17; gear_i(2)=1.77; gear_i(3)=1.27; gear_i(4)=1.12; gear_i(5)=1.07;
engine_n(1)=1200; engine_n(2)=1400; engine_n(3)=1600; engine_n(4)=1800; engine_n(5)=2000;
engine_n(6)=2200; engine_n(7)=2400; engine_n(8)=2600; engine_n(9)=2800;
engine_T(1)=326; engine_T(2)=334.5; engine_T(3)=343; engine_T(4)=340.5; engine_T(5)=338;
engine_T(6)=332; engine_T(7)=326.5; engine_T(8)=313; engine_T(9)=300;
density_air=1.293;
第二步:把发动机外特性插值加密
发动机外特性只给了 9 个点,直接拿来积分(后面算加速时间要用)太稀疏了,先用样条插值把它加密成连续曲线。插值后的转速记为 nn,转矩记为 T_n:
nn=(1200:1:2800);
T_n=spline(engine_n,engine_T,nn);
第三步:逐项计算各个量
接下来按公式一个一个算:驱动力、车速、空气阻力、加速度、发动机功率、爬坡角度、加速时间、动力因数。
驱动力 Ft,公式:
Ft_1_int=T_n*i_0*0.85*gear_ratio(1)/r;
Ft_2_int=T_n*i_0*0.85*gear_ratio(2)/r;
Ft_3_int=T_n*i_0*0.85*gear_ratio(3)/r;
Ft_4_int=T_n*i_0*0.85*gear_ratio(4)/r;
Ft_5_int=T_n*i_0*0.9 *gear_ratio(5)/r; % 5 挡是直接挡,效率取 0.9
车速 ua,公式:
ua_1_int=nn*r*0.377/i_0/gear_ratio(1);
ua_2_int=nn*r*0.377/i_0/gear_ratio(2);
ua_3_int=nn*r*0.377/i_0/gear_ratio(3);
ua_4_int=nn*r*0.377/i_0/gear_ratio(4);
ua_5_int=nn*r*0.377/i_0/gear_ratio(5);
空气阻力 Fw,公式:
Fw_1_int=cd_a*ua_1_int.^2/21.15;
Fw_2_int=cd_a*ua_2_int.^2/21.15;
Fw_3_int=cd_a*ua_3_int.^2/21.15;
Fw_4_int=cd_a*ua_4_int.^2/21.15;
Fw_5_int=cd_a*ua_5_int.^2/21.15;
加速度 acc,公式:
acc_1=(Ft_1_int-Ff-Fw_1_int)/m/3.17;
acc_2=(Ft_2_int-Ff-Fw_2_int)/m/1.77;
acc_3=(Ft_3_int-Ff-Fw_3_int)/m/1.27;
acc_4=(Ft_4_int-Ff-Fw_4_int)/m/1.12;
acc_5=(Ft_5_int-Ff-Fw_5_int)/m/1.07;
发动机功率 Pe,公式:
for j=1:1601
Pe_1(j)=(m*9.8*0.015*ua_1_int(j)/3600+cd_a*ua_1_int(j)^3/76140+3.17*m*ua_1_int(j)/3600*acc_1(j))/efficiency_other;
Pe_2(j)=(m*9.8*0.015*ua_2_int(j)/3600+cd_a*ua_2_int(j)^3/76140+1.77*m*ua_2_int(j)/3600*acc_2(j))/efficiency_other;
Pe_3(j)=(m*9.8*0.015*ua_3_int(j)/3600+cd_a*ua_3_int(j)^3/76140+1.27*m*ua_3_int(j)/3600*acc_3(j))/efficiency_other;
Pe_4(j)=(m*9.8*0.015*ua_4_int(j)/3600+cd_a*ua_4_int(j)^3/76140+1.12*m*ua_4_int(j)/3600*acc_4(j))/efficiency_other;
Pe_5(j)=(m*9.8*0.015*ua_5_int(j)/3600+cd_a*ua_5_int(j)^3/76140+1.07*m*ua_5_int(j)/3600*acc_5(j))/efficiency_direct;
end
爬坡角度和爬坡度,公式:
angle(1,:)=asin((Ft_1_int-Ff-Fw_1_int)/m/9.8);
angle(2,:)=asin((Ft_2_int-Ff-Fw_2_int)/m/9.8);
angle(3,:)=asin((Ft_3_int-Ff-Fw_3_int)/m/9.8);
angle(4,:)=asin((Ft_4_int-Ff-Fw_4_int)/m/9.8);
angle(5,:)=asin((Ft_5_int-Ff-Fw_5_int)/m/9.8);
加速时间 t,用微分的方法逐点累加,相当于一阶龙格-库塔。公式:
t(1)=0;
for i=2:1601
t(i)=(ua_5_int(i)-ua_5_int(i-1))/acc_5(i-1)+t(i-1);
end
再算各挡总阻力,以及一条连续的速度-阻力曲线(用来在平衡图上画那条阻力线):
F_1_resist=Fw_1_int+Ff;
F_2_resist=Fw_2_int+Ff;
F_3_resist=Fw_3_int+Ff;
F_4_resist=Fw_4_int+Ff;
F_5_resist=Fw_5_int+Ff;
ua_continue=[0:1:100];
F_resist_continue=Ff+1/2*density_air*ua_continue.^2*cd_a/3.6/3.6;
动力因数 D,公式:
D(1,:)=f+3.17/9.8*acc_1;
D(2,:)=f+1.77/9.8*acc_2;
D(3,:)=f+1.27/9.8*acc_3;
D(4,:)=f+1.12/9.8*acc_4;
D(5,:)=f+1.07/9.8*acc_5;
第四步:画图
把上面算出来的量画成四类曲线:
% 驱动力-行驶阻力平衡图
plot(ua_1_int,Ft_1_int,ua_2_int,Ft_2_int,ua_3_int,Ft_3_int,ua_4_int,Ft_4_int,ua_5_int,Ft_5_int,ua_continue,F_resist_continue);
xlabel('ua(km/h)');ylabel('F/N');title('汽车的驱动力-行驶阻力平衡图')
% 最大爬坡度
plot(ua_1_int,tan(angle(1,:))*100,ua_2_int,tan(angle(2,:))*100,ua_3_int,tan(angle(3,:))*100,ua_4_int,tan(angle(4,:))*100,ua_5_int,tan(angle(5,:))*100);
xlabel('ua(km/h)');ylabel('i(%)');title('汽车的爬坡度图')
% 直接挡加速时间曲线
plot(t,ua_5_int);xlabel('t/s');ylabel('ua km/h');title('直接挡时候的加速时间曲线')
% 动力特性图
f_continue=0.015*ones(1,101);
plot(ua_1_int,D(1,:),ua_2_int,D(2,:),ua_3_int,D(3,:),ua_4_int,D(4,:),ua_5_int,D(5,:),ua_continue,f_continue);
xlabel('ua(km/h)');ylabel('D');title('汽车的动力特性图')
% 功率平衡图
plot(ua_1_int,Pe_1,ua_2_int,Pe_2,ua_3_int,Pe_3,ua_4_int,Pe_4,ua_5_int,Pe_5);
xlabel('ua km/h');ylabel('Pe/kW');title('汽车功率平衡图')
结果
从图上读出来:
- 最高车速 81.71 km/h(驱动力曲线和阻力曲线在最高挡的交点)
- 最大爬坡度 30%(1 挡爬坡度曲线的峰值)
五张图如下:
驱动力-行驶阻力平衡图(各挡驱动力曲线与那条向上翘的阻力曲线,交点就是最高车速):
爬坡度图(1 挡峰值约 30%,就是最大爬坡度):
直接挡加速时间曲线:
动力特性图(动力因数 D,底下那条水平线是滚动阻力系数 f):
功率平衡图:
整道题做下来,最大的体会是:汽车的动力性其实就被几个公式管着,发动机外特性 + 传动比 + 阻力模型,剩下的都是把它们组合起来积分、求交点。MATLAB 在这里就是个趁手的计算器,省去了手算插值和积分的麻烦。