本文主要讲解在Matlab中如何使用MBC工具箱进行柴油发动机点对点模型建立的方法。
下面的例子演示了如何使用Model-Based
Calibration(MBC工具箱)工具箱的命令行功能建立点对点发动机模型项目。
多次喷射柴油发动机和直喷汽油发动机往往只能用点对点模型进行模型的建立。你可以使用点对点模型建立一个模型,在发动机的每一个工况点下由足够的精度去产生一个最佳的标定。
点对点命令行功能对于处理每个工况点的开发设计的复杂性是必须的。
为什么需要使用到点对点模型呢?发动机执行器和传感器对于发动机管理系统(EMS)来说是连续不断的增加进去的并且对不断增长的发动机排放、燃油消耗率以及性能需求进行响应。在一些情况下,依赖于二级模型建立方法的最优的发动机标定开发过程建立的模型不能够使发动机性能参数对发动机的运行范围进行足够精度的响应。但是点对点模型可以对测量的工况点提供必需的模型精度。但是,点对点模型并不提供在其他运行工况点的响应的估算。
此例子使用产生于柴油机案例分析学习中得两级模型作为发动机测功机或者CAE发动机模型的替用品,这是为了此演示产生一个点对点的数据。这个例子可以展示给你:
1)每个工况点下生成local designs。如果可以收集的design点不足,你可是尝试使用Sobal序列进行扩大;
2)生成local
Multiple Models对每一个工况点的每一个响应进行模型的建立;
3)建立一个点对点边界模型进行每一个工况点的数据界限的定义,进而使用于之后的标定优化中。
目录:
1.从柴油项目中加载模型;
2.为点对点模型定义输入并创建local model;
3.定义发动机工况点;
4.为每一个工况点创建一个local design;
5.根据工况点对local design进行命名;
6.根据转速对local inputs进行限制值的设定;
7.为local
design收集发动机数据;
8.需要的话需要进行扩大设计;
9.收集响应数据;
10.检查BSFC(油耗)的合适值;
11.数据以及local design的积累;
12.创建项目和测试计划;
13.制作并导入数据结构;
14.建立点对点边界模型;
15.建立响应模型;
16.模型的检查和改善。
一.从柴油项目中加载模型
下面演示了使用在柴油案例分析中的模块产生的发动机数据。输入变量为MAINSOI(主喷提前角)、SPEED(转速)、BASEFUELMASS(喷油量)、FUELPRESS(燃油压力)、VGTPOS(可变截面增压器位置)、EGRPOS(EGR位置)。示例如下:
DieselProject =
mbcmodel.LoadProject(fullfile(mbcpath,'mbctraining','Diesel_project.mat')); % Store the models in a structure for
convenience DieselResponses = DieselProject.Testplans.Responses;
Models.BTQ = DieselResponses(1);
Models.VGTSPEED = DieselResponses(2);
Models.EQREXH = DieselResponses(3);
Models.PEAKPRESS = DieselResponses(4);
Models.NOX = DieselResponses(6);
Models.EGRMF = DieselResponses(7);
二.为点对点模型定义输入并创建Local Model
工况点变量为转速(SPEED)和制动扭矩(BTQ)。
本地输入(local
inputs)是主喷提前角(MAINSOI)、燃油压力(DUELPRESS)、可变截面涡轮增压器执行器位置(VGTPOS)以及废气再循环阀位置(EGRPOS)。示例如下:
OperatingPointInputs = mbcmodel.modelinput('Symbol',{'SPEED','BTQ'},...
'Name',{'SPEED','BTQ'},...
'Units',{'rpm','Nm'},...
'Range',{[1600 2200],[0 1600]});
LocalInputs = mbcmodel.modelinput('Symbol',{'MAINSOI','FUELPRESS','VGTPOS','EGRPOS'},...
'Name',{'MAINSOI','FUELPRESS','VGTPOS','EGRPOS'},...
'Units',{'deg','MPa','ratio','mm'},...
'Range',{[-9 3],[90 160],[0.2 0.9],[0.5 5]});
% Create a local multiple model
L = mbcmodel.CreateModel('Local Multiple Models',LocalInputs);
% Select the best model using the AICc statistic.
L.Properties.SelectionStatistic = 'AICc';
三.定义发动机工况点
工况点的设计为七工况点驾驶循环。示例如下:
Xg = [2200.0 1263.0
2200.0 947.0
2200.0 632.0
2200.0 126.0
1600.0 1550.0
1600.0 1163.0
1600.0 775.0];
OperatingPointDesign = CreateDesign(OperatingPointInputs);
OperatingPointDesign.Points = Xg;
OperatingPointDesign.Name = 'Drive cycle';
四.为每一个工况点创建local Design
对每一个工况点,为主喷提前角、燃油压力和VGT位置调整其限制值并产生一个128点的Sobol序列方案。示例如下:
localDesign = CreateDesign(LocalInputs,'Type','Sobol Sequence');
localDesignGenerator = localDesign.Generator;
NumLocalPoints = 128;
localDesignGenerator.NumberOfPoints = NumLocalPoints;
DList = mbcdoe.design.empty( 0, 1);
data = [];
for i=1:OperatingPointDesign.NumberOfPoints;
OperatingPoint = OperatingPointDesign.Points(i,:);
speed = OperatingPoint(1);
TQDemand = OperatingPoint(2);
五.根据工况点对Local Design进行命名
localDesign.Name = sprintf('Test - (%s=%4.0f,%s=%3.0f)', i,...
OperatingPointInputs(1).Symbol,OperatingPoint(1),....
OperatingPointInputs(2).Symbol,OperatingPoint(2));
六.根据转速为本地输入(Local Inputs)设定限制值
当你使用界限功能去指定输入的范围时,就正好可以产生一个与LocalPoints点数量一致的Sobol设计。示例如下:
f = (speed-1600)/(2200-1600);
% The main soi range varies from [-3,3] at 1600 rpm to
% [-9,-3] at 2200 rpm.
localDesignGenerator.Limits(1,:) = (1-f)*[-3,3] + f*[-9,-3];
% The fuel pressure range varies from [90,130] at 1600 rpm to
% [120,160] at 2200 rpm.
localDesignGenerator.Limits(2,:) = (1-f)*[90 120] + f*[110,160];
% The VGTPOS range varies from [0.2,0.4] at 1600 rpm to
% [0.6,0.9] at 2200 rpm.
localDesignGenerator.Limits(3,:) = (1-f)*[0.2 0.4] + f*[0.6 0.9];
% set design properties and generate local design
localDesign.Generator = localDesignGenerator;
七.为Local Design收集发动机数据
为local
design找出每个工况点下获得需求扭矩的燃油消耗量。示例如下:
[Xlocal,XTS] = mbcSolveTQ(Models,localDesign.Points,speed,TQDemand);
八.需要的话进行扩大化设计
在运行过128点DOE(Design of
experiment)之后检查收集的工况点是否足够。需要的话,可以通过顺序中下一批N个点进行Sobol序列的扩大化以收集额外的工况点。示例如下:
N = NumLocalPoints;
count = 1;
while size(Xlocal,1) < NumLocalPoints*0.75 && count<10
localDesign = Generate(localDesign,...
'Skip',N,...
'NumberOfPoints',N);
N = N*2;
% Find the fuel required to obtain the demanded torque for each point in
% the augmented local design
[Xlocalaug,XTSaug] = mbcSolveTQ(Models,localDesign.Points,speed,TQDemand);
Xlocal = [Xlocal; Xlocalaug]; %#ok
XTS = [XTS; XTSaug]; %#ok
end
% Update points in the local design
localDesign.Points = Xlocal;
fprintf('%s: %d points\n',localDesign.Name,localDesign.NumberOfPoints);
九.收集响应数据
从柴油机案例研究模型中计算响应数据,示例如下:
BTQ = TQDemand*ones(size(Xlocal,1),1);
AFR = 14.46./Models.EQREXH.PredictedValue(XTS);
EGRMF = Models.EGRMF.PredictedValue(XTS);
BSNOX = 3600*Models.NOX.PredictedValue(XTS)/159.5573;
PEAKPRESS = Models.PEAKPRESS.PredictedValue(XTS)/1e6;
VGTSPEED = Models.VGTSPEED.PredictedValue(XTS);
BSFC = 5400.*XTS(:,3)./(BTQ*pi);
十.对比油耗(BSFC)进行监督
检查其均方根误差,使其小于2,即 RMSE < 2,示例如下:
[stats,Lbsfc] = Fit(L,Xlocal,BSFC);
if stats(5)>2
fprintf('Poor fit for test %d.\n',i)
end
十一.积累数据并进行Local Design
你可以确保试验通过定义一个变量“logno”进行自动定义。示例如下:
data = [data ; Xlocal XTS(:,2:3) BTQ BSFC AFR EGRMF BSNOX PEAKPRESS VGTSPEED i*ones(size(Xlocal,1),1)]; %#ok
DList(i) = localDesign;
end
十二.创建项目和测试计划
创建一个mbc模块项目和建立模型,示例如下:
project = mbcmodel.CreateProject('DieselPointByPoint');
% Create test plan
TP = CreateTestplan( project, {LocalInputs,OperatingPointInputs} );
TP.Name = 'Point-by-point';
% Assign list of local designs to test plan
TP.Designs{1} = DList;
% Set as best design in test plan
TP.BestDesign{2} = OperatingPointDesign;
十三.构建并导入数据结构
D = project.CreateData();
s = D.ExportToMBCDataStructure;
s.varNames = {LocalInputs.Name 'SPEED', 'MAINFUEL','BTQ' 'BSFC' 'AFR' 'EGRMF' 'BSNOX' 'PEAKPRESS' 'VGTSPEED','logno'};
s.varUnits = {'deg','MPa','mm','ratio','rpm','mg/stroke','Nm','g/kWhr','ratio','ratio','g/kWhr','MPa','rpm',''};
s.data = data;
D.BeginEdit;
D.ImportFromMBCDataStructure(s);
D.CommitEdit;
TP.AttachData(D);
十四.建立点对点边界模型
为本地边界使用凸包方法进行建立。示例如下:
B = TP.Boundary.Local.CreateBoundary('Point-by-point');
B.LocalModel = CreateBoundary(B.LocalModel,'Convex hull');
% Add point-by-point boundary model to project.
TP.Boundary.Local.Add(B);
十五.构建响应模型
使用本地多点模型和非全局模型进行构建,示例如下:
Responses = {'BSFC','BSNOX','AFR','EGRMF','PEAKPRESS','VGTSPEED','MAINFUEL'};
for i=1:length(Responses)
TP.CreateResponse(Responses{i},L,[]);
end
十六.检查并重新优化模型
最后,你必须形象化的检查合适的模块已确定这个模块的质量可以被人接受。一般你需要识别和去除离群值。你可以使用命令行绘制诊断并去除离群值,但是在Mobel-Based
Calibration工具箱中的模型阅读器(mbcmodel)使用图解法和统计工具是更为简便的方法。
在你转载一个项目到模块阅读器中时,你必须先保存项目到一个文件中去。如下所示:
project.Save('DieselPointByPoint.mat');
mbcmodel('DieselPointByPoint.mat')
这样我们就使用Matlab中的MBC工具箱建立了柴油发动机的点对点模型的初步建立,模型的建立可以为标定工作做很大的简化,当然模型的建立和实际的情况总是有或多或少的出入,还需要读者在运用的过程中勤动脑想一想怎么在模型中最大程度的模拟出现实状况。