Точечное моделирование для дизельного Engine

В этом примере показано, как использовать функциональность командной строки Model-Based Calibration Toolbox™ для проектов моделирования двигателя «точка за точкой».

Дизельные двигатели с несколькими впрысками и бензиновые двигатели с прямым впрыском часто могут быть смоделированы только с помощью точечных моделей. Можно использовать модели «точка за точкой», чтобы создать модель в каждой рабочей точке двигателя с необходимой точностью, чтобы получить оптимальную калибровку. Функциональность командной строки «точка за точкой» необходима, чтобы справиться со сложностью разработки проектов для каждой рабочей точки.

Зачем необходимы модели «точка за точкой»? Приводы и датчики Engine постоянно добавляются в системы управления Engine (EMS) в ответ на постоянно увеличивающиеся выбросы двигателя, экономию топлива и требования к эффективности. В некоторых случаях оптимальные процессы разработки калибровки двигателя, которые основаны на двухэтапном моделировании, могут больше не иметь возможности моделировать характеристики производительности двигателя с достаточной точностью в рабочей области значений двигателя. Модели «точка за точкой» могут обеспечить необходимую точность модели в измеренных рабочих точках. Однако модели «точка за точкой» не обеспечивают предполагаемые отклики в других рабочих точках.

Этот пример использует двухэтапные модели, сгенерированные в примере дизельного топлива, в качестве суррогата для динамометра двигателя или модели двигателя CAE, в порядок чтобы сгенерировать данные по точкам для этого примера. Пример показывает, как:

  • Сгенерируйте локальные проекты в каждой рабочей точке. Если может быть собрано недостаточно точек проекта, можно расширить локальный проект с помощью последовательностей Соболь.

  • Создайте локальные несколько моделей, чтобы смоделировать каждую из реакций в каждой рабочей точке.

  • Создайте модель контура по точкам, чтобы задать контур данных в каждой рабочей точке для дальнейшего использования в оптимизации калибровки.

Наконец, вы должны визуально проверить подобранные модели, чтобы убедиться, что качество модели приемлемо. Обычно необходимо идентифицировать и удалить выбросы. Можно использовать командную строку, чтобы построить график диагностики и удалить выбросы, но легче использовать графические и статистические инструменты в Model Browser (mbcmodel), представленные в Основанном на модели Toolbox калибровке.

Загрузка моделей из дизельного проекта

Этот пример использует данные двигателя, сгенерированные из моделей в примере дизельного топлива.

Входами являются 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';

Задайте рабочие точки Engine

Проект для рабочих точек является 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, и сгенерируйте проект Соболь на 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));

Настройте пределы в зависимости от скорости для локальных входов

Когда вы используете свойство Limits, чтобы задать входную область значений, вы генерируете проект Соболь с точками 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;

Сбор данных Engine для локального проекта

Найдите топливо, необходимое для получения требуемого крутящего момента для каждой точки в местном проекте

    [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);

Проверяйте подгонку для BSFC

Проверяйте 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;
end

Создайте проект и План тестирования

Create 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

Смотрите и уточните модели

Наконец, вы должны визуально проверить подобранные модели, чтобы убедиться, что качество модели приемлемо. Обычно необходимо идентифицировать и удалить выбросы. Можно использовать командную строку, чтобы построить график диагностики и удалить выбросы, но легче использовать графические и статистические инструменты в Model Browser (mbcmodel), представленные в Основанном на модели Toolbox калибровке.

Перед загрузкой проекта в Model Browser его необходимо сохранить в файл.

project.Save('DieselPointByPoint.mat');
mbcmodel('DieselPointByPoint.mat')

Похожие темы