# findBDK

カルマンゲインおよび離散時間システムの B, D システム行列

## 呼び出し手順

    [B,D,K] = findBDK(S,N,L,R,A,C,METH,JOB,NSMPL,TOL,PRINTW)
                [B,D,RCND] = findBDK(S,N,L,R,A,C,METH,JOB)
                [B,D,K,Q,Ry,S,RCND] = findBDK(S,N,L,R,A,C,METH,JOB,NSMPL,TOL,PRINTW)

## パラメータs

S

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

N

  整数

L

  整数

R

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

A

  正方行列

C

  行列

METH

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

  = 1

    過去の入力と出力を指定するMOESP法;

  = 2

    N4SID 法;

  デフォルト: METH = 2.

JOB

  計算するシステム行列の種類を指定するオプション:

  = 1

    B行列を計算;

  = 2

    BおよびD行列を計算.

  デフォルト: JOB = 2.

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

  長さ12のベクトルで, ランク決定, 最小二乗またはリカッチ方程式の解に関わる行列の条件数の逆数が含まれます.

## 説明

システムの次数,行列AおよびCおよび関連する 結合ブロックハンケル行列のR因子を指定すると, 部分空間同定法 (MOESP または N4SID) により, 離散時間システムのシステム行列BおよびDとカルマンゲインを返します.

- [B,D,K] = findBDK(S,N,L,R,A,C,METH,JOB,NSMPL,TOL,PRINTW) は, システム行列 B (JOB = 1の場合), システム行列 BおよびD (JOB = 2の場合), カルマン予測ゲイン 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のベクトルです.

- [B,D,RCND] = findBDK(S,N,L,R,A,C,METH,JOB) は, 長さ 4 のベクトル RCND も返します. このベクトルには,ランク決定に関連する条件数の逆数が含まれます.

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

findR により計算される行列 Rは, 適当な引数 METH および JOBDで定義されます. findR ではMETH = 1かつJOBD = 1,findBDKではMETH = 1を使用しますす. FINDR では METH = 1, findBDK では METH = 2 を使用することができます.

出力引数の数は変換しますが,次のように入力引数に対応します,

             B = findBDK(S,N,L,R,A,C,METH,1)  または
         [B,D] = findBDK(S,N,L,R,A,C,METH,2)  または
    [B,D,RCND] = findBDK(S,N,L,R,A,C,METH,2)

## 例

    //指定した線形システムからデータを生成
    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;L=1;
    [R,N,SVAL] = findR(S,Y',U');

    N=3;
    METH=3;TOL=-1;
    [A,C] = findAC(S,N,L,R,METH,TOL);
    [B,D,K] = findBDK(S,N,L,R,A,C);
    SYS1=syslin(1,A,B,C,D);

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

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

## 参照

- findABCD
- findAC
- findBD
- findR
- sorder
- sident