主要内容

适合光滑表面调查燃油效率

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

工具箱提供了从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 = unique([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));速度(i) =平均数(速度(idx));结束

适合一个表面

将燃料效率曲面与预处理数据拟合。

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

情节适合

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

删除问题点

回顾最终的情节。

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

通过将点保持在[0,Inf]的范围内来删除这些问题数据点。

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

绘制新的适合度。注意,被排除的点被标为红色的叉。

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

放大

放大感兴趣的z轴部分。

zlim([0, max(minBSFC)])

你想要有效地操作发动机,所以创建一个等高线图来查看BSFC低的区域。使用plot函数,并指定名称/值参数对“风格”,“轮廓”

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

从表面创建一个表

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

为表断点创建变量。

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

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

[tSpeed, tLoad] = meshgrid(speedbreakpoints, loadbreakpoints);tBSFC = 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.1777 291.2068 293.3637 270.8869 269.8485 271.0547 270.5507 273.7512 264.5167 259.7631 257.9215 256.9350 258.3228 258.6638 251.5652 247.6746 247.2747 247.4699 248.2433 248.8139列8 ~ 9 532.1533466.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, tBSFC)...“线型”,“- - -”,“线宽”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,“线型”,“没有”);持有mesh(tSpeed, tLoad, zero (size(tBSFC)),...“线型”,“- - -”,“线宽”2,“EdgeColor”,“k”,...“FaceColor”,“没有”,“FaceAlpha”1);持有包含(“速度(RPM)”);ylabel (的负荷(%));zlabel (“模型与表的差异[g/Kwh]”);标题(sprintf (“最大的区别:% g”, max(abs(tfDiff(:)))));

创建包含断点值的表数组

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

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

  • Y (loadbreakpoints)是一个(N × 1)向量

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

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

导出表到电子表格文件

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

xlswrite (“tabledata.xlsx”、表)

创建一个查找表块

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

1.使用二维Lookup Table块创建模型。

金宝app仿真软件new_system (“my_model”) open_system (“my_model”) add_block ('金宝appsimulink/查找表/二维查找表',“my_model / surfaceblock”

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

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

3.检查填充的Lookup Table块。