最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

カスタムの説明変数を含む非線形 ARX モデル

この例では、単入力/単出力 (SISO) システムや多入力/多出力 (MIMO) システムなどの非線形 ARX (IDNLARX) モデルでカスタムの説明変数を使用する方法を説明します。

はじめに

DNLARX モデルでは、各出力が説明変数の関数となります。説明変数は、過去の入力および出力を変換したものです。一般的な説明変数は、遅延入力または出力変数です。これらは、STANDARD REGRESSORS (標準の説明変数) と呼ばれます。また、遅延入力および出力変数の任意のユーザー定義関数という形式で、より高度な説明変数を使用することもできます。このような説明変数は、CUSTOM REGRESSORS (カスタムの説明変数) と呼ばれます。

電圧 V と電流 I を入力としてもつ電気系統を例として考えてみます。電力が電気系統の重要な数値を占める場合、カスタムの説明変数 V*I を作成する方が理にかなっています。標準の説明変数だけを使用するよりも、適切に定義したカスタムの説明変数を使用した方が効率が良い場合があります。

SISO の例: 内燃エンジンのモデル化

ファイル icEngine.mat には、サンプリング レート 0.04 秒で収集した 1500 の入力/出力サンプルによる 1 つのデータが含まれます。入力 u(t) は、By-Pass Idle Air Valve (BPAV) を制御する電圧 [V] で、出力 y(t) は、エンジン速度 [RPM/100] です。データを読み込み、モデル推定用の データセット ze と、モデル検証用のデータセット zv に分割します。

load icEngine
z = iddata(y,u, 0.04);
ze = z(1:1000);
zv = z(1001:1500);

モデル次数

モデル次数 [na nb nk] は、線形 ARX モデルでも使用され、標準の説明変数を簡単に定義できます。モデル次数を選択するには、試行錯誤が必要となります。この例では、[na nb nk] = [4 2 10] を使用します。これは、標準の説明変数 y(t-1)、y(t-2)、y(t-3)、y(t-4)、u(t-10)、u(t-11) に対応します。

まず、標準の説明変数だけで試します。LINEAR 推定器を使用するため、得られるモデルは線形 ARX モデルと類似します。

m0 = nlarx(ze, [4 2 10], linear);

このモデルの入力名、出力名、および説明変数リストを以下に示します。既定の名前 'u1'、'y1' が使用されています。

m0.InputName
m0.OutputName
getreg(m0)
ans =

  1x1 cell array

    {'u1'}


ans =

  1x1 cell array

    {'y1'}

Regressors:
    y1(t-1)
    y1(t-2)
    y1(t-3)
    y1(t-4)
    u1(t-10)
    u1(t-11)

文字ベクトルで定義されるシンプルな説明変数

シンプルなカスタムの説明変数は、以下の例のように、文字ベクトル形式で作成できます。

m1 = nlarx(ze, [4 2 10], linear, 'customreg', {'u1(t-10)^2', 'y1(t-1)^2'});

標準およびカスタム両方を合わせたすべての説明変数リストは、GETREG で返されます。

getreg(m1)
Regressors:
    y1(t-1)
    y1(t-2)
    y1(t-3)
    y1(t-4)
    u1(t-10)
    u1(t-11)
    u1(t-10)^2
    y1(t-1)^2

検証データセット zv で 2 つのモデルを比較します。

compare(zv,m0,m1)

カスタムの説明変数は、必ずしも標準の説明変数リストの中からではなく、過去の入力および出力変数から定義できます。以下の例では、標準の説明変数はありません。

m2 = nlarx(ze, [0 0 0], 'linear', 'customreg', ...
           {'u1(t-10)^3', 'u1(t-11)^3', 'y1(t-1)', 'sin(y1(t-4))'});
getreg(m2)
Regressors:
    u1(t-10)^3
    u1(t-11)^3
    y1(t-1)
    sin(y1(t-4))

多項式の説明変数

多項式の説明変数は、コマンド POLYREG を使って簡単に作成できます。

m3 = nlarx(ze, [4 2 10], 'lin');
pr = polyreg(m3, 'maxpower', 2, 'crossterm', 'off');
m3 = addreg(m3, pr);
m3 = nlarx(ze, m3);

getreg(m3)
Regressors:
    y1(t-1)
    y1(t-2)
    y1(t-3)
    y1(t-4)
    u1(t-10)
    u1(t-11)
    y1(t-1).^2
    y1(t-2).^2
    y1(t-3).^2
    y1(t-4).^2
    u1(t-10).^2
    u1(t-11).^2

カスタムの説明変数のオブジェクト コンストラクター

シンプルなカスタムの説明変数を作成するには、文字ベクトル形式を使用するのが便利です。カスタムの説明変数のオブジェクト コンストラクターは、任意の説明変数を作成する場合のよりパワフルな方法です。

以下の例では、説明変数は、変数名 'u1' および遅延サンプル 10 の cos 関数として作成しています。すなわち、r1 = cos(u1(t-10))最後の入力引数の論理値は、このカスタムの説明変数がベクトル化されているかどうかを示します。ベクトル化された説明変数は、計算時間が速くてすみますが、最初の入力引数で示される関数に注意が必要です。

