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

◆ ZDiom()

Sub ZDiom ( 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 M As  Long = 0,
Optional MaxIter As  Long = 500,
Optional Tol As  Double = 1.0E-10,
Optional Base As  Long = -1,
Optional Precon As  Long = 0,
Optional Omega As  Double = 1.5,
Optional P As  Long = 3,
Optional Nnz2 As  Long = -1,
Optional Md As  Long = 0 
)

不完全直交化法(DIOM)による連立一次方程式 Ax = b の解 (複素行列) (ドライバ)

目的
前処理付き反復法(不完全直交化法(DIOM))により連立一次方程式 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)番目の入力パラメータの誤り.
= 11: 最大反復回数を超えた.
= 12: ブレークダウンが発生した.
= 13: 前処理系の初期化中にエラーが発生した.
= 14: 前処理中にエラーが発生した.
[out]Iter(省略可)
収束時の反復回数.
[out]Res(省略可)
最終的な残差ノルム norm(b - A*x) の値.
[in]Format(省略可)
行列の格納形式. (省略時 = 0)
= 0: CSR 形式.
= 1: CSC 形式.
[in]M(省略可)
打ち切りパラメータ. (0 < M <= N (省略時 = min(64, N)))
[in]MaxIter(省略可)
最大反復回数. (MaxIter > 0) (省略時 = 500)
[in]Tol(省略可)
収束判定基準値. (省略時 = 1.0e-10)
norm(b - A*x) <= Tol*norm(b) であれば収束とみなす.
Tol < eps (マシンイプシロン) であれば Tol = eps とみなす.
[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: ILU(0) 前処理.
= 4: ILU(p) 前処理.
[in]Omega(省略可)
SSOR 前処理の緩和パラメータω. (0 < ω < 2) (省略時 = 1.5)
Precon = 2 以外では使用しない.
[in]P(省略可)
ILU(p) アルゴリズムのレベル p の値. (P >= 0) (省略時 = 3)
Precon = 4 以外では使用しない.
[in]Nnz2(省略可)
行列 L*U の非ゼロ要素数の最大値. 分解中に非ゼロ要素数がこれを超えるとエラー(info = 13)で終了する. (Nnz2 > 0) (省略時 = P*Nnz)
Precon = 4 以外では使用しない.
[in]Md(省略可)
廃棄した要素の分を対角要素に修正を加えるかどうか指定する. このような修正を行う方法を修正ILU分解(Modified ILU (MILU)分解)という. (省略時 = 0)
= 0: ILU (修正なし).
= 1: MILU (対角要素の修正あり).
Format = 0 かつ Precon = 4 のとき以外では使用しない.
使用例
連立一次方程式 Ax = B を解く. ただし,
( 0.78+0.16i -0.9-1.46i 0.48-1.08i )
A = ( 0.73+0.63i 1.58-1.24 -0.41-0.91i )
( 0.23-1.37i 0.79+0.64i -0.73-1.5i )
( 0.2126-0.2904i )
B = ( -0.3028+0.3346i )
( -1.2905-1.0346i )
とする.
Sub Ex_ZDiom()
Const N = 3, Nnz = N * N
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.78, 0.16): A(1) = Cmplx(-0.9, -1.46): A(2) = Cmplx(0.48, -1.08): A(3) = Cmplx(0.73, 0.63): A(4) = Cmplx(1.58, -1.24): A(5) = Cmplx(-0.41, -0.91): A(6) = Cmplx(0.23, -1.37): A(7) = Cmplx(0.79, 0.64): A(8) = Cmplx(-0.73, -1.5)
Ia(0) = 0: Ia(1) = 3: Ia(2) = 6: Ia(3) = 9
Ja(0) = 0: Ja(1) = 1: Ja(2) = 2: Ja(3) = 0: Ja(4) = 1: Ja(5) = 2: Ja(6) = 0: Ja(7) = 1: Ja(8) = 2
B(0) = Cmplx(0.2126, -0.2904): B(1) = Cmplx(-0.3028, 0.3346): B(2) = Cmplx(-1.2905, -1.0346)
Call ZDiom(N, A(), Ia(), Ja(), B(), X(), Info, Iter, Res)
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 ZDiom(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 M As Long=0, Optional MaxIter As Long=500, Optional Tol As Double=1.0E-10, Optional Base As Long=-1, Optional Precon As Long=0, Optional Omega As Double=1.5, Optional P As Long=3, Optional Nnz2 As Long=-1, Optional Md As Long=0)
不完全直交化法(DIOM)による連立一次方程式 Ax = b の解 (複素行列) (ドライバ)
実行結果
X =
(0.59,-0.28)
(-0.2,-0.04)
(0.24,-0.49)
Iter = 3, Res = 6.45426868113438E-16, Info = 0