用MATLAB求发动机最优工作曲线:从台架数据到自动计算
2026/9/15 8:28:30 网站建设 项目流程

搞发动机台架标定的朋友应该都有体会:万有特性数据测出来只是第一步,真正磨人的是怎么从几百个工况点里把那条“最优工作曲线”找出来。以前在学校做项目时,我都是把数据倒进Excel,再用散点图一层层描线,靠肉眼找最低油耗率区域,效率低不说,不同人描出来的曲线还不一样,评审时总要解释半天。后来我干脆用MATLAB写了一套计算程序,把“某功率下最低燃油消耗率对应的工作点”自动化地算出来,再绘制到万有特性图上。这篇文章就把这套程序的完整思路、关键代码和实际使用中踩过的坑记录下来,给正在做动力总成匹配、混动控制策略或者整车经济性仿真的朋友一个可直接参考的样本。

这套方法解决的问题很具体:给定一台发动机的转速、扭矩和燃油消耗率数据,求任意目标功率下,发动机应该运行在哪个转速、扭矩组合点,使得燃油消耗率最低。把这些最优点连成一条线,就是通常说的最优工作曲线(也叫最佳经济性曲线、最小油耗率曲线)。它既是整车能量管理策略的依据,也是混动发动机工况点分配的核心参考。

1. 最优工作曲线的数学本质:为什么它不是一条固定的转速线

在很多人的直觉里,发动机最佳经济性区域不就是那张万有特性图上最内圈的低油耗区吗?直接让发动机恒定工作在最低油耗率点不就行了?这种想法忽略了“功率需求”这个约束。车辆在不同工况下需要的功率是变化的,发动机不可能永远停在唯一一个最低油耗点上,而是要沿着“等功率线”找到该功率下的油耗最低点。所以最优工作曲线,本质上是一条在“转速-扭矩-油耗率”三维曲面上,沿等功率方向做极小值扫描形成的轨迹线。

万有特性图的横轴是转速,纵轴是扭矩或平均有效压力,图上那些一圈一圈的等高线是等燃油消耗率线(BSFC线),单位通常是g/kWh。发动机任意工作点都对应一个特定的BSFC值,而BSFC的最小点通常出现在中高负荷、中等转速区域。最优工作曲线的数学问题可以表述为:对于给定功率$P$,满足$P = T \cdot n / 9550$(其中$T$为扭矩,单位N·m;$n$为转速,单位rpm;$P$为功率,单位kW)的所有$(n, T)$组合中,找到BSFC最小的那个点。

这里有一个容易被忽视的细节:等功率线在扭矩-转速坐标系里是一条双曲线$T = 9550 \cdot P / n$,当功率从小到大变化时,每个功率对应一条等功率双曲线,而这条双曲线会穿越万有特性图上不同的BSFC等高线区域。理论上的最优工作点,就是这条双曲线与某一圈BSFC等高线相切的位置。把所有功率下的切点连起来,就是最优工作曲线。

用图形化的语言来描述就是:把万有特性三维曲面想象成一座山,高度代表油耗率,最优工作曲线就是沿着山坡走、始终保持“在同高度线上走最短路”的那种轨迹,但约束条件不是距离,而是功率。

2. 数据从哪里来:台架数据的读取与预处理

这块往往被教程类文章一笔带过,但实际做项目时,最浪费时间的就是数据整理。台架测出来的万有特性数据,一般有三种格式:AVL、FEV这些测功机系统导出的Excel表格,自己写采集程序得到的CSV文本,以及直接把通信协议里的CAN报文记录下来后自行解析的数据。

2.1 用MATLAB把原始数据读进来

我实测过很多种读法,最省事的是直接用readtable统一处理,它能自动识别Excel和CSV,而且列名保留原表头,后面写代码时不需要死记列序号。比如AVL导出文件里通常会有“Engine Speed [rpm]”、“Torque [N·m]”、“BSFC [g/kWh]”这样的标准字段:

