Main Content

滑らかな曲面での近似による燃料効率の調査

この例では、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 からエクスポートすると役に立ちます。エクスポートする前に、最初の行と最初の列にブレークポイント値が含まれる table 配列を作成します。次のコマンドは、データを次のテーブル形式に再形成します。

  • 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 ブロックを確認します。