XLPack 7.0
XLPack Numerical Library (Excel VBA) Reference Manual
Loading...
Searching...
No Matches

◆ Bicg1()

Sub Bicg1 ( 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 
)

Solution of linear system Ax = b using bi-conjugate gradient (BICG) method (Simple driver)

Purpose
This routine solves the linear system Ax = b using the bi-conjugate gradient (BICG) iterative method. Matrix A is represented in CSR format.
Parameters
[in]NDimension of the matrix A. (N >= 0) (if N = 0, returns without computation)
[in]Val()Array Val(LVal - 1) (LVal >= Nnz) (Nnz is the number of nonzero elements of the matrix A)
Values of nonzero elements of the matrix A.
[in]Rowptr()Array Rowptr(LRowptr - 1) (LRowptr >= N + 1)
Row pointers of the matrix A.
[in]Colind()Array Colind(LColind - 1) (LColind >= Nnz)
Column indices of the matrix A.
[in]B()Array B(LB - 1) (LB >= N)
Right hand side vector b.
[in,out]X()Array X(LX - 1) (LX >= N)
[in] Initial guess of solution.
[out] Obtained approximate solution.
[out]Info(Optional)
= 0: Successful exit
= i < 0: The (-i)-th argument is invalid.
= 11: Maximum number of iterations exceeded.
= 12: Breakdown occurred.
[out]Iter(Optional)
Actual number of iterations performed for convergence.
[out]Res(Optional)
Final residual norm value norm(b - A*x).
[in]MaxIter(Optional)
Maximum number of iterations. (MaxIter > 0) (default = 500)
[in]Tol(Optional)
Tolerance for convergence test. (default = 1.0e-10)
Assumed to be converged if norm(b - A*x) <= Tol*norm(b).
If Tol < eps (machine epsilon), Tol = eps is assumed.
Note
Indexing of Rowptr() and Ind() is assumed to be zero-based (C style) if Rowptr(0) = 1, or one-based (Fortran style) otherwise.
Example Program
Solve the system of linear equations Ax = B, where
( 0.2 -0.11 -0.93 ) ( -0.3727 )
A = ( -0.32 0.81 0.37 ), B = ( 0.4319 )
( -0.8 -0.92 -0.29 ) ( -1.4247 )
Sub Ex_Bicg1()
Const N = 3, Nnz = N * N
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) = 0.2: A(1) = -0.11: A(2) = -0.93: A(3) = -0.32: A(4) = 0.81: A(5) = 0.37: A(6) = -0.8: A(7) = -0.92: A(8) = -0.29
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) = -0.3727: B(1) = 0.4319: B(2) = -1.4247
Call Bicg1(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 Bicg1(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)
Solution of linear system Ax = b using bi-conjugate gradient (BICG) method (Simple driver)
Example Results
X = 0.86 0.640000000000001 0.509999999999996
Iter = 3, Res = 1.86243126342707E-15, Info = 0