В этом примере показано, как использовать 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. Проверьте заполненный блок таблицы подстановки.