Подходящие сглаженные поверхности, чтобы исследовать топливную экономичность

В этом примере показано, как использовать Curve Fitting Toolbox™, чтобы соответствовать, ответ появляются к некоторым автомобильным данным, чтобы исследовать топливную экономичность.

Тулбокс обеспечивает выборочные данные, сгенерированные из прогнозирующей модели двигателя внутреннего сгорания GTPOWER. Модель эмулирует естественно произнесенное с придыханием воспламенение искры, 2 литра, встроенный механизм с 4 цилиндрами. Можно соответствовать сглаженным поверхностям lowess к этим данным, чтобы найти минимальный расход топлива.

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

  • Скорость находится в модулях оборотов в минуту (об/мин).

  • Загрузка является нормированной цилиндрической массой воздуха (отношение цилиндра aircharge к максимуму естественно произнесло с придыханием цилиндр aircharge при стандартной температуре и давлении).

  • BSFC является специфичным для тормоза расходом топлива в g/KWh. Таким образом, энергия втекают, разделенные на механическую энергию (топливная экономичность).

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

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

Загрузите данные из электронной таблицы XLS. Используйте 'basic' опция команды для non-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. Исследуйте заполненный блок Lookup Table.