r1 = customreg(@cos, 'u1', 10, true)
Custom Regressor:
Expression: cos(u1(t-10))
        Function: @cos
       Arguments: {'u1'}
          Delays: 10
      Vectorized: 1
    TimeVariable: 't'

この例では、3 つの変数が含まれています。ベクトル化説明変数では、演算子が "*" ではなく ".*" となります。

F = @(x1,x2,x3)sin(x1.*x2+x3); % Anonymous function
r2 = customreg(F, {'y1', 'u1', 'u1'}, [1 10 11], true)
Custom Regressor:
Expression: sin(y1(t-1).*u1(t-10)+u1(t-11))
        Function: @(x1,x2,x3)sin(x1.*x2+x3)
       Arguments: {'y1'  'u1'  'u1'}
          Delays: [1 10 11]
      Vectorized: 1
    TimeVariable: 't'

作成した 2 つのカスタムの説明変数は、IDNLARX モデルで使用できます。

m4 = nlarx(ze, [4 2 10], 'lin', 'customreg',  [r1;r2]);
getreg(m4)
Regressors:
    y1(t-1)
    y1(t-2)
    y1(t-3)
    y1(t-4)
    u1(t-10)
    u1(t-11)
    cos(u1(t-10))
    sin(y1(t-1).*u1(t-10)+u1(t-11))

非線形推定器とカスタムの説明変数の使用

一般に、カスタムの説明変数には、前述の例のように LINEAR 推定器を使用します。また、非線形推定器を適用することもできます。

m5 = nlarx(ze, [4 2 10], 'wavenet', 'customreg',  [r1;r2]);
getreg(m5)
Regressors:
    y1(t-1)
    y1(t-2)
    y1(t-3)
    y1(t-4)
    u1(t-10)
    u1(t-11)
    cos(u1(t-10))
    sin(y1(t-1).*u1(t-10)+u1(t-11))

カスタムの説明変数は通常、非線形であるため、カスタムの説明変数に非線形推定器を適用すると、非線形が重複することになります。このような重複を回避するため、標準の説明変数だけを非線形に指定し、IDNLARX モデルの非線形ブロックからカスタムの説明変数を排除できます。

m6 = nlarx(ze, [4 2 10], 'wavenet', 'customreg',  [r1;r2], 'nlreg', 'standard');
m6.nlreg % Indices of nonlinear regressors in the following list.
getreg(m6)
ans =

     1     2     3     4     5     6

Regressors:
    y1(t-1)
    y1(t-2)
    y1(t-3)
    y1(t-4)
    u1(t-10)
    u1(t-11)
    cos(u1(t-10))
    sin(y1(t-1).*u1(t-10)+u1(t-11))

さまざまなモデルを一緒に比較できます (ただし、時間がかかります)。

compare(zv, m1,m2,m3,m4,m5,m6)

MIMO の例: モーター付きカメラのモデル化

ファイル motorizedcamera.mat には、サンプリング レート 0.02 秒でモーター付きカメラから収集した 188 データ サンプルによる 1 つのデータが含まれます。入力ベクトル u(t) は 6 つの変数で構成されます。これらの変数とは、カメラに固定された直交 X-Y-Z 座標系の 3 つの変換速度成分 [m/s] と、X-Y-Z 軸周りの 3 つの回転速度成分 [rad/s] です。出力ベクトル y(t) は 2 つの変数を含みます。これらの変数は、3D 空間の固定カメラ ポイントから取得したイメージによるポイントの位置 (ピクセル単位) です。IDDATA オブジェクト z を作成し、ロードしたデータを保持します。

load motorizedcamera
z = iddata(y, u, 0.02, 'Name', 'Motorized Camera', 'TimeUnit', 's');

MIMO でカスタムの説明変数を使用するのは、SISO の場合とあまり違いはありません。各出力には、それぞれのカスタムの説明変数があることを理解しておく必要があります。すべての出力のカスタムの説明変数は、MIMO IDNLARX モデルに投入される前に、cell 配列に挿入されます。

文字ベクトル形式を使用する場合、カスタムの説明変数は ny 行 1 列の文字ベクトルの cell 配列として与えられます。ここで ny はモデルの出力の数です。

nanbnk = [ones(2,2), 2*ones(2,6), ones(2,6)];
m11 = nlarx(z, nanbnk, 'lin', 'customreg', ...
      {{'u1(t-1)^2', 'y2(t-1)^3'};{'u5(t-1)*u6(t-1)'}});

カスタムの説明変数のコンストラクターも使用できます。以下の説明変数は文字ベクトル形式で作成した前述の例と同じですが、これらの説明変数は、カスタムの説明変数のコンストラクターでベクトル化できる点が異なります。

F1 = @(x)x.^2;
r1 = customreg(F1, 'u1', 1, true);
F2 = @(x)x.^3;
r2 = customreg(F2, 'y2', 1, true);
F3 = @(x1,x2)x1.*x2;
r3 = customreg(F3, {'u5','u6'}, [1 1], true);

m12 = nlarx(z, nanbnk, 'lin', 'customreg', {[r1; r2], r3});

2 つのモデルの数値が同じかどうかは、これらのデータを比較して確認できます。

compare(z,m11,m12)

その他の情報

System Identification Toolbox™ を使った動的システムの同定の詳細については、System Identification Toolbox 製品の情報ページを参照してください。