# bloc2exp

ブロック図の記号評価

## 呼び出し手順

    [str]=bloc2exp(blocd)
                [str,names]=bloc2exp(blocd)

## パラメータ

blocd

  リスト

str

  文字列

names

  文字列

## 説明

線形システムのブロック図表現を指定すると, `bloc2exp` はその記号評価を返します. リスト `blocd`の最初の要素は, 文字列 `'blocd'`である必要があります. このリストのその他の各要素 `(blocd(2),blocd(3),...)` は,それ自体が以下の型のリストです:

    list('transfer','name_of_linear_system')

    list('link','name_of_link',
                   [number_of_upstream_box,upstream_box_port],
                   [downstream_box_1,downstream_box_1_portnumber],
                   [downstream_box_2,downstream_box_2_portnumber],
                   ...)

文字列 `'transfer'` および `'link'` はブロック図の中での要素の型を示す キーワードです.

ケース1 : リストの2番目のパラメータは, 状態空間表現(`syslin` リスト)または伝達関数形式(有理数の行列) で指定される 線形システムのScilab名を指す(またはそのように評価される)文字列 です.

各伝達関数ブロックには1つの整数値がふられます. 伝達関数ブロックの各入力および出力にも整数値の番号がふられます. (例を参照)

ケース2 : ブロック図表現の2種類目の要素はリンクです. リンクは, 対`[number_of_upstream_box,upstream_box_port]`で 表されるブロックの出力と 他のブロックの入力を結合します. この際,各入力は,対 `[downstream_box_i,downstream_box_i_portnumber]` のように表されます.

ブロックの異なる要素を任意の順序で 定義できます.

例えば,

[1] ゲイン1のフィードバックを有する `S1*S2` .

3つの伝達関数, `S1` (番号 `n_s1=2`) , `S2` (番号 `n_s2=3`) および伝達関す記号が`['1','1']` となる加算器 (番号 `n_add=4`) があります.

リンクは 4 つあります. 最初のリンク (名前は `'U'`) 入力 を加算器のポート1に結合します. 2番目と3番目のリンクはそれぞれ, 加算器の(出力)ポート1をシステム`S1`の(入力)ポート1, `S1`の(出力)ポート1を`S2`の(入力)ポート1 に結合します. (`'Y'`という名前の)4番目のリンクは, `S2`の出力ポート1を出力 (仮想的なブロック -1 のポート0, 省略されている) および加算器の(入力)ポート2に結合します.

    //Initialization
    syst=list('blocd'); l=1;

    //Systems
    l=l+1;n_s1=l;syst(l)=list('transfer','S1');  //System 1
    l=l+1;n_s2=l;syst(l)=list('transfer','S2');  //System 2
    l=l+1;n_adder=l;syst(l)=list('transfer',['1','1']);  //adder

    //Links

    // Inputs  -1 --> input 1
    l=l+1;syst(l)=list('link','U',[-1],[n_adder,1]);
    // Internal
    l=l+1;syst(l)=list('link',' ',[n_adder,1],[n_s1,1]);
    l=l+1;syst(l)=list('link',' ',[n_s1,1],[n_s2,1]);

    // Outputs // -1 -> output 1
    l=l+1;syst(l)=list('link','Y',[n_s2,1],[-1],[n_adder,2]);

    //Evaluation call
    w=bloc2exp(syst);

結果は以下の文字列となります: `w=-(s2*s1-eye())\s2*s1`.

出力引数を二つとして使用する場合, `[str,names]=blocd(syst)`は, `names`にリンク名の記号リストを返すことに注意してください. この機能は,入力と出力に名前を付けたい場合に有用です.

[2] 2番目の例

    //Initialization
    syst=list('blocd'); l=1;

    //System (2x2 blocks plant)
    l=l+1;n_s=l;syst(l)=list('transfer',['P11','P12';'P21','P22']);

    //Controller
    l=l+1;n_k=l;syst(l)=list('transfer','k');

    //Links
    l=l+1;syst(l)=list('link','w',[-1],[n_s,1]);
    l=l+1;syst(l)=list('link','z',[n_s,1],[-1]);
    l=l+1;syst(l)=list('link','u',[n_k,1],[n_s,2]);
    l=l+1;syst(l)=list('link','y',[n_s,2],[n_k,1]);

    //Evaluation call
    w=bloc2exp(syst);

この例では, 結果は一般的な式に等価な式となります:

`P11+P12*invr(eye()-K*P22)*K*P21;`

## 参照

- bloc2ss