exponenta event banner

Подгонка гладких поверхностей для исследования топливной эффективности

В этом примере показано, как использовать Toolbox™ «Фитинг кривой» (Curve Fitting) для подгонки поверхности отклика к некоторым автомобильным данным для исследования топливной эффективности.

Инструментарий предоставляет образцы данных, сгенерированных из модели двигателя внутреннего сгорания с предсказанием GTPOWER. Модель эмулирует естественно атмосферный искровой, 2-литровый, рядный 4-цилиндровый двигатель. Для определения минимального расхода топлива к этим данным можно подогнать гладкие поверхности с низким содержанием топлива.

Набор данных включает в себя переменные, необходимые для моделирования поверхностей отклика:

  • Частота вращения - в оборотах в минуту (об/мин).

  • Нагрузка - нормированная воздушная масса цилиндра (отношение воздушного заряда цилиндра к максимальному естественному атмосферному воздушному заряду цилиндра при стандартных температуре и давлении).

  • BSFC - удельный расход топлива при торможении в г/кВт· ч. То есть поток энергии в, деленный на механическую мощность (топливный КПД).

Цель состоит в моделировании поверхности отклика для определения минимального значения BSFC в зависимости от скорости и нагрузки. Эту поверхность можно использовать как таблицу, включенную как часть алгоритма оптимизации гибридного транспортного средства, сочетающего использование двигателя и двигателя. Чтобы работать с двигателем как можно более эффективно, стол должен работать с двигателем в нижней части чаши BSFC.

Загрузка и предварительная обработка данных

Загрузите данные из электронной таблицы XLS. Используйте 'basic' параметр команды для платформ, отличных от Windows ®.

Создание переменной n содержит все числовые данные в одном массиве.

n = xlsread( 'Engine_Data_SI_NA_2L_I4.xls', 'SI NA 2L I4', '', 'basic' );

Извлечь из переменной n столбцы, представляющие интерес.

SPEED = n(:,2);
LOAD_CMD = n(:,3);
LOAD = n(:,8);
BSFC = n(:,22);

Обработайте данные перед подгонкой, чтобы выбрать минимальные значения BSFC из каждого сдвига. Точки данных организованы в развертки по скорости/нагрузке.

Получите список сайтов скорости/нагрузки:

SL = unique( [SPEED, LOAD_CMD], 'rows' );
nRuns = size( SL, 1 );

Для каждой площадки скорости/нагрузки найдите данные на площадке и извлеките фактическую измеренную нагрузку и минимальную BSFC.

minBSFC  = zeros( nRuns, 1 );
Load     = zeros( nRuns, 1 );
Speed    = zeros( nRuns, 1 );
for 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) );
end

Подгонка поверхности

Подгоните поверхность топливной экономичности к предварительно обработанным данным.

f1 = fit( [Speed, Load], minBSFC, 'Lowess', 'Normalize', 'on' )
     Locally weighted smoothing linear regression:
       f1(x,y) = lowess (linear) smoothing regression computed from p
       where x is normalized by mean 3407 and std 1214
       and where y is normalized by mean 0.5173 and std 0.1766
     Coefficients:
       p = coefficient structure

Посадка по графику

plot( f1, [Speed, Load], minBSFC );
xlabel( 'Speed [RPM]' );
ylabel( 'Load [%]' );
zlabel( 'Minimum BSFC [g/Kwh]' );

Удалить проблемные точки

Просмотрите полученный график.

Существуют точки, в которых BSFC отрицателен, поскольку эти данные генерируются при моделировании двигателя.

Удалите эти проблемные точки данных, сохранив точки в диапазоне [0, Inf].

out = excludedata( Speed, minBSFC, 'Range', [0, Inf] );
f2 = fit( [Speed, Load], minBSFC, 'Lowess', ...
    'Normalize', 'on', 'Exclude', out )
     Locally weighted smoothing linear regression:
       f2(x,y) = lowess (linear) smoothing regression computed from p
       where x is normalized by mean 3443 and std 1187
       and where y is normalized by mean 0.521 and std 0.175
     Coefficients:
       p = coefficient structure

Постройте график новой посадки. Обратите внимание, что исключенные точки отображаются как красные кресты.

