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