В этом примере показано, как использовать функции командной строки «Калибровка на основе модели» Toolbox™ для проектов точечного моделирования двигателя.
Дизельные двигатели с множественным впрыском и бензиновые двигатели с прямым впрыском часто могут моделироваться только с помощью точечных моделей. Модели «точка за точкой» можно использовать для построения модели в каждой рабочей точке двигателя с необходимой точностью для обеспечения оптимальной калибровки. Функция командной строки «точка за точкой» необходима для решения сложных задач разработки проектов для каждой операционной точки.
Почему необходимы точечные модели? Приводы двигателя и датчики постоянно добавляются в системы управления двигателем (EMS) в ответ на постоянно растущие выбросы двигателя, экономию топлива и требования к производительности. В некоторых случаях оптимальные процессы разработки калибровки двигателя, основанные на двухэтапном моделировании, могут быть больше не в состоянии моделировать характеристики двигателя с достаточной точностью по всему диапазону работы двигателя. Точечные модели могут обеспечить необходимую точность модели в измеренных рабочих точках. Однако точечные модели не дают оценочных ответов в других операционных точках.
В этом примере двухэтапные модели, созданные в примере дизельного двигателя, используются в качестве суррогата для динамометрического стенда двигателя или модели двигателя CAE, чтобы генерировать точечные данные для этого примера. В примере показано, как:
Создание локальных проектов в каждой рабочей точке. Если точек проектирования недостаточно, можно расширить локальную конструкцию с помощью последовательностей Соболя.
Создайте локальные несколько моделей для моделирования каждого отклика в каждой рабочей точке.
Создайте двухточечную модель границы для определения границы данных в каждой рабочей точке для последующего использования в оптимизации калибровки.
Наконец, необходимо визуально проверить установленные модели, чтобы убедиться, что качество модели приемлемо. Обычно необходимо определить и удалить отклонения. Можно использовать командную строку для печати диагностики и удаления отклонений, но проще использовать графические и статистические инструменты в браузере модели (mbcmodel), представленные на панели инструментов калибровки на основе модели.
В этом примере используются данные двигателя, созданные на основе моделей в примере дизельного топлива.
Входы: MAINSOI, SPEED, BASEFUELMASS, FUELPRESS, VGTPOS, EGRPOS
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);
Переменными рабочих точек являются скорость (SPEED) и тормозной момент (BTQ).
Локальными входами являются основной пуск впрыска (MAINSOI), давление топлива (FUELPRESS), регулируемое положение турбины затвора (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('Point-by-Point',LocalInputs); % Select the best model using the PRESS RMSE statistic. L.Properties.SelectionStatistic = 'PRESS RMSE';
Конструкция рабочих точек - 7-точечный цикл привода.
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';Для каждой рабочей точки отрегулируйте предельные значения для основного впрыска, давления топлива и VGTPOS и создайте конструкцию Sobol на 128 точек.
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);
localDesign.Name = sprintf('Test %2d (%s=%4.0f,%s=%3.0f)', i,... OperatingPointInputs(1).Symbol,OperatingPoint(1),.... OperatingPointInputs(2).Symbol,OperatingPoint(2));
При использовании свойства «Пределы» для задания диапазона ввода создается проект Sobol с точными точками NumLocalPoints.
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;Найти топливо, необходимое для получения требуемого крутящего момента для каждой точки в локальной конструкции
[Xlocal,XTS] = mbcSolveTQ(Models,localDesign.Points,speed,TQDemand);
Убедитесь, что после выполнения 128-точечного DOE было собрано достаточно баллов (дизайн эксперимента). Соберите дополнительные точки, увеличив Последовательность Соболя следующими N точками в последовательности, если это необходимо.
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<AGROW>
XTS = [XTS; XTSaug]; %#ok<AGROW>
end
% Update points in the local design
localDesign.Points = Xlocal;
fprintf('%s: %d points\n',localDesign.Name,localDesign.NumberOfPoints);Test 1 (SPEED=2200,BTQ=1263): 127 points Test 2 (SPEED=2200,BTQ=947): 128 points Test 3 (SPEED=2200,BTQ=632): 128 points Test 4 (SPEED=2200,BTQ=126): 128 points Test 5 (SPEED=1600,BTQ=1550): 116 points Test 6 (SPEED=1600,BTQ=1163): 119 points Test 7 (SPEED=1600,BTQ=775): 128 points
Расчет данных ответа из моделей исследования дизельного топлива
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);Проверить RMSE < 2
[stats,Lbsfc] = Fit(L,Xlocal,BSFC);
if stats(5)>2
fprintf('Poor fit for test %d.\n',i)
endМожно обеспечить автоматическое определение тестов путем определения переменной logno.
data = [data ;
Xlocal XTS(:,2:3) ...
BTQ BSFC AFR EGRMF BSNOX PEAKPRESS VGTSPEED i*ones(size(Xlocal,1),1)]; %#ok<AGROW>
DList(i) = localDesign;
endCreate an mbcmodel project and build models
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Наконец, необходимо визуально проверить установленные модели, чтобы убедиться, что качество модели приемлемо. Обычно необходимо определить и удалить отклонения. Можно использовать командную строку для печати диагностики и удаления отклонений, но проще использовать графические и статистические инструменты в браузере модели (mbcmodel), представленные на панели инструментов калибровки на основе модели.
Перед загрузкой проекта в браузер модели его необходимо сохранить в файл.
project.Save('DieselPointByPoint.mat');
mbcmodel('DieselPointByPoint.mat')