第010讲讨论的是Simulink里汽车动力性能仿真结果曲线怎么看、怎么判、怎么排查。这个主题听起来很直观:模型跑完,双击Scope看曲线。但实际做过项目就会发现,曲线不是给眼睛看的,它要回答三个很具体的工程问题——最高车速能不能到、百公里加速要多久、最大爬坡度是多少。如果你的模型已经建好,正准备调试参数、分析结果,或者要写课程报告,这一讲值得完整看一遍。真正麻烦的并不是“能看到曲线”,而是曲线出来之后,你要能判断它对不对、准不准、问题出在哪。
下面按实际使用顺序,把仿真结果曲线这件事拆开讲。先定位曲线类型,再准备输出信号,然后讲读曲线的方法,最后给一套可复用的排查链路。
1. 仿真结果曲线不是看“图”,而是看“指标”
1.1 一条曲线要回答三个动力性能问题
汽车动力性能,核心就是三件事:最高车速、加速时间、最大爬坡度。Simulink里跑出来的结果曲线,本质上是这三项指标的数值载体。
很多人一开始只盯着Scope里的波形好不好看,这是本末倒置。波形只是过程,最终要出的是几个可比较的结论:
- 最高车速:仿真结束时车速是否达到一个稳定平台,稳定值是多少。
- 加速时间:从静止加速到某个目标车速,比如100 km/h,需要多少秒。
- 最大爬坡度:车辆以最低挡、全油门工况爬坡时,能克服的最大坡度角。
所以跑完模型后,第一件事不是截图曲线,而是从曲线里提取这三个数值。后续所有参数调整,也都要回到这三个指标上来判断。
举个例子。如果你在模型里改了主减速比,车速曲线整体变陡,看上去“很有劲”。但你要追问:最高车速有没有下降?加速时间是不是变短了?如果是常规道路用车,一味调大主减速比,低速加速可能更好,但高速巡航的经济性和极速都会受影响。这条判断,只有从曲线对应的指标上才能看出来。
1.2 常见结果曲线类型与用途
在汽车动力性能仿真中,用到最多的是这几类曲线:
| 曲线类型 | 横轴 | 纵轴 | 主要用途 |
|---|---|---|---|
| 车速-时间曲线 | 仿真时间 | 车速 | 读加速时间、最高车速 |
| 加速度-时间曲线 | 仿真时间 | 纵向加速度 | 看换挡冲击、加速度衰减趋势 |
| 挡位-时间曲线 | 仿真时间 | 当前挡位 | 看换挡逻辑是否正常 |
| 驱动力-行驶阻力平衡图 | 车速 | 力 | 读驱动力与阻力交点,判断最高车速 |
| 发动机外特性曲线 | 发动机转速 | 转矩、功率 | 确认发动机模型输出是否符合设定 |
不同曲线对应的“可判断信息”不一样。
车速-时间曲线最直观,但它往往掩盖问题。比如车速曲线在100 km/h处像是不涨了,你可不能直接说最高车速就是100。要放大尾部看,是真正达到平衡,还是仿真时间不够、还没涨到位。加速度曲线能帮你判断模型动态过程,但它的噪声往往比车速曲线大,因为加速度是车速微分量,微分本身就放大高频干扰。挡位曲线则配合车速曲线使用,可以快速定位换挡点是否合理。
驱动力-行驶阻力平衡图更接近理论分析习惯。它的横轴是车速,纵轴是力,把驱动力曲线和滚动阻力、空气阻力之和画在一起。两条线相交的位置,就是理论最高车速点。这种图适合做动力性分析报告,但读取交点比直接读时间曲线稍微复杂一些。
所以第010讲建议你养成的第一个习惯是:拿到模型先不要乱跑,想清楚这一轮要看哪类指标,再选择对应的曲线去看。不要“跑完再说”,也不要一个Scope里塞几十个信号。
2. 跑曲线之前,先把关键信号和输出方式准备好
2.1 动力性能仿真的核心信号链路
在Simulink里,一个典型的汽车动力性能模型,信号链路大致是这样的:
发动机输出转矩 -> 变速器与主减速器扭矩放大 -> 半轴输出驱动力 -> 车辆纵向动力学方程 -> 车速与加速度反馈。
建模时不一定非要把这个链路做得特别复杂。用于动力性能分析的模型,通常把变速器主减速比、传动效率、车轮半径、滚阻系数、空气阻力系数、整车质量和旋转质量换算系数做成参数,再用几个关键模块把纵向动力学方程搭起来。
跑曲线之前,建议先在模型里把下面这些信号标出来,不管用Signal Label、Goto还是To Workspace,都要保证它们从仿真一开始就存在:
| 信号名 | 单位 | 作用 |
|---|---|---|
| throttle | 0~1 | 油门开度,加速工况一般给1 |
| gear | 无 | 当前挡位,用于判断换挡逻辑 |
| Te | Nm | 发动机输出转矩 |
| Ft | N | 驱动轮驱动力 |
| Ff | N | 滚动阻力 |
| Fw | N | 空气阻力 |
| v | m/s 或 km/h | 整车车速 |
| a | m/s² | 纵向加速度 |
这里最容易忽略的是:你不仅需要看“最终结果”,还需要看“中间计算值”。比如车速曲线偏高,你不清楚是驱动力太大还是阻力太小。如果模型里有Ft、Ff、Fw这些信号,一眼就能判断原因。如果没有,只能去模块里一个一个查,效率低很多。
因此我的习惯是:模型从搭建第一天开始,就把关键信号用带单位的方式命名。比如v_kmh、Ft_N、Ff_N、Te_Nm。这样不仅Scope里能看懂,后面用脚本画图时也不会因为单位搞混而出错。
2.2 Scope、To Workspace 与数据导出怎么选
查看仿真结果,常见有三种方式:
- Scope模块:适合调试阶段,快捷直观,但不利于后续批量处理和重绘。
- To Workspace / 记号输出:把信号写入MATLAB工作区,适合用脚本统一画图。
- Simulation Data Inspector:适合对比多组仿真结果,不用手动保存数据。
如果是第010讲这种“分析仿真结果曲线”的场合,我更建议以To Workspace为主,Scope作为辅助。原因是曲线只是中间产物,你最终还要读时间、读稳定值、画成报告用的图。数据进入工作区后,可以用plot命令自由控制线条、标签、坐标范围,也可以把多组参数的结果放一起比较。
如果你对MATLAB App Designer有兴趣,想做一个可交互的仿真演示界面,那更要把模型输出数据导出到工作区或文件。因为Scope只是“看”,App Designer需要的是数据,界面上的显示控件要拿这份数据来画图。先养成数据导出的习惯,后面再做界面展示会轻松很多。
具体操作上,在模型里用To Workspace模块,给变量起好名字,仿真后会在工作区生成结构体。也简化一点:模型配置参数里可以设置记录Output,把根级Outport信号记录到out对象。通用脚本逻辑大致是:
out = sim('vehicle_dynamic_model', 'StopTime', '100'); t = out.tout; v = out.v_kmh; % 车速信号名以你的模型为准 plot(t, v, 'LineWidth', 1.2); grid on; xlabel('Time (s)'); ylabel('Vehicle Speed (km/h)');这里的vehicle_dynamic_model是示例模型名。真实模型叫什么、信号名是什么,要以你自己的工程为准。唯一要注意的是,仿真之前先在模型里确认信号有没有被记录,别等跑完才发现工作区里没有数据。
3. 典型结果曲线的读法:形态、拐点、稳态
3.1 车速-时间曲线:先看趋势,再看拐点,最后看抖动
车速-时间曲线是大多数动力性能仿真最核心的曲线。读这条曲线时,我会按三步走。
第一步,看趋势。曲线是从0开始持续上升,还是在一段时间后趋于水平?持续上升说明车辆还没到达动力平衡,仿真时间不够,要继续延长。趋于水平说明驱动力和阻力逐渐接近,仿真结果已经进入稳态。
第二步,看拐点。如果是手动挡或带换挡逻辑的模型,车速曲线在换挡瞬间会有一个小转折或短暂停顿。这是因为换挡期间动力中断,驱动力突然下降,车速增速变慢甚至轻微回落。弯折点对应的时间,就是换挡时刻。看到这些拐点,不要觉得是模型错误,反而要检查换挡转速是否合理、挡位切换是否按预期进行。
第三步,看抖动。如果曲线在局部出现锯齿状波动,可能不是车辆物理规律,而是仿真问题。常见原因包括:求解器步长过大、查表模块输出跳变、换挡逻辑在边界反复切换、反馈回路存在高频噪声。抖动出现时,不要急着改控制器参数,先放大波形,确认抖动发生的时间点,再去检查那个时间点上挡位信号和驱动力信号是否异常。
3.2 加速时间和最高车速怎么从曲线上读
从车速-时间曲线上读加速时间,最稳妥的方法是用数据而不是靠肉眼。
比如要读0~100 km/h加速时间,先把车速单位统一。如果曲线纵轴是km/h,目标车速就是100。在MATLAB里可以根据仿真数据取出第一次达到目标车速的时间点:
v_target = 100; % km/h idx = find(v >= v_target, 1, 'first'); t_acc = t(idx); % 加速时间 disp(['0-100 km/h acceleration time: ', num2str(t_acc), ' s']);用find函数是最省事的做法。需要注意,如果车速曲线因为噪声在目标值附近反复穿线,要确认find取到的是第一次到达还是数值毛刺。更保险的办法是先对速度做中值滤波或滑动平均,再读取时间。
最高车速的读取方法不太一样。最高车速不是“仿真时间结束时的瞬时值”,而是“驱动力和阻力平衡时能达到的最大稳定车速”。常见的错误是,仿真时间设得不够长,车速还在缓涨,就直接把最后时刻的值当成极速,导致结果偏小。
判断最高车速是否可信,可以看末端速度的时间导数。如果最后几秒车速仍在缓慢上升,说明还没到稳定状态,需要延长仿真时间。如果末端曲线基本进入平台,取最后区段均值即可。更理论的做法是把驱动力和阻力曲线放到同一张图,求交点。
3.3 驱动力-阻力平衡图怎么用
驱动力-阻力平衡图是动力性能分析里非常有价值的曲线,但在很多Simulink初学者那里用得不多。
它的读图逻辑很直接:同一车速下,驱动力在阻力曲线之上,车辆就能加速;驱动力等于阻力,车辆处于平衡;驱动力低于阻力,车辆无法维持当前车速。曲线交点对应的车速,就是理论最高车速。
建模时可以在驱动力和阻力计算模块输出端分别接一个To Workspace,把力信号按车速信号保存下来。之后用脚本画出Ft、Ff+Fw两个量随车速变化的曲线,再求交点。
最高车速的解析估算公式也很简单,就是把驱动力方程和阻力方程联立:
发动机驱动力: [ F_t = \frac{T_e \cdot i_g \cdot i_0 \cdot \eta_t}{r} ]
行驶阻力: [ F_f + F_w = m g f \cos\alpha + \frac{1}{2} \rho C_D A v^2 ]
在水平路面、无坡道、全油门条件下,当(F_t = F_f + F_w)时,车速即为极速。这个公式不是让你手算代替Simulink,而是用来反向验证Simulink结果是否合理。
最大爬坡度则要单独看坡道工况。一般做法是把纵向动力学方程里的坡度阻力项加上,让坡度角从0开始逐步增加,看车辆能否维持最低挡全油门爬坡。最大爬坡度是使驱动力刚刚等于滚动阻力、坡道阻力和风阻之和时对应的坡度角。低速爬坡时风阻很小,可以忽略,因此手算校验也更方便。
4. 曲线形态异常,按这个顺序排查
4.1 第一层:数值异常,先看NaN、Inf和负值
仿真结果曲线最容易出现的问题是数值异常。表现形式很多:车速曲线出现NaN、某个时间点跳到一个极大值、加速度出现负数尖峰。
面对这类问题,我的顺序是先查输入再查模块,而不是直接改积分步长。
- 如果车速曲线出现NaN,优先检查积分器输入是否悬空、是否出现除零、查表模块是否超出边界。
- 如果车速瞬间变成Inf或极大值,优先检查指数计算、车速反复乘大因子、反馈回路正反馈。
- 如果加速度出现负值尖峰,优先检查换挡瞬间的驱动力是否被直接清零,或者微分模块对车速信号求导时引入了噪声。
排查数值异常时,可以在模型里加几个Display或者Scope监视中间量。先定位是哪个信号先变成NaN,再向前一级一级倒推。不要一上来就在Solver里换步长,那样只会掩盖问题。
4.2 第二层:信号逻辑异常,看油门和挡位
动力性能分析里,最常用的工况是全油门加速。也就是说,从t=0开始,油门开度应该稳定在1,直到仿真结束。
如果油门信号在某个时段掉到0.8、0.5,车速曲线必然会出现非预期的转折。这时要先确认:油门信号是由Step模块给的常数,还是由控制逻辑计算出来的?在动力性能仿真阶段,我建议先固定油门为1,排除控制策略干扰。
挡位信号也是重点。检查挡位曲线是否按照预设顺序切换:1挡到2挡、2挡到3挡,依次升挡。如果挡位在某个时间点反复跳动,说明换挡逻辑里存在边界条件冲突。常见原因是换挡判断同时基于“发动机转速达到上限”和“车速达到阈值”,两个条件没有做好滞回,导致挡位来回切换。这时候要调整换挡逻辑,而不是去改车辆参数。
4.3 第三层:参数与单位异常,重点检查单位换算
单位问题在汽车Simulink模型里出现频率极高,而且会直接导致曲线数量级不对。
最常见的坑是车速单位。空气阻力公式:
[ F_w = \frac{1}{2} \rho C_D A v^2 ]
这里的车速v必须用m/s。如果你的模型里车速信号是km/h,直接代入公式,空气阻力会比其他项大几十倍。结果就是最高车速远低于预期,车辆加速到中低速就上不去了。
另一个常见问题是发动机转速。发动机外特性数据通常用rpm表示,但Simulink里做角运动计算时经常要转成rad/s。传动比计算时,如果单位没有统一,驱动力会比实际值大很多。
| 常见量 | 常用单位 | 模型内部推荐单位 | 换算关系 |
|---|---|---|---|
| 车速 | km/h | m/s | 除以3.6 |
| 发动机转速 | rpm | rad/s | 乘2π再除以60 |
| 转矩 | Nm | Nm | 无需换算 |
| 力 | N | N | 无需换算 |
| 功率 | kW | W | 乘1000 |
| 坡度 | % | rad | arctan(坡度百分比/100) |
排查单位问题时,可以在模型里用Simulink的Signal Conversion或者Display模块,把关键信号的数值在某个稳态工况下打印出来,和理论值对比。比如已知车速100 km/h时,风阻应该是多大,看模型计算值是否一致,很快就能定位问题。
4.4 第四层:求解器和步长,最后再调
仿真结果曲线出现锯齿、抖动、或者局部剧烈振荡时,很多人立刻想到换求解器。但我的建议是把它放在最后排查,因为大部分曲线异常不是求解器导致的。
如果前面输入、逻辑、单位都查过了,仍然存在锯齿,再考虑仿真步长问题。
对于汽车动力性能模型,如果换挡逻辑比较简单,使用定步长求解器往往更容易解释结果。比如ode4配合0.01秒或0.001秒的固定步长,可以得到稳定的曲线。缺点是当模型运行时间很长时,计算量偏大。
如果使用变步长求解器,比如ode45,好处是计算速度快,但需要注意最大步长设置。如果最大步长过大,换挡时刻这种快速变化点可能被跳过,曲线看起来就会有点“跳变”。
| 求解器 | 步长类型 | 适用场景 | 注意事项 |
|---|---|---|---|
| ode45 | 变步长 | 常规连续模型 | 设置合理最大步长 |
| ode4 | 固定步长 | 模型简单、想保证可复现 | 步长越小越准,但耗时增加 |
| ode23t | 变步长 | 包含刚性问题 | 动力性能模型很少需要 |
换求解器之前,记录一下当前曲线的异常特征和发生时间。换完之后,如果异常消失,说明是步长或数值积分问题;如果异常还在,说明模型本身有问题。用对比法排查,能少走弯路。
5. 把曲线变成交付结果:脚本出图与理论校验
5.1 用脚本批量出图,不要只会截图Scope
做动力性能仿真,通常不会只跑一组参数。比如你要对比主减速比变化对极速和加速时间的影响,就会发现每次都打开Scope去截图,然后手动记录数值,非常浪费时间。
更高效的做法是把仿真、取数、绘图写成一个脚本。结构大致是:
models = {'car_base', 'car_i0_low', 'car_i0_high'}; label_list = {'原参数', '小主减速比', '大主减速比'}; figure; hold on; for k = 1:length(models) out = sim(models{k}, 'StopTime', '100'); plot(out.tout, out.v_kmh, 'LineWidth', 1.2, 'DisplayName', label_list{k}); end grid on; legend; xlabel('Time (s)'); ylabel('Vehicle Speed (km/h)'); title('不同主减速比下的加速曲线对比'); hold off;这里用字符串数组保存模型名,循环仿真,再把结果画在同一张图上。这样对比不同参数下的曲线形态、加速时间、极速值就非常直观。
如果想进一步自动提取指标,可以在循环里添加:
idx = find(out.v_kmh >= 100, 1, 'first'); t100 = out.tout(idx); v_max = max(out.v_kmh); fprintf('%s: 0-100km/h %.2f s, Vmax %.1f km/h\n', ... models{k}, t100, v_max);这不算复杂代码,但对动力性能分析足够了。实际使用中,你的信号名、模型名、目标车速可能不同,改成对应值即可。
5.2 与理论值互校,判断结果是否可信
曲线能跑出来,不等于结果可信。第010讲里特别建议做一步:理论值校验。
动力性能的三个指标,都可以用手算公式大致估算一遍:
- 最高车速:用驱动力等于行驶阻力的平衡方程求解。
- 加速时间:用纵向动力学方程,近似把加速度从起始车速到目标车速做数值积分。
- 最大爬坡度:用低速挡最大驱动力减去滚动阻力,再反推坡度角。
手算不一定很精确,但它能给你一个“合理范围”。Simulink仿真结果和这个合理范围对比,如果误差在5%以内,说明模型大概率没搭错。如果误差达到10%以上,不要急着调参数,先回到模型结构排查。
具体操作上,你可以先手算最高车速,然后看Simulink里车速曲线末端稳定值是多少。两者如果差出几十公里每小时,那就不是参数精度问题,而是建模链路里某个环节出错。
如果误差超过10%,我的建议不是调参数,而是把模型从发动机转矩输出到阻力计算逐段查一遍,先找出数量级不对的地方。
5.3 后续扩展:从一条曲线走向更多仿真场景
把结果曲线看懂、能校验、能批量出图之后,动力性能仿真其实可以继续往外扩展。
最常见的方向是换挡策略优化。现在做的是固定换挡点,后面可以改成基于车速或转法的自动换挡逻辑,观察不同换挡点对加速时间、极速和燃油经济性的影响。这时你需要看的曲线就不只是车速,还有发动机工作点、挡位变化、换挡冲击度。
另一个方向是整车能量管理。在纯电或混动车型里,动力性能还要考虑电机外特性、电池SOC衰减、能量回收等因素。Simulink模型会从单纯的纵向动力学模型,扩展成包含驱动系统效率、电池功率限制、控制策略的完整能量管理模型。结果曲线也从车速-时间,扩展成SOC-时间、电机转矩-时间、电池功率-时间等很多条。
这些方向听起来复杂,但基本功还是同一套:知道模型里有哪些关键信号,知道仿真出来的曲线对应什么物理量,知道曲线异常时怎么按层次排查。第010讲讲的这些东西,直接延伸到这些方向上也是通用的。
如果你现在正在做汽车动力性能仿真,我建议你先把第2节的信号清单列出来,再开始跑模型。曲线是结果,但真正决定曲线质量的,是建模阶段留好的信号、单位和仿真设置。这一讲的核心,就是把“仿真结果曲线”从一张图变成一套可判断、可校验、可复现的方法。剩下的事情,就是回到你自己的模型里,多跑几组参数,把读取曲线、提取指标、排查异常这套流程练熟。