XLPack 6.1
Excel VBA 数値計算ライブラリ・リファレンスマニュアル
読み取り中…
検索中…
一致する文字列を見つけられません

◆ Zcposv()

Sub Zcposv ( Uplo As  String,
N As  Long,
A() As  Complex,
B() As  Complex,
X() As  Complex,
Iter As  Long,
Info As  Long,
Optional Nrhs As  Long = 1 
)

(シンプルドライバ) 連立一次方程式 AX = B の解 (正定値エルミート行列) (混合精度反復改良法)

目的
本ルーチンは次の複素連立一次方程式を解く.
A * X = B
ここで, Aはn×n正定値エルミート行列, また, XおよびBはn×nrhs行列である.

Zcposvは, まず単精度演算による分解を行い, その分解結果に反復改良を施してノルムに基づく精度(下記参照)において倍精度の解を得ることを試みる. それがうまくいかなかった場合, 倍精度演算による分解に切り替えて解を求める.

単精度のパフォーマンスが倍精度のそれに比較してそれほどよくない場合には, 反復改良法はよい方法とはいえない. 右辺の数や行列の大きさなどを考慮にいれて適切な方法をとらなければならないが, 今のところ常に反復改良を行うようになっている.

反復改良は次の場合に停止する.
  iter > itermax
あるいは
  すべての右辺について: rnrm < sqrt(n)*xnrm*anrm*eps*bwdmax
ただし
  iter は反復改良における現在の反復回数
  rnrm は残差の無限ノルム
  xnrm は解の無限ノルム
  anrm は行列Aの無限作用素ノルム
  eps はdlamch('E')によるマシンイプシロン
itermaxおよびbwdmaxの値は, それぞれ 30 および 1.0 の固定値である.
引数
[in]Uplo= "U": Aの上三角部分を格納.
= "L": Aの下三角部分を格納.
[in]N連立方程式の数, すなわち, 行列Aの行および列数. (N >= 0) (N = 0 の場合, 処理を行わずに戻る)
[in,out]A()配列 A(LA1 - 1, LA2 - 1) (LA1 >= N, LA2 >= N)
[in] N×N正定値エルミート行列 A. Uploに従い上三角部分あるいは下三角部分が参照される.
[out] 反復改良がうまくいった場合(Info = 0 かつ Iter >= 0, 下記参照), A()は変更されない. 倍精度による分解が使用された場合(Info = 0 かつ Iter < 0, 下記参照), 配列A()にはコレスキー分解 A = U^H*U または A = L*L^H の UまたはLが入る.
[in]B()配列 B(LB1 - 1, LB2 - 1) (LB1 >= max(1, N), LB2 >= Nrhs) (2次元配列) または B(LB - 1) (LB >= max(1, N), Nrhs = 1) (1次元配列)
N×Nrhs右辺行列 B.
[out]X()配列 X(LX1 - 1, LX2 - 1) (LX1 >= max(1, N), LX2 >= Nrhs) (2次元配列) または X(LX - 1) (LX >= max(1, N), Nrhs = 1) (1次元配列)
Info = 0 の場合, N×Nrhs解行列 X.
[out]Iter< 0: 反復改良が失敗し, 倍精度による分解を行った.
  = -1: 実装上あるいはハードウェア上の理由により倍精度計算に戻した.
  = -2: 精度を落とすことによりオーバーフローが起きたため倍精度計算に戻した.
  = -3: Sgetrfのエラー.
  = -31: 反復が30回に達したため反復改良を停止した.
> 0: 反復改良がうまくいった. 反復回数を返す.
[out]Info= 0: 正常終了.
= -1: パラメータ N の誤り. (N < 0)
= -2: パラメータ A() の誤り.
= -3: パラメータ IPiv() の誤り.
= -4: パラメータ B() の誤り.
= -6: パラメータ Nrhs の誤り. (Nrhs < 0, または, Nrhs <> 1 かつ B()が1次元配列)
= i > 0: 倍精度で計算されたUのi番目の対角要素が0である. 分解を完了したが, Uが特異であるため解を計算できなかった.
[in]Nrhs(省略可)
右辺の数, すなわち, 行列Bの列数. (Nrhs >= 0) (Nrhs = 0 の場合, 処理を行わずに戻る) (省略時 = 1)
出典
LAPACK
使用例
連立一次方程式 Ax = B を解く. ただし, Aは正定値エルミート行列で
( 2.20 -0.11+0.93i 0.81-0.37i )
A = ( -0.11-0.93i 2.32 -0.80+0.92i )
( 0.81+0.37i -0.80-0.92i 2.29 )
( 1.5980+1.4644i )
B = ( 1.3498+1.4398i )
( 2.0561-0.5441i )
とする.
Sub Ex_Zcposv()
Const N As Long = 3
Dim A(N - 1, N - 1) As Complex, B(N - 1) As Complex, X(N - 1) As Complex
Dim Iter As Long, Info As Long
A(0, 0) = Cmplx(2.2, 0)
A(1, 0) = Cmplx(-0.11, -0.93): A(1, 1) = Cmplx(2.32, 0)
A(2, 0) = Cmplx(0.81, 0.37): A(2, 1) = Cmplx(-0.8, -0.92): A(2, 2) = Cmplx(2.29, 0)
B(0) = Cmplx(1.598, 1.4644): B(1) = Cmplx(1.3498, 1.4398): B(2) = Cmplx(2.0561, -0.5441)
Call Zcposv("L", N, A(), B(), X(), Iter, Info)
Debug.Print "X =",
Debug.Print Creal(X(0)), Cimag(X(0)), Creal(X(1)), Cimag(X(1)), Creal(X(2)), Cimag(X(2))
Debug.Print "Iter =", Iter, "Info =", Info
End Sub
実行結果
X = 0.86 0.64 0.51 0.71 0.59 -0.15
Iter = 2 Info = 0