data = readtable('engine_map_raw.xlsx'); n_raw = data.('Engine Speed [rpm]'); T_raw = data.('Torque [N·m]'); bsfc_raw = data.('BSFC [g/kWh]');

如果是CAN报文解析出来的数据,列名可能是“EngSpeed”、“EngTorque”,字段单位也可能不是标准单位,这就要先做单位统一。比如有的台架给的扭矩是百分比负荷,需要乘以最大扭矩得到实际值;转速可能是0.125 rpm/bit的CAN原始值,需要做线性变换。原则上在进入计算之前,先把数据清洗成三列纯数值矩阵:[n, T, bsfc],这是后面所有计算的地基。

2.2 去除异常工况点与数据质量判断

台架数据不可能完美。节气门快速变化时油门执行器会超调,油耗仪在低负荷时脉动大,这些都会产生个别明显偏离的“野值”。我常用的办法是先画一个scatter散点图,用颜色映射BSFC值,人眼快速扫一遍,把明显站在油耗率等高线外面孤零零的红色点或蓝色点挑出来删掉。如果数据量大,也可以用统计方法,比如对每个转速窗口内的BSFC做中值滤波,偏离中值3倍绝对中位差(MAD)以上的点标记为异常点。

% 以转速为分组依据,剔除BSFC明显异常的点 t = isoutlier(bsfc_raw, 'movmedian', 50, 'ThresholdFactor', 5); n_raw(t) = []; T_raw(t) = []; bsfc_raw(t) = [];

不过要提醒一句:isoutlier这种自动剔除必须谨慎,特别是在外特性(全负荷)边界附近的点,那附近BSFC梯度大,容易被误判成异常。我个人的习惯是先用自动方法粗筛,再人工看一眼筛选结果,绝不能全自动一把梭。

3. 核心算法:等功率约束下的最低燃油消耗率搜索

数据准备好后,进入程序的心脏部分。最优工作曲线计算有很多种实现路线,我在开发过程中至少尝试过三种:等功率线上直接一维搜索、等高线求交、以及二维插值后沿约束线极值扫描。最终沉淀下来最稳定的是“约束线扫描+单变量优化”的组合。

3.1 构造平滑的二维BSFC插值场

原始台架数据是离散的测量网格点,转速通常是500rpm一个间隔,扭矩是50N·m一个间隔。要算出任意工作点的BSFC,不能只用最近邻的测量点,必须做二维插值。MATLAB里常用的是scatteredInterpolant或griddata,不过我建推荐用scatteredInterpolant,它对散点数据的支持更稳定,而且可以重复调用,省去重复构建插值函数的开销。

% 基于散点数据构建BSFC插值函数 F_bsfc = scatteredInterpolant(n_raw, T_raw, bsfc_raw, 'linear', 'linear');

插值方法的选择上,linear是默认值,计算快,但得到的曲面在网格线之间会有折痕,对后续求极值的平滑性不利。natural算法得到的曲面光滑连续且不会出现cubic那种过冲震荡,实测下来最适合油耗率场。cubic虽然在很多二维数据上表现好,但在测点稀疏的边界区域会出现明显的振铃效应,算出的最优工作曲线在低功率段会多出一些假拐点。

3.2 对单个目标功率P,找到BSFC最低的工作点

对于给定的目标功率$P$,等功率约束为$T = 9550 \cdot P / n$。我们把实际允许的转速范围定义为$[n_{min}, n_{max}]$。$n_{min}$通常取发动机最低稳定转速,比如800rpm;$n_{max}$是该功率下受外特性约束的最大转速。

要特别强调的是,转速扫描范围必须时刻检查扭矩是否超过外特性曲线。比如2000rpm、200kW时需要的扭矩是955N·m,而实际发动机在2000rpm最多能出250N·m,那么这个功率在2000rpm根本实现不了。所以我写代码时会先读入外特性数据,生成一个外特性扭矩限制函数$T_{max}(n)$,每次搜索前先求等功率线与外特性线的交点,把可行转速区间卡在物理可实现范围内。

