aff2ab
線形 (アフィン)関数を A,b に変換
呼び出し手順
[A,b]=aff2ab(afunction,dimX,D [,flag])
引数
- afunction
scilab 関数
Y =fct(X,D)
ただし,X, D, Y
は行列のリスト
- dimX
p x 2 整数行列 (
p
はX
の行列の数)- D
実数行列の
list
(または任意の有効なScilab オブジェクト).- flag
オプションのパラメータ (
flag='f'
またはflag='sp'
)- A
実数行列
- b
A
と同じ行次元を有する実数ベクトル
説明
aff2ab
は,アフィン関数の(正準形式の)行列表現を返します.
afunction
は以下の規定の構文を有する関数です:
Y=afunction(X,D)
ただし, X=list(X1,X2,...,Xp)
は
p 個の実数行列のリスト,Y=list(Y1,...,Yq)
は
Xi
に線形に依存するq 個の実数行列のリストです.
(オプションの) 入力 D
は, X の関数として
Yを計算するために必要なパラメータを有しています.
dimX
は p x 2 行列です: dimX(i)=[nri,nci]
は行列Xi
の行と列の実際の数です.
これらの次元は,結果の行列A
の列の次元である
na
を以下のように定義します:
na=nr1*nc1 +...+ nrp*ncp
.
オプションのパラメータ flag='sp'
が指定された場合,
結果の行列 A
は疎行列として返されます.
この関数は,未知変数が行列であるような 線形方程式のシステムを解くために有用です.
例
// リアプノフ方程式ソルバ (未知変数1つ, 拘束条件1つ) deff('Y=lyapunov(X,D)','[A,Q]=D(:);Xm=X(:); Y=list(A''*Xm+Xm*A-Q)') A=rand(3,3);Q=rand(3,3);Q=Q+Q';D=list(A,Q);dimX=[3,3]; [Aly,bly]=aff2ab(lyapunov,dimX,D); [Xl,kerA]=linsolve(Aly,bly); Xv=vec2list(Xl,dimX); lyapunov(Xv,D) Xm=Xv(:); A'*Xm+Xm*A-Q // 冗長な拘束 t X=X'を有するリアプノフ方程式ソルバ // (変数1つ, 拘束条件2つt) D はグローバル変数 deff('Y=ly2(X,D)','[A,Q]=D(:);Xm=X(:); Y=list(A''*Xm+Xm*A-Q,Xm''-Xm)') A=rand(3,3);Q=rand(3,3);Q=Q+Q';D=list(A,Q);dimX=[3,3]; [Aly,bly]=aff2ab(ly2,dimX,D); [Xl,kerA]=linsolve(Aly,bly); Xv=vec2list(Xl,dimX); ly2(Xv,D) // フランシス方程式 // 以下のような行列 X1 および X2 を見つける: // A1*X1 - X1*A2 + B*X2 -A3 = 0 // D1*X1 -D2 = 0 deff('Y=bruce(X,D)','[A1,A2,A3,B,D1,D2]=D(:);'+... '[X1,X2]=X(:);Y=list(A1*X1-X1*A2+B*X2-A3,D1*X1-D2)') A1=[-4,10;-1,2];A3=[1;2];B=[0;1];A2=1;D1=[0,1];D2=1; D=list(A1,A2,A3,B,D1,D2); [n1,m1]=size(A1);[n2,m2]=size(A2);[n3,m3]=size(B); dimX=[[m1,n2];[m3,m2]]; [Af,bf]=aff2ab(bruce,dimX,D); [Xf,KerAf]=linsolve(Af,bf);Xsol=vec2list(Xf,dimX) bruce(Xsol,D) // Aを変換する全てのXを見つける deff('y=f(X,D)','y=list(D(:)*X(:)-X(:)*D(:))') A=rand(3,3);dimX=[3,3];[Af,bf]=aff2ab(f,dimX,list(A)); [Xf,KerAf]=linsolve(Af,bf);[p,q]=size(KerAf); Xsol=vec2list(Xf+KerAf*rand(q,1),dimX); C=Xsol(:); A*C-C*A
参照
- linsolve — 線形方程式ソルバ
Report an issue | ||
<< Linear Equations | Linear Equations | inv >> |