安装光滑表面以研究燃料效率

这个例子展示了如何使用曲线拟合工具箱™来拟合一些汽车数据的响应面,以研究燃油效率。

工具箱提供了由GTPOWER预测内燃机模型生成的样本数据。该模型模拟自然吸气火花点火,2升,直列4缸发动机。您可以拟合平滑低表面的数据,以找到最低的燃料消耗。

数据集包括建模响应面所需的变量:

  • 速度是以每分钟转数(rpm)为单位。

  • 载荷是标准化的气瓶空气质量(在标准温度和压力下,气瓶充气与最大自然吸气气瓶充气的比率)。

  • BSFC是制动燃料消耗率,单位为g/KWh。即输入的能量除以输出的机械功率(燃油效率)。

目的是建立响应面模型,以找到最小BSFC作为速度和负载的函数。您可以使用这个表面作为一个表,包括作为混合动力车辆优化算法的一部分,结合使用发动机和发动机。为了尽可能高效地操作发动机,工作台必须在靠近BSFC碗底部的位置操作发动机。

加载和预处理数据

从XLS电子表格加载数据。使用“基本”命令选项,用于非windows®平台。

创建一个变量n所有的数值数据都在一个数组中。

n = xlsread (“Engine_Data_SI_NA_2L_I4.xls”' si na 2l i4 '''“基本”);

从变量中提取n兴趣栏。

速度= n (:, 2);LOAD_CMD = n (:, 3);负荷= n (:, 8);BSFC = n (:, 22);

在拟合之前对数据进行处理,从每次扫描中提取出最小的BSFC值。数据点以扫描速度/负载的方式组织。

获得速度/加载网站的列表:

SL =唯一的([SPEED, LOAD_CMD],“行”);nRuns = size(SL, 1);

对于每个速度/负载站点,查找站点数据,提取实际测量负载和最小BSFC。

minBSFC = 0 (nRuns, 1);Load = 0 (nRuns, 1);速度= 0 (nRuns, 1);i = 1:nRuns idx = SPEED == SL(i,1) & LOAD_CMD == SL(i,2);minBSFC(i) = min(BSFC(idx));Load(i) = mean(Load(idx));Speed(i) = mean(Speed(idx));结束

适合一个表面

将燃料效率的表面贴合到预处理数据上。

f1 =适合([速度,负载],minBSFC,“洛斯”“正常化”“上”
局部加权平滑线性回归:f1(x,y) = lowess(线性)平滑回归从p计算,其中x被平均3407和std 1214标准化,y被平均0.5173和std 0.1766标准化。系数:p =系数结构

情节适合

plot(f1,[速度,负载],minBSFC);包含(“速度(RPM)”);ylabel (的负荷(%));zlabel (“最低BSFC(克/千瓦时)”);

删除问题点

回顾结果图。

有些地方BSFC是负数,因为这些数据是由引擎模拟生成的。

将这些问题数据点保持在[0,Inf]范围内。

out = excludedata(Speed, minBSFC,“范围”, [0, Inf]);f2 =适合([速度,负载],minBSFC,“洛斯”...“正常化”“上”“排除”,)
局部加权平滑线性回归:f2(x,y) = lowess(线性)平滑回归计算从p,其中x是标准化的均值3443和std 1187,其中y是标准化的均值0.521和std 0.175系数:p =系数结构

绘制新的匹配图。注意,被排除的点用红色叉表示。

plot(f2,[速度,负载],minBSFC,“排除”,);包含(“速度(RPM)”);ylabel (的负荷(%));zlabel (“最低BSFC(克/千瓦时)”);

放大

放大感兴趣的z轴部分。

zlim([0, max(minBSFC)])

您希望有效地操作引擎,因此创建等高线图,以查看BSFC较低的区域。使用plot函数,并指定名称/值参数对“风格”,“轮廓”

plot(f2,[速度,负载],minBSFC,“排除”,,“风格”“轮廓”);包含(“速度(RPM)”);ylabel (的负荷(%));colorbar

从Surface创建一个Table

通过评估模型生成一个表f2在点的网格上。

为表断点创建变量。

Speedbreakpoints = linspace(1000, 5500, 17);Loadbreakpoints = linspace(0.2, 0.8, 13);

要为表生成值,请在点网格上评估模型。

[tSpeed, tLoad] = meshgrid(速度断点,加载断点);tsfc = f2(tSpeed, tLoad);

在命令行检查表的行和列。

tBSFC(1:2:最终,1:2:结束)
ans =列1至7 722.3280 766.7608 779.4296 757.4574 694.5378 624.4095 576.5235 503.9880 499.9201 481.7240 458.2803 427.7338 422.1099 412.1624 394.7579 364.3421 336.1811 330.1550 329.1635 328.1810 329.1144 333.7740 307.7736 295.1777 291.2068 290.3637 290.0173 287.8672 295.9729 282.7567 273.8287 270.8869 269.8485 271.0547 270.5502 273.7512第8列到第9列532.1533 466.9610 396.3209 398.0199 335.3871 346.3882 286.3077 291.0075 269.6837 272.2054 258.0298 260.5269 249.0083 250.4165

根据原始模型绘制表格

模型表面的网格显示了表中的断点。

H = plot(f2);h.EdgeColor =“没有”;持有tSpeed, tLoad, tsfc,...“线型”“- - -”“线宽”2,“EdgeColor”“k”...“FaceColor”“没有”“FaceAlpha”1);持有包含(“速度(RPM)”);ylabel (的负荷(%));zlabel (“最低BSFC(克/千瓦时)”);