function [n_opt, T_opt] = search_best_point(P_target, F_bsfc, n_min, n_max) % 在物理可行转速区间内搜索BSFC最低点 n_lower = max(n_min, 9550 * P_target / max_torque_curve_interp(n_min)); n_upper = n_max; % 实际还需要再精细判断,见下文边界约束说明 % 构造以转速为自变量的BSFC函数(沿等功率约束) bsfc_on_line = @(n) F_bsfc(n, 9550 * P_target ./ n); % 用fminbnd做单变量有界优化 options = optimset('TolX', 1e-4, 'Display', 'off'); [n_opt, bsfc_min] = fminbnd(bsfc_on_line, n_lower, n_upper, options); T_opt = 9550 * P_target / n_opt; end

这里有个优化技巧:原始目标函数“沿等功率线上的所有可能点”本来是一维连续优化问题,但BSFC函数对转速并不可导,所以不能直接用fminunc这种需要梯度的算法。fminbnd是黄金分割法和抛物线插值法的混合,不需要导数信息,对这种只有函数值的黑箱问题非常合适。TolX设到1e-4已经足够精细了,过小会增加迭代次数而精度提升不显著。

3.3 从单点搜索到整条曲线的遍历

遍历所有目标功率点,把每个功率的最优工作点记录下来,就得到最优工作曲线的离散序列。功率点的密度的选择要看后续用途:如果是做混动整车能量管理策略,功率点可以取到1kW间隔甚至更细;如果只是画图展示趋势,5kW间隔就够了。我一般用2kW间隔,兼顾精度和计算量。

P_list = 10:2:120; % 假设目标功率范围10kW~120kW n_opt_list = zeros(size(P_list)); T_opt_list = zeros(size(P_list)); for i = 1:length(P_list) [n_opt_list(i), T_opt_list(i)] = search_best_point(P_list(i), F_bsfc, 800, 6000); end

这段程序跑起来很快,一百个功率点一般不到1秒。但如果目标功率范围很大、转速上限很高,且插值函数用的是natural算法,可能在个别中段功率点出现优化器收敛到局部极小值的情况。我的经验是不要完全信任fminbnd每一步的结果,把所有最优点画出来,如果发现曲线有锯齿状跳变,就手动检查那个功率点附近的BSFC分布,看是不是局部极小值问题。

4. 踩坑记录:开发这套程序时遇到的实际问题

直接给出可运行代码的教程很多,但真正工程落地时麻烦都在细节上。这里把我踩过的几个最典型的坑分享出来。

4.1 外特性边界约束:最容易被忽略的物理限制

第一次写完程序后我直接拿台架数据算,结果发现小功率段的最优转速全部落在最低转速附近,而且发动机根本没有办法在那个转速输出那么小的扭矩——因为低于最低稳定转速时燃烧不稳定,即使扭矩为零也无法维持运转。解决方式是在搜索转速范围时加入两个硬约束:

  • 最低转速不低于发动机标定的最低稳定转速(一般800~900rpm)
  • 任意转速下等功率线对应的扭矩不能超过该转速下的外特性最大扭矩,也不能低于最小扭矩(部分发动机有倒拖线限制)

于是搜索区间的下界要做两次判断:

n_lower_temp = max(n_min, 9550 * P_target / T_max_n_min); % 另外还要确保该点扭矩不低于最小可行扭矩(比如怠速工况最小扭矩)

上界也不能直接取额定转速,因为等功率线在高转速段对应的扭矩可能小于零——那就是倒拖工况了。所以每个功率点的可行区间其实是在“等功率双曲线”和“外特性包络线”的交集里截出来的,这部分逻辑建议单独封装成一个函数,方便复用。

4.2 插值方法引起的最优曲线锯齿

