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

◆ ZCocr()

Sub ZCocr ( N As  Long,
Val() As  Complex,
Ptr() As  Long,
Ind() As  Long,
B() As  Complex,
X() As  Complex,
Optional Info As  Long,
Optional Iter As  Long,
Optional Res As  Double,
Optional Format As  Long = 0,
Optional Mode As  Long = 0,
Optional MaxIter As  Long = 500,
Optional Tol As  Double = 1.0E-10,
Optional Uplo As  String = "F",
Optional Base As  Long = -1,
Optional Precon As  Long = 0,
Optional Omega As  Double = 1.5 
)

COCR(Conjugate Orthogonal Conjugate Residual)法による連立一次方程式 Ax = b の解 (複素対称行列) (ドライバ)

目的
前処理付き反復法(COCR法)により複素対称行列を係数とする連立一次方程式 Ax = b の解を求める. 行列 A は CSR または CSC 形式で表される.
引数
[in]N行列 A の次数. (N >= 0) (N = 0 の場合, 処理を行わずに戻る)
[in]Val()配列 Val(LVal - 1) (LVal >= Nnz) (Nnz は行列 A の非ゼロ要素数)
行列 A の非ゼロ要素の値.
[in]Ptr()配列 Ptr(LPtr - 1) (LPtr >= N + 1)
行列 A の列ポインタ(CSC の場合)または行ポインタ(CSR の場合).
[in]Ind()配列 Ind(LInd - 1) (LInd >= Nnz)
行列 A の行インデクス(CSC の場合)または列インデクス(CSR の場合).
[in]B()配列 B(LB - 1) (LB >= N)
右辺ベクトル b.
[in,out]X()配列 X(LX - 1) (LX >= N)
[in] 解の初期推定値.
[out] 求められた近似解.
[out]Info(省略可)
= 0: 正常終了.
= i < 0: (-i)番目の入力パラメータの誤り.
= 1: (警告) 行列 A が正定値でない(計算は続行する).
= 2: (警告) 前処理行列 M が正定値でない(計算は続行する).
= 11: 最大反復回数を超えた.
= 12: 行列 A が特異である(対角要素が0).
= 13: 前処理系の初期化中にエラーが発生した.
= 14: 前処理中にエラーが発生した.
[out]Iter(省略可)
収束時の反復回数.
[out]Res(省略可)
最終的な残差ノルム norm(b - A*x) の値.
[in]Format(省略可)
行列の格納形式. (省略時 = 0)
= 0: CSR 形式.
= 1: CSC 形式.
[in]Mode(省略可)
引数 ChkCnv および Res において返す残差ノルムを選択することができる. (省略時 = 0)
= 0: norm(b - A*x) を返す. ただし, 反復ごとに1回のMatvec演算が追加で必要になる.
= 1: M^(-1)*norm(b - A*x) を返す.
[in]MaxIter(省略可)
最大反復回数. (MaxIter > 0) (省略時 = 500)
[in]Tol(省略可)
収束判定基準値. (省略時 = 1.0e-10)
norm(b - A*x) <= Tol*norm(b) であれば収束とみなす.
Tol < eps (マシンイプシロン) であれば Tol = eps とみなす.
[in]Uplo(省略可)
対称行列 A の上または下三角部分を格納するか指定する. (省略時 = "F")
= "U": 上三角部分を格納.
= "L": 下三角部分を格納.
= "F": 全体(上および下三角部分両方)を格納.
[in]Base(省略可)
Ptr() および Ind() のインデクス形式.
= 0: 0-ベース(C形式): 開始インデクス値が 0.
= 1: 1-ベース(Fortran形式): 開始インデクス値が 1.
(省略時: Ptr(0) = 1 であれば 1, そうでなければ 0 とみなす)
[in]Precon(省略可)
前処理系の指定. (省略時 = 0)
= 0: 前処理なし.
= 1: 対角スケーリング前処理.
= 2: SSOR 前処理.
= 3: IC0 前処理.
[in]Omega(省略可)
SSOR 前処理の緩和パラメータω. (0 < ω < 2) (省略時 = 1.5)
Precon = 2 以外では使用しない.
使用例
連立一次方程式 Ax = B を解く. ただし,
( 0.31+0.77i 0.25+0.23i -0.81-0.83i )
A = ( 0.25+0.23i 0.26-0.26i -0.58-0.08i )
( -0.81-0.83i -0.56-0.08i 2.09+0.6i )
( 0.3941-1.2711i )
B = ( 0.0036-0.72i )
( 0.3628+1.9977i )
とする.
Sub Ex_ZCocr()
Const N = 3, Nnz = 6
Dim A(Nnz - 1) As Complex, Ia(N) As Long, Ja(Nnz - 1) As Long
Dim B(N - 1) As Complex, X(N - 1) As Complex
Dim Iter As Long, Res As Double, Info As Long
A(0) = Cmplx(0.31, 0.77): A(1) = Cmplx(0.25, 0.23): A(2) = Cmplx(0.26, -0.26): A(3) = Cmplx(-0.81, -0.83): A(4) = Cmplx(-0.56, -0.08): A(5) = Cmplx(2.09, 0.6)
Ia(0) = 0: Ia(1) = 1: Ia(2) = 3: Ia(3) = 6
Ja(0) = 0: Ja(1) = 0: Ja(2) = 1: Ja(3) = 0: Ja(4) = 1: Ja(5) = 2
B(0) = Cmplx(0.3941, -1.2711): B(1) = Cmplx(0.0036, -0.72): B(2) = Cmplx(0.3628, 1.9977)
Call ZCocr(N, A(), Ia(), Ja(), B(), X(), Info, Iter, Res, Uplo:="L")
Debug.Print "X ="
Debug.Print "(" + CStr(Creal(X(0))) + "," + CStr(Cimag(X(0))) + ")"
Debug.Print "(" + CStr(Creal(X(1))) + "," + CStr(Cimag(X(1))) + ")"
Debug.Print "(" + CStr(Creal(X(2))) + "," + CStr(Cimag(X(2))) + ")"
Debug.Print "Iter =" + Str(Iter) + ", Res =" + Str(Res) + ", Info =" + Str(Info)
End Sub
Function Cmplx(R As Double, Optional I As Double=0) As Complex
複素数の作成
Function Cimag(A As Complex) As Double
複素数の虚数部
Function Creal(A As Complex) As Double
複素数の実数部
Sub ZCocr(N As Long, Val() As Complex, Ptr() As Long, Ind() As Long, B() As Complex, X() As Complex, Optional Info As Long, Optional Iter As Long, Optional Res As Double, Optional Format As Long=0, Optional Mode As Long=0, Optional MaxIter As Long=500, Optional Tol As Double=1.0E-10, Optional Uplo As String="F", Optional Base As Long=-1, Optional Precon As Long=0, Optional Omega As Double=1.5)
COCR(Conjugate Orthogonal Conjugate Residual)法による連立一次方程式 Ax = b の解 (複素対称行列) (ドライバ)
実行結果
X =
(-0.820000000000007,-0.940000000000006)
(0.739999999999996,0.2)
(0.480000000000016,0.210000000000004)
Iter = 3, Res = 5.1647781609597E-14, Info = 0