Этот пример показывает, как использовать 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. Создайте модель с 2D блоком Lookup Table.
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.