|
|
◆ 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] | N | Dimension 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
|