最早我用cubic插值时,最优工作曲线在中等功率段出现了明显的锯齿,功率只增加2kW,最优转速却来回跳动150~300rpm。这对发动机控制策略来说是很糟糕的结果——转速频繁跳变意味着控制不稳定。后来检查发现,是cubic插值在数据点稀疏区域产生了震荡,导致BSFC曲面存在多个虚假局部极值点。

解决方式是换用natural插值,锯齿问题几乎消失。如果你的数据测量网格足够密(比如转速间隔250rpm以下),linear插值的效果也完全可用。这里给一个判断标准:插值后的BSFC曲面在最优工作曲线附近应该是单调平滑的,如果出现“米粒状”的小高地和深坑,大概率就是插值方法的问题。

4.3 台架数据转速点不均匀导致的权重偏差

有些老型号台架在低转速区域测点比较密,高转速区域测点比较疏。用scatteredInterpolant处理这类数据时,默认情况下不会考虑测量点的密度差异,高转速区域虽然数据少但插值权重正常,结果是在BSFC曲面构建时高转速区域的“可信度”被高估了。严格的做法是对高转速区域的数据做加权或者增加虚拟测点,不过在工程实践中,我通常直接要求测试工程师在500rpm以上区域加密测点,从源头解决数据密度问题。

5. 程序输出与工程判断:怎么确认曲线是真的“最优”

程序不是算完就结束了,输出结果的验证同样要花心思。我的做法是至少做三件事:数值合理性检查、图形化验证、台架复测抽点。

5.1 数值合理性检查

把计算出的最优工作点带入原插值函数,验证BSFC值是否确实低于该功率附近其他工作点的BSFC,并统计每个功率点下可行搜索区间内的BSFC范围。如果最优点的BSFC正好卡在搜索边界上,就要特别警惕——可能不是真正的内部极值点,而是被边界硬截断的结果。这类点需要在结果表里单独标记,后续应用时注意规避。

5.2 图形化叠加验证

把最优工作曲线画在万有特性图上,跟BSFC等高线放在一起。理论上,这条曲线应该沿着低油耗区大致走,穿过外围等高线时方向应该是“法向”的——也就是说曲线应大致垂直于等高线穿过每个功率档位,而不是在中间打转。如果曲线有一小段跟等BSFC线平行甚至回旋,那说明算法在那个位置把等功率双曲线的两个局部极小值搞混了,需要人工介入。

我用contour函数绘制等油耗线,用plot叠加最优工作曲线,再加一条等功率线标注,这样一张图就能完成交叉验证:

[n_grid, T_grid] = meshgrid(800:100:6000, 0:20:380); bsfc_grid = F_bsfc(n_grid, T_grid); contour(n_grid, T_grid, bsfc_grid, [220 240 260 280 320 360 400], 'ShowText', 'on'); hold on; plot(n_opt_list, T_opt_list, 'r-o', 'LineWidth', 1.5); xlabel('Engine Speed (rpm)'); ylabel('Torque (N·m)');

5.3 用真实发动机数据跑一遍效果

我以一台2.0T汽油机的万有特性数据为例,转速范围800~6000rpm,最大扭矩350N·m @ 3500rpm,万有特性最低油耗率约235g/kWh,最低油耗区集中在2200~3200rpm、200~300N·m。用程序遍历10~140kW目标功率,计算结果如下:

  • 功率10kW:最优工作点约1300rpm,扭矩73N·m附近,BSFC约325g/kWh。发动机在低功率时只能靠较低转速来维持负荷率,否则高转速低负荷会导致油耗急剧上升。
  • 功率40kW:最优工作点移到约2100rpm,扭矩182N·m,BSFC约248g/kWh。这个负荷率已经接近经济区。
  • 功率80kW:最优工作点约2800rpm,扭矩273N·m,进入最低油耗区,BSFC约239g/kWh。
  • 功率120kW:最优工作点移到约3700rpm,扭矩310N·m,BSFC约254g/kWh。高功率需求下,转速必须升高,负荷率也偏大,逐渐偏离最佳经济区。

