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

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

Тулбокс предоставляет выборочные данные, сгенерированные на основе модели прогнозирующего двигателя сгорания 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™ программа, можно создать блок Look Up Table следующим образом. Выполните следующий код, чтобы опробовать его.

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

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. Исследуйте заполненный блок Интерполяционная таблица.