# findABCD

離散時間システムの部分空間の同定

## 呼出し手順

    [SYS,K] = findABCD(S,N,L,R,METH,NSMPL,TOL,PRINTW)
                SYS = findABCD(S,N,L,R,METH)

                [SYS,K,Q,Ry,S,RCND] = findABCD(S,N,L,R,METH,NSMPL,TOL,PRINTW)
                [SYS,RCND] = findABCD(S,N,L,R,METH)

## パラメータ

S

  整数,ブロックハンケル行列のブロック行の数

N

  整数, システム次数

L

  整数, 出力の数

R

  行列, findrをコールすることにより計算される結合されたブロックハンケル行列 のR因子に関連.

METH

  整数, 使用方法に関するオプション

  = 1

    過去の入出力を用いるMOESP法;

  = 2

    N4SID 法;

  = 3

    複合法: A と C は MOESP, B と D は N4SIDによる.

  デフォルト: METH = 3.

NSMPL

  整数, 共分散およびカルマン予測ゲインを計算するために使用されるサンプルの総数. 共分散およびカルマン予測ゲインを必要としない場合,このパラメータは不要です. NSMPL = 0の場合, K, Q, Ry, および S は計算されません. デフォルト: NSMPL = 0.

TOL

  行列のランクを推定するために使用される許容誤差. TOL > 0 の場合, 指定した値 TOLが 条件数の逆数の下界として使用されます. デフォルト: prod(size(matrix))*epsilon_machine ただし, epsilon_machine は相対機械精度です.

PRINTW

  整数, 警告メッセージを印字するためのスイッチ.

  PRINTW

    = 1: 警告メッセージを出力;

  PRINTW

    = 0: 警告メッセージを出力しない.

  デフォルト: PRINTW = 0.

SYS

  状態空間実現 SYS = (A,B,C,D) (syslin オブジェクト)を計算します

K

  カルマン推定器ゲイン K (NSMPL > 0の場合)

Q

  状態共分散

Ry

  出力共分散

S

  状態出力相互共分散

RCND

  ランク決定, 最小二乗またはリカッチ方程式の解に関わる行列の条件数の 逆数のベクトル

## 説明

システム行列および離散時間システムのカルマンゲインを見つけます. この際,システム次元および 部分空間同定技術(MOESPまたはN4SID)を用いて 結合されたブロックハンケル行列のR因子の要部を指定します.

- [SYS,K] = findABCD(S,N,L,R,METH,NSMPL,TOL,PRINTW) は,状態空間実現 SYS = (A,B,C,D) (ssオブジェクト) およびカルマン予測子ゲイン K (NSMPL > 0の場合) を計算します. モデルの構造は次のようになります:

      x(k+1) = Ax(k) + Bu(k) + Ke(k),   k >= 1,
      y(k)   = Cx(k) + Du(k) + e(k),

  ただし,x(k) および y(k)はそれぞれ長さNおよびLのベクトルです.

- [SYS,K,Q,Ry,S,RCND] = findABCD(S,N,L,R,METH,NSMPL,TOL,PRINTW) は, 状態量, 出力および(カルマンゲイン計算に使用される)状態出力 (相互)共分散行列 Q, Ry, S を ランク決定,最小二乗またはリカッチ方程式の解に使用される行列の条件数の逆数を含む 長さ lr のベクトル RCND と共に返します. ただし,

    lr = 4  (カルマンゲイン行列 K が必要ない場合),
    lr = 12 (カルマンゲイン行列 K が必要な場合).

行列RはfindRにより計算され,適当な 引数 METH および JOBDにより定義されます. findABCD で METH = 1 を指定した場合, findR で METH = 1 かつ JOBD = 1, findABCD で METH = 3 を指定した場合, findR で METH = 1 を使用する必要があります.

## 例

    // 指定した線形システムからデータを生成
    A = [ 0.5, 0.1,-0.1, 0.2;
          0.1, 0,  -0.1,-0.1;
         -0.4,-0.6,-0.7,-0.1;
          0.8, 0,  -0.6,-0.6];
    B = [0.8;0.1;1;-1];
    C = [1 2 -1 0];
    SYS=syslin(0.1,A,B,C);
    nsmp=100;
    U=prbs_a(nsmp,nsmp/5);
    Y=(flts(U,SYS)+0.3*rand(1,nsmp,'normal'));

    // Rを計算
    S=15;
    [R,N1,SVAL] = findR(S,Y',U');
    N=3;
    SYS1 = findABCD(S,N,1,R) ;SYS1.dt=0.1;

    SYS1.X0 = inistate(SYS1,Y',U');

    Y1=flts(U,SYS1);
    clf();plot2d((1:nsmp)',[Y',Y1'])

## 参照

- findAC
- findBD
- findBDK
- findR
- sorder
- sident