滑らかな曲面での近似による燃料効率の調査
この例では、Curve Fitting Toolbox™ を使用して応答曲面を自動車のデータに当てはめ、燃料効率を調査する方法を示します。
ツールボックスには、GTPOWER の予測燃焼エンジン モデルから生成されたサンプル データが用意されています。このモデルは、自然吸気火花点火方式の 2 リットル直列 4 気筒エンジンをエミュレートしています。滑らかな lowess 曲面をこのデータに当てはめ、最小の燃料消費量を求めることができます。
このデータセットには応答曲面をモデル化するために必要な変数が含まれています。
速度は毎分回転数 (rpm) 単位です。
負荷は、正規化された気筒空気質量 (標準の温度および圧力での気筒吸気量と最大自然吸気気筒吸気量の比) です。
BSFC は正味燃料消費率 (g/KWh) です。つまり、エネルギーの流れを機械出力で割ったもの (燃料効率) です。
目的は、応答曲面をモデル化し、速度と負荷の関数として最小の BSFC を求めることです。この曲面はテーブルとして使用することができ、モーターとエンジンを組み合わせて使用するハイブリッド自動車の最適化アルゴリズムの一部として含まれています。できるだけ優れた燃料効率でエンジンを運転するために、このテーブルにより BSFC の椀状曲面の底部近くでエンジンを運転しなければなりません。
データの読み込みと前処理
XLS スプレッドシートからデータを読み込みます。Windows® 以外のプラットフォームでは 'basic'
コマンド オプションを使用します。
すべての数値データを 1 つの配列にもつ変数 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
新しい近似をプロットします。排除した点は赤い X 印としてプロットされていることに注意してください。
plot( f2, [Speed, Load], minBSFC, 'Exclude', out ); xlabel( 'Speed [RPM]' ); ylabel( 'Load [%]' ); zlabel( 'Minimum BSFC [g/Kwh]' );
表示の拡大
関心のある z 軸の部分を拡大します。
zlim([0, max( minBSFC )])
エンジンを効率的に運転することが目標であるため、等高線図を作成し、BSFC が小さい領域を確認します。関数 plot を使用し、パラメーターの名前と値のペア '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 )
Lookup Table ブロックの作成
Simulink® ソフトウェアがインストールされている場合は、以下のようにして Lookup Table ブロックを作成できます。以下のコードを実行して試してください。
1.2-D Lookup Table ブロックを作成します。
simulink new_system( 'my_model' ) open_system( 'my_model' ) add_block( 'simulink/Lookup Tables/2-D Lookup Table', 'my_model/surfaceblock' )
2.この Lookup Table に速度ブレークポイント、負荷ブレークポイント、ルックアップ テーブルを入力します。
set_param( 'my_model/surfaceblock',... 'BreakpointsForDimension1', 'loadbreakpoints',... 'BreakpointsForDimension2', 'speedbreakpoints',... 'Table', 'tBSFC' );
3.入力した Lookup Table ブロックを確認します。