schur
行列およびペンシルの[ソートされた] Schur 分解
呼び出し手順
[U,T] = schur(A) [U,dim [,T] ]=schur(A,flag) [U,dim [,T] ]=schur(A,extern1) [As,Es [,Q,Z]]=schur(A,E) [As,Es [,Q],Z,dim] = schur(A,E,flag) [Z,dim] = schur(A,E,flag) [As,Es [,Q],Z,dim]= schur(A,E,extern2) [Z,dim]= schur(A,E,extern2)
引数
- A
実数または複素数の正方行列.
- E
Aと同じ次元の実数または複素数の正方行列.- flag
文字列 (
'c'または'd')- extern1
an ``external'', 以下の参照
- extern2
an ``external'', 以下の参照
- U
直交またはユニタリ正方行列
- Q
直交またはユニタリ正方行列
- Z
o直交またはユニタリ正方行列
- T
上三角または準三角正方行列
- As
上三角または準三角正方行列
- Es
上三角正方行列
- dim
整数
説明
Schur 形式, 行列およびペンシルのソートされた Schur 形式
- 行列Schur形式
- 通常のSchur形式:
[U,T] = schur(A)は,A = U*T*U'およびU'*U = eye(U)となるような Schur行列Tおよびユニタリ行列Uを出力します. Schur(A)は,Tを返します.Aが複素数の場合, 複素Schur形式は,行列Tに返します. 複素Schur形式は,Aの固有値を対角項に有する上三角行列です.Aが実数の場合, 実数Schur形式が返されます. 実数Schur形式は,対角項に実数固有値、複素数固有値を対角項の2x2ブロックに 有します.- ソートされたSchur形式
[U,dim]=schur(A,'c')は,Aを Schur 形式に変換する ユニタリ行列Uを返します. 更に,Uの最初の列 dim は, 実部が負の固有値(安定な"連続時間"固有値空間) に関連するAの固有値空間 の基底を構成します.[U,dim]=schur(A,'d')は,Aを Schur 形式に変換する ユニタリ行列Uを返します. 更に,Uの最初の列 dim は, 大きさが1未満の固有値(安定な"離散時間"固有値空間) に関連するAの固有値空間 の基底を構成します.[U,dim]=schur(A,extern1)は,Aを Schur 形式に変換する ユニタリ行列Uを返します. 更に,Uの最初の列 dim は, 外部関数extern1(詳細は external 参照) により選択された固有値に関連するAの固有値空間 の基底を構成します. この external はScilab関数またはCまたはFortranプロシージャにより 次のように記述することができます:- Scilab関数
extern1が Scilab関数により記述される場合, 以下の呼び出し手順を有する必要があります:s=extern1(Ev), ただしEvは固有値,sは論理値です.- C または Fortran プロシージャ
extern1がCまたはFortran関数により 記述される場合,以下の呼び出し手順を有する必要があります:int extern1(double *EvR, double *EvI)ただしEvRおよびEvIは 固有値の実部および虚部です. trueまたはゼロでない戻り値は,選択された固有値を意味します.
- ペンシルSchur形式
- 通常のペンシルSchur形式
[As,Es] = schur(A,E)は, 対A, Eの一般化Schur形式である 準三角行列As行列および三角行列Esを出力します.[As,Es,Q,Z] = schur(A,E)は,更にAs=Q'*A*ZおよびEs=Q'*E*Zとなるような 2つのユニタリ行列QおよびZを返します.- ソートされたSchur形式:
[As,Es,Z,dim] = schur(A,E,'c')は, ペンシルs*E-Aの実数一般化Schur形式を返します. 更に,Zの最初の列 dim は, 実部が負の固有値 (安定な"連続時間"一般化固有値空間)に関連する 固有値空間の基底を構成します.[As,Es,Z,dim] = schur(A,E,'d')は,ペンシル
s*E-Aの 実数一般化Schur形式を返します. 更に,Zの最初の列 dim は, 大きさ1未満の固有値 (安定な"離散時間"一般化固有値空間)に関連する 固有値空間の基底を構成します.[As,Es,Z,dim] = schur(A,E,extern2)は,ペンシル
s*E-Aの実一般化Schur形式を返します. 更に,Zの最初の列 dim は, 関数extern2により指定された規則に基づき選択された ペンシルの固有値に関する固有値空間の基底を構成します. (詳細は external 参照) この external は Scilab 関数またはCまたはFortranプロシージャ により次のように記述することができます:- Scilab関数
extern2がScilab関数により記述される場合, 以下の呼び出し手順を有する必要があります:s=extern2(Alpha,Beta), ただしAlphaおよびBetaは一般化固有値および論理値sを定義します.- C またはFortranプロシージャ
if external
extern2がCまたはFortran関数により 記述される場合,以下の呼び出し手順を有する必要があります:int extern2(double *AlphaR, double *AlphaI, double *Beta):
AおよびEが実数の場合.int extern2(double *AlphaR, double *AlphaI, double *BetaR, double *BetaI):
AおよびEが複素数の場合.Alpha, およびBetaは一般化固有値を定義します. trueまたは非ゼロの戻り値は,選択された一般化固有値を意味します.
参考
行列Schur形式の計算はLapackルーチンDGEES および ZGEESに基づいています.
ペンシルSchur形式の計算はLapackルーチンDGGES および ZGGESに基づいています.
例
//行列Schur形式 //---------------------- A=diag([-0.9,-2,2,0.9]);X=rand(A);A=inv(X)*A*X; [U,T]=schur(A);T [U,dim,T]=schur(A,'c'); T(1:dim,1:dim) //安定な連続時間固有値 function t=mytest(Ev),t=abs(Ev)<0.95,endfunction [U,dim,T]=schur(A,mytest); T(1:dim,1:dim) // Cの同じ関数 (コンパイラが必要) cd TMPDIR; C=['int mytest(double *EvR, double *EvI) {' //the C code 'if (*EvR * *EvR + *EvI * *EvI < 0.9025) return 1;' 'else return 0; }';] mputl(C,TMPDIR+'/mytest.c') //構築/リンク lp=ilib_for_link('mytest','mytest.c',[],'c'); link(lp,'mytest','c'); //実行 [U,dim,T]=schur(A,'mytest'); //ペンシルのSchur形式 //---------------------- F=[-1,%s, 0, 1; 0,-1,5-%s, 0; 0, 0,2+%s, 0; 1, 0, 0, -2+%s]; A=coeff(F,0);E=coeff(F,1); [As,Es,Q,Z]=schur(A,E); Q'*F*Z //これはAs+%s*Esです [As,Es,Z,dim] = schur(A,E,'c') function t=mytest(Alpha, Beta),t=real(Alpha)<0,endfunction [As,Es,Z,dim] = schur(A,E,mytest) //Fortranの同じ関数 (コンパイラが必要) ftn=['integer function mytestf(ar,ai,b)' //fortranコード 'double precision ar,ai,b' 'mytestf=0' 'if(ar.lt.0.0d0) mytestf=1' 'end'] mputl(' '+ftn,TMPDIR+'/mytestf.f') //build and link lp=ilib_for_link('mytestf','mytestf.f',[],'F'); link(lp,'mytestf','f'); //実行 [As,Es,Z,dim] = schur(A,E,'mytestf')
| Report an issue | ||
| << rankqr | Factorization | sqroot >> |