这个趋势和工程经验完全吻合:小功率时走低转速、中等功率时贴近经济区中转速、大功率时转速负荷双升。实测曲线在万有特性图上就是从低转速中低负荷出发,一路扫过最低油耗区,再向高转速中高负荷延伸,视觉效果非常直观。

6. 程序架构设计与功能扩展方向

基础版程序跑通后,我在实际项目里做了一些扩展,几个方向都很有用,推荐按需开发。

6.1 程序模块划分

整套程序我建议拆成四个模块:数据导入模块(读原始数据、单位换算、异常点清洗)、插值模块(构建BSFC连续场、外特性包络线)、优化模块(单功率点搜索、全程遍历)、结果输出模块(图表绘制、数据表格导出)。独立函数的好处是可以单独替换某一块而不影响其他部分,比如数据导入换了Excel模板,只要最后输出同样的[n, T, bsfc]矩阵,后续逻辑完全不受影响。

6.2 多目标扩展:兼顾油耗与排放

实际工程中,最优工作曲线不只看油耗。比如NOx排放高发区往往在中高负荷,如果只按油耗率选点,可能把发动机拉到NOx高温区。我做过一个扩展版本,在目标函数里加入NOx和PM(颗粒物)排放的加权项,把目标函数从单纯的BSFC变成综合代价:

$$J = w_{bsfc} \cdot BSFC + w_{NOx} \cdot NOx + w_{PM} \cdot PM$$

权重系数$w$可以通过标定试验得到,也可以用层次分析法根据排放法规要求来确定。这个扩展版的代码结构和纯油耗版完全一致,只是把目标函数替换为多目标加权代价函数。

6.3 与Simulink或整车控制策略联合

最常用到的场景是:把最优工作曲线用Lookup Table形式导出,供混动整车能量管理策略使用。最优工作曲线的两个输出变量是转速和扭矩,输入是功率需求。但注意,Lookup Table按“功率→最优转速”的一维映射存储即可,不要存成二维表,否则数据冗余且容易插值出错。

T_opt_table = array2table([P_list', n_opt_list', T_opt_list'], ... 'VariableNames', {'Power_kW', 'Speed_rpm', 'Torque_Nm'}); writetable(T_opt_table, 'best_operating_curve.csv');

导出的CSV拿去做Simulink一维查表,MAP空间占用比万有特性插值小得多,运行速度也快,适合直接部署到快速控制原型里。

6.4 扩展到混动模式切换策略

在P1/P2混动架构中,发动机最优工作曲线最常见的用武之地是“串联模式”下的发电转速点确定。串联混动时发动机不直接驱动车轮,而是带动发电机发电,这时理论上可以让发动机始终运行在某个功率下的最低油耗点。把程序结果和发电机效率MAP叠加起来,综合考虑发动机和电机损耗,还能得到系统级的“最优发电曲线”。这就是发动机最优工作曲线概念的进一步延伸。

我在实际做能量管理策略时还发现,发动机最优工作曲线与变速箱速比匹配是联动的。比如某两挡混动变速箱,每个挡位下同样的车速对应的发动机转速映射关系不同,这时最优工作曲线就决定了应该在哪个挡位、哪个功率点让发动机介入。这个联动逻辑如果手动做,工作量巨大,但有了自动计算程序之后,可以批量生成多个挡位下的最优工作点MAP,直接作为控制策略的输入。

最后再分享一个实用技巧:跑完程序后,输出结果里除了曲线数据,建议同时保留每个最优点的可行搜索区间和谷值平坦度。有些功率点附近BSFC曲面非常平,最优转速从1900rpm挪到2200rpm,油耗率只变化1~2g/kWh,而如果按单一最优转速点去控制,会导致频繁换挡或转速波动。把“平坦区间”一并输出,控制策略就可以在保证油耗无明显劣化的前提下加入滞回逻辑,实际驾驶感受会好很多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询