# lmisolver

LMIソルバー

## 呼び出し手順

    [XLISTF[,OPT]] = lmisolver(XLIST0,evalfunc [,options])

## パラメータ

XLIST0

  初期推定値を有するリスト (例: `XLIST0=list(X1,X2,..,Xn)`)

evalfunc

  Scilab関数 (指定した構文を有する"external" 関数)

  関数`evalfunc`の構文は以下のようになります:

  `[LME,LMI,OBJ]=evalfunct(X)` ただし, `X` は行列のリストです, `LME, LMI` はリストでa `OBJ` は実数スカラーです.

XLISTF

  行列のリスト (例: `XLIST0=list(X1,X2,..,Xn)`)

options

  オプションのパラメータ. 指定された場合, `options` は 5つの要素`[Mbound,abstol,nu,maxiters,reltol]`を有する実数行ベクトルです.

## 説明

`lmisolver` は以下の問題を解きます:

minimize `f(X1,X2,...,Xn)` Xiの線形関数

拘束条件: `Gi(X1,X2,...,Xn)=0` ただし, i=1,...,p および LMI (linear matrix inequalities) 拘束条件:

`Hj(X1,X2,...,Xn) > 0` for j=1,...,q

関数 f, G, H は,Scilab 関数`evalfunc`および リストX (すなわち,`X=list(X1,...,Xn)`)に基づく行列の集合 Xiで コード化されます.

関数`evalfun` は,リスト`LME`に 行列`G1(X),...,Gp(X)` (すなわち,`LME(i)=Gi(X1,...,Xn),` i=1,...,p)を返す必要があります. `evalfun`は,リスト`LMI`に 行列`H1(X0),...,Hq(X)`(すなわち, `LMI(j)=Hj(X1,...,Xn)`, j=1,...,q)を返す必要があります. `evalfun` は, `OBJ` に `f(X)`(すなわち,`OBJ=f(X1,...,Xn)`)の値を返す 必要があります.

`lmisolver` は`XLISTF`に, 実数行列のリスト,すなわち,`XLIST=list(X1,X2,..,Xn)` を返します.ただし,Xiについて解くのはLMI問題です:

`[Y,Z,cost]=evalfunc(XLIST)`, `Y` はゼロ行列のリストです, `Y=list(Y1,...,Yp)`, `Y1=0, Y2=0, ..., Yp=0`.

`Z` は,正方対称行列のリスト `Z=list(Z1,...,Zq)` で, 半正定 `Z1>0, Z2>0, ..., Zq>0` です(すなわち `spec(Z(j))` > 0),

`cost` は最小化されます.

`lmisolver` は, `Xi`が行列ではなく行列のリストである LMI問題を解くこともできます. より詳細については,LMITOOLのドキュメントで参照可能です.

## 例

    // A1'*X+X*A1+Q1 < 0, A2'*X+X*A2+Q2 < 0 (q=2) となるような
    // 対角行列 X (すなわち X=diag(diag(X), p=1) を見つけます.
    // trace(X) は最大化されます.
    n  = 2;
    A1 = rand(n,n);
    A2 = rand(n,n);
    Xs = diag(1:n);
    Q1 = -(A1'*Xs+Xs*A1+0.1*eye());
    Q2 = -(A2'*Xs+Xs*A2+0.2*eye());

    deff('[LME,LMI,OBJ]=evalf(Xlist)','X   = Xlist(1); ...
                                       LME = X-diag(diag(X));...
                                       LMI = list(-(A1''*X+X*A1+Q1),-(A2''*X+X*A2+Q2)); ...
                                       OBJ = -sum(diag(X))  ');

    X=lmisolver(list(zeros(A1)),evalf);

    X=X(1)
    [Y,Z,c]=evalf(X)

## 参照

- lmitool