检查表精度

通过在一个更细的网格上绘制模型和表之间的差异来查看它们之间的差异。然后,利用表和模型之间的预测精度差异来确定满足精度要求的最有效的表大小。

下面的代码在一个更细的网格上评估模型,并绘制出模型和表之间的差异。

[tfSpeed, tfLoad] = meshgrid(...Linspace (1000, 5500, 8*17+1),...Linspace(0.2,0.8,8 * 13 + 1));TFBSFC_MODEL = F2(TFSPEED,TFLOAD);TFBSFC_TABLE = INTERP2(TSPEED,Tload,TBSFC,TFSPEED,TFLOAD,“线性”);tfDiff = tfBSFC_model - tfBSFC_table;surf(tfSpeed, tfLoad, tfDiff,“线型”“没有”);持有目(tSpeed, tLoad, 0 (size(tBSFC)),...“线型”“- - -”“线宽”2,“EdgeColor”“k”...“FaceColor”“没有”“FaceAlpha”1);持有包含(“速度(RPM)”);ylabel (的负荷(%));zlabel (“型号与表的差异[g/Kwh]”);标题(sprintf (“最大的区别:% g”, max(abs(tfDiff(:)))));

创建包含断点值的表数组

通过评估点网格上的模型拟合度创建表后,可以从MATLAB导出表数据。在导出之前,创建一个表数组,在第一行和列中包含断点值。下面的命令将您的数据重塑为这种表格格式:

  • X (speedbreakpoints)是一个(1 * M)向量

  • Y (loadbreakpoints)是一个(nx1)向量

  • Z (tBSFC)是一个(M x N)矩阵

Table = [{“负载\速度”}, num2cell (speedbreakpoints(:)。') num2cell(loadbreakpoints (:)), num2cell(tBSFC)];

导出表到电子表格文件

你可以使用xlswrite函数将表格数据导出到新的Excel电子表格。执行以下命令创建电子表格文件。

xlswrite (“tabledata.xlsx”、表)

创建查找表块

如果你有Simulink金宝app™软件,你可以像下面这样创建一个查找表块。执行以下代码进行测试。

1.使用2-D查找表块创建模型。

金宝app仿真软件new_system (“my_model”) open_system (“my_model”) add_block (S金宝appimulink/查找表/ 2d查找表“my_model / surfaceblock”

2.在查找表中填充速度断点、加载断点和查找表。

set_param (“my_model / surfaceblock”...“BreakpointsForDimension1”“loadbreakpoints”...“BreakpointsForDimension2”“speedbreakpoints”...“表”“tBSFC”);

3.检查填充的“查找表”块。