# sident

離散時間状態空間実現およびカルマンゲイン

## 呼出し手順

    [[A,C][,B[,D]][,K,Q,Ry,S][,rcnd]] = sident(meth,job,s,n,l,R[,tol,t,Ai,Ci,printw])

## パラメータ

meth

  使用する手法を定義する整数オプション:

  =

    1 : 過去の入力及び出力によるMOESP法;

  =

    2 : N4SID 法;

  =

    3 : 組み合わせ法: A および C はMOESP, B および D はN4SIDによる.

job

  実行する計算を定義する整数オプション:

  =

    1 : 全てのシステム行列, A, B, C, Dを計算;

  =

    2 : 行列 A および C のみを計算;

  =

    3 : 行列 B のみを計算;

  =

    4 : 行列 B および D のみを計算.

s

  処理された入力及び出力ブロックハンケル行列の ブロック行の数. s > 0.

n

  整数, システムの次数

l

  整数, システム出力の次数

R

  Rの2*(m+l)*s行2*(m+l)*s列の部分には, 結合されたブロックハンケル行列のQR分解による 上三角因子 R が含まれます. システム行列を計算する際にはより詳細な情報が 必要です.

tol

  (オプション) 行列のランクを推定する際に使用される許容誤差. tol > 0の場合, tol に指定した値が 条件数の逆数の下界として使用されます. 推定された条件数が1/tol以下となるm行n列の行列は フルランクとみなされます. デフォルト: m*n*epsilon_machine ただし epsilon_machine は 相対機械精度です.

t

  (オプション) 共分散を計算する際に使用されるサンプルの総数です. t = 0, または t >= 2*(m+l)*s のどちらかです. 共分散行列またはカルマン予測ゲイン行列が不要である場合には, このパラメータは不要です. t = 0の場合,K, Q, Ry, および S は計算されません. デフォルト: t = 0.

Ai

  実数行列

Ci

  実数行列

printw

  (オプション) 警告メッセージの出力に関するスイッチ.

  =

    1: 警告メッセージを出力します;

  =

    0: 警告メッセージを出力しません.

  デフォルト: printw = 0.

A

  実数行列

C

  実数行列

B

  実数行列

D

  実数行列

K

  実数行列, カルマンゲイン

Q

  (オプション) n行n列の半正定値の状態共分散行列で, カルマンゲインを計算する際に状態量の重み行列として使用されます.

RY

  (オプション) l行l列の(半)正定値の出力共分散行列で, カルマンゲインを計算する際に出力の重み行列として使用されます.

S

  (オプション) n行l列の状態-出力相互共分散行列で, カルマンゲインを計算する際にクロス重み行列として使用されます.

rcnd

  (オプション) 長さlrのベクトル, ランク決定,最小二乗,またはリカッチ方程式の解に使用される 行列の条件数の逆数の推定値を含みます. ただし, カルマンゲイン行列が不要ｎ場合, lr = 4 , カルマンゲインが必要な場合には lr = 12 とします.

## 説明

SIDENT 関数は, SLICOT ルーチン IB01BD を用いて, 離散時間状態空間実現 (A,B,C,D) および カルマンゲイン K を計算します.

                  [A,C,B,D] = sident(meth,1,s,n,l,R)
    [A,C,B,D,K,Q,Ry,S,rcnd] = sident(meth,1,s,n,l,R,tol,t)
                      [A,C] = sident(meth,2,s,n,l,R)
                          B = sident(meth,3,s,n,l,R,tol,0,Ai,Ci)
          [B,K,Q,Ry,S,rcnd] = sident(meth,3,s,n,l,R,tol,t,Ai,Ci)
                      [B,D] = sident(meth,4,s,n,l,R,tol,0,Ai,Ci)
        [B,D,K,Q,Ry,S,rcnd] = sident(meth,4,s,n,l,R,tol,t,Ai,Ci)

SIDENT は, システム次数および結合されたブロックハンケル行列の R因子に関連する部分を指定すると, 部分空間同定法(MOESP, N4SID, またはその組み合わせ)により, 状態空間実現 (A,B,C,D)および離散時間システムの カルマン予測ゲイン K を計算します.

モデル構造は以下のようになります :

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

ただし, x(k) は(時刻kにおける) n次元状態ベクトル,

u(k)はm次元入力ベクトル,

y(k) はl次元出力ベクトル,

e(k) はl次元外乱ベクトル,

として A, B, C, D, および K は適当な次元の実数行列です.

## コメント

1. job <= 2の時, n行n列のシステム状態行列 A, およびp行n列 のシステム出力行列 C が計算されます.

2. job <> 2 の時, n行m列のシステム入力行列B が計算されます.

3. job = 1 または 4の時,l行m列のシステム行列Dが計算されます.

4. t > 0 の時, n行l列のカルマン予測ゲイン行列 K および 共分散行列 Q, Ry および S が計算されます.

## 例

    //generate data from a given linear system
    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'));

    S = 15;
    N = 3;
    METH=1;
    [R,N1] = findR(S,Y',U',METH);
    [A,C,B,D,K] = sident(METH,1,S,N,1,R);
    SYS1=syslin(1,A,B,C,D);
    SYS1.X0 = inistate(SYS1,Y',U');

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

    METH = 2;
    [R,N1,SVAL] = findR(S,Y',U',METH);
    tol = 0;
    t = size(U',1)-2*S+1;

    [A,C,B,D,K] = sident(METH,1,S,N,1,R,tol,t)
    SYS1=syslin(1,A,B,C,D)
    SYS1.X0 = inistate(SYS1,Y',U');

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

## 参照

- findBD
- sorder