plot( f2, [Speed, Load], minBSFC, 'Exclude', out );
xlabel( 'Speed [RPM]' );
ylabel( 'Load [%]' );
zlabel( 'Minimum BSFC [g/Kwh]' );

Увеличить

Увеличьте изображение интересующей части оси Z.

zlim([0, max( minBSFC )])

Необходимо эффективно работать с механизмом, поэтому создайте контурный график, чтобы увидеть область, в которой BSFC находится на низком уровне. Используйте функцию печати и укажите пару «имя/значение». 'style','Contour'.

plot( f2, [Speed, Load], minBSFC, 'Exclude', out, 'Style', 'Contour' );
xlabel( 'Speed [RPM]' );
ylabel( 'Load [%]' );
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:end,1:2:end)
ans =

  Columns 1 through 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  264.5167  259.7631  257.9215  256.9350  258.3228  258.6638
  251.5652  247.6746  247.2747  247.4699  247.3570  248.2433  248.8139

  Columns 8 through 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 = 'none';
hold on
mesh( tSpeed, tLoad, tBSFC, ...
    'LineStyle', '-', 'LineWidth', 2, 'EdgeColor', 'k', ...
    'FaceColor', 'none', 'FaceAlpha', 1 );
hold off
xlabel( 'Speed [RPM]' );
ylabel( 'Load [%]' );
zlabel( 'Minimum BSFC [g/Kwh]' );

Проверка точности таблицы

Просмотрите разницу между моделью и таблицей, выведя разницу между ними на более тонкую сетку. Затем используйте это различие в точности прогнозирования между таблицей и моделью, чтобы определить наиболее эффективный размер таблицы для требований к точности.

Следующий код оценивает модель по более тонкой сетке и отображает разницу между моделью и таблицей.

[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, 'linear' );
tfDiff = tfBSFC_model - tfBSFC_table;

surf( tfSpeed, tfLoad, tfDiff, 'LineStyle', 'none'  );
hold on
mesh( tSpeed, tLoad, zeros( size( tBSFC ) ), ...
    'LineStyle', '-', 'LineWidth', 2, 'EdgeColor', 'k', ...
    'FaceColor', 'none', 'FaceAlpha', 1 );
hold off
axis tight
xlabel( 'Speed [RPM]' );
ylabel( 'Load [%]' );
zlabel( 'Difference between model and table [g/Kwh]' );
title( sprintf( 'Max difference: %g', max( abs( tfDiff(:) ) ) ) );

Создание массива таблиц, включающего значения точек останова

После создания таблицы путем оценки посадки модели по сетке точек можно экспортировать данные таблицы из MATLAB. Перед экспортом создайте массив таблиц, содержащий значения точек останова в первой строке и столбце. Следующая команда изменяет форму данных в этот формат таблицы:

  • X (speedbreakpoints) является (1 x M) вектором

  • Y (loadbreakpoints) - вектор (N x 1)

  • Z (tBSFC) является матрицей (M x N)

table = [
    {'Load\Speed'}, num2cell(speedbreakpoints(:).' )
    num2cell(loadbreakpoints (:) ), num2cell( tBSFC )
    ];

Экспорт таблицы в файл электронной таблицы

Вы можете использовать xlswrite для экспорта данных таблицы в новую электронную таблицу Excel. Выполните следующую команду для создания файла электронной таблицы.

xlswrite( 'tabledata.xlsx', table )

Создание блока таблицы подстановки

При наличии Simulink™ программного обеспечения можно создать блок таблицы поиска следующим образом. Выполните следующий код, чтобы опробовать его.

1. Создайте модель с 2-м блоком Справочной таблицы.

simulink
new_system( 'my_model' )
open_system( 'my_model' )
add_block( 'Simulink/Lookup Tables/2-D Lookup Table', 'my_model/surfaceblock' )

2. Заполните таблицу подстановки точками останова скорости, точками останова загрузки и таблицей подстановки.

set_param( 'my_model/surfaceblock',...
    'BreakpointsForDimension1', 'loadbreakpoints',...
    'BreakpointsForDimension2', 'speedbreakpoints',...
    'Table', 'tBSFC' );

3. Проверьте заполненный блок таблицы подстановки.