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
はリストでaOBJ
は実数スカラーです.- 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 — LMIを解くためのツール
Report an issue | ||
<< aplat | Semidefinite Programming | lmitool >> |