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

◆ Cg1()

Sub Cg1 ( N As  Long,
Val() As  Double,
Rowptr() As  Long,
Colind() As  Long,
B() As  Double,
X() As  Double,
Optional Info As  Long,
Optional Iter As  Long,
Optional Res As  Double,
Optional MaxIter As  Long = 500,
Optional Tol As  Double = 1.0E-10,
Optional Uplo As  String = "F" 
)

共役勾配(CG)法による連立一次方程式 Ax = b の解 (正定値対称行列) (シンプルドライバ)

目的
共役勾配(CG)法により正定値対称な係数行列の連立一次方程式 Ax = b の解を求める. 行列 A は CSR 形式で表される.
引数
[in]N行列 A の次数. (N >= 0) (N = 0 の場合, 処理を行わずに戻る)
[in]Val()配列 Val(LVal - 1) (LVal >= Nnz) (Nnz は行列 A の非ゼロ要素数)
行列 A の非ゼロ要素の値.
[in]Rowptr()配列 Rowptr(LRowptr - 1) (LRowptr >= N + 1)
行列 A の行ポインタ.
[in]Colind()配列 Colind(LColind - 1) (LColind >= Nnz)
行列 A の列インデクス.
[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).
[out]Iter(省略可)
収束時の反復回数.
[out]Res(省略可)
最終的な残差ノルム 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": 全体(上および下三角部分両方)を格納.
インデクス形式は, Rowptr(0) = 1 であれば 0-ベース(C形式), そうでなければ 1-ベース(Fortran形式) とみなす.
使用例
連立一次方程式 Ax = B を解く. ただし,
( 2.2 -0.11 -0.32 ) ( -1.566 )
A = ( -0.11 2.93 0.81 ), B = ( -2.8425 )
( -0.32 0.81 2.37 ) ( -1.1765 )
とする.
Sub Ex_Cg1()
Const N = 3, Nnz = 6
Dim A(Nnz - 1) As Double, Ia(N) As Long, Ja(Nnz - 1) As Long
Dim B(N - 1) As Double, X(N - 1) As Double
Dim Iter As Long, Res As Double, Info As Long
A(0) = 2.2: A(1) = -0.11: A(2) = 2.93: A(3) = -0.32: A(4) = 0.81: A(5) = 2.37
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) = -1.566: B(1) = -2.8425: B(2) = -1.1765
Call Cg1(N, A(), Ia(), Ja(), B(), X(), Info, Iter, Res)
Debug.Print "X =", X(0), X(1), X(2)
Debug.Print "Iter = " + CStr(Iter) + ", Res = " + CStr(Res) + ", Info = " + CStr(Info)
End Sub
Sub Cg1(N As Long, Val() As Double, Rowptr() As Long, Colind() As Long, B() As Double, X() As Double, Optional Info As Long, Optional Iter As Long, Optional Res As Double, Optional MaxIter As Long=500, Optional Tol As Double=1.0E-10, Optional Uplo As String="F")
共役勾配(CG)法による連立一次方程式 Ax = b の解 (正定値対称行列) (シンプルドライバ)
実行結果
X = -0.8 -0.92 -0.29
Iter = 3, Res = 1.03670172979888E-16, Info = 0