|
|
◆ Zhpsv()
| Sub Zhpsv |
( |
Uplo As |
String, |
|
|
N As |
Long, |
|
|
Ap() As |
Complex, |
|
|
IPiv() As |
Long, |
|
|
B() As |
Complex, |
|
|
Info As |
Long, |
|
|
Optional Nrhs As |
Long = 1 |
|
) |
| |
(Simple driver) Solution to system of linear equations AX = B for a Hermitian matrix in packed form
- Purpose
- This routine computes the solution to a complex system of linear equations where A is an n x n Hermitian matrix stored in packed form, and X and B are n x nrhs matrices.
The diagonal pivoting method is used to factor A as A = U * D * U^H, if Uplo = "U", or
A = L * D * L^H, if Uplo = "L",
where U (or L) is a product of permutation and unit upper (lower) triangular matrices, and D is symmetric and block diagonal with 1 x 1 and 2 x 2 diagonal blocks. The factored form of A is then used to solve the system of equations A * X = B.
- Parameters
-
| [in] | Uplo | = "U": Upper triangle of A is stored.
= "L": Lower triangle of A is stored. |
| [in] | N | Number of linear equations, i.e., order of the matrix A. (N >= 0) (If N = 0, returns without computation) |
| [in,out] | Ap() | Array Ap(LAp - 1) (LAp >= N(N + 1)/2)
[in] N x N symmetric matrix A in packed form. The upper or lower part is to be stored in accordance with Uplo.
[out] The block diagonal matrix D and the multipliers used to obtain the factor U or L from the factorization A = U*D*U^H or A = L*D*L^H as computed by Zhptrf, stored as a packed triangular matrix in the same storage format as A. |
| [out] | IPiv() | Array IPiv(LIPiv - 1) (LIPiv >= N)
Details of the interchanges and the block structure of D, as determined by Zhptrf. If IPiv(k-1) > 0, then rows and columns k and IPiv(k-1) were interchanged, and k-th diagonal of D is a 1 x 1 diagonal block.
If Uplo = "U" and IPiv(k-1) = IPiv(k-2) < 0, then rows and columns k-1 and -IPiv(k-1) were interchanged and (k-1)-th diagonal of D is a 2 x 2 diagonal block.
If Uplo = "L" and IPiv(k-1) = IPiv(k) < 0, then rows and columns k+1 and -IPiv(k-1) were interchanged and k-th diagonal of D is a 2 x 2 diagonal block. |
| [in,out] | B() | Array B(LB1 - 1, LB2 - 1) (LB1 >= max(1, N), LB2 >= Nrhs) (2D array) or B(LB - 1) (LB >= max(1, N), Nrhs = 1) (1D array)
[in] N x Nrhs matrix of right hand side matrix B.
[out] If Info = 0, the N x Nrhs solution matrix X. |
| [out] | Info | = 0: Successful exit.
= -1: The argument Uplo had an illegal value. (Uplo <> "U" nor "L")
= -2: The argument N had an illegal value. (N < 0)
= -3: The argument Ap() is invalid.
= -4: The argument IPiv() is invalid.
= -5: The argument B() is invalid.
= -7: The argument Nrhs had an illegal value. (Nrhs < 0)
= i > 0: The i-th element of D is exactly zero. The factorization has been completed, but the block diagonal matrix D is exactly singular, so the solution could not be computed. |
| [in] | Nrhs | (Optional)
Number of right hand sides, i.e., number of columns of the matrix B. (Nrhs >= 0) (If Nrhs = 0, returns without computation) (default = 1) |
- Reference
- LAPACK
- Example Program
- Solve the system of linear equations Ax = B and estimate the reciprocal of the condition number (RCond) of A, where
( 0.20 -0.11+0.93i 0.81-0.37i )
A = ( -0.11-0.93i -0.32 -0.80+0.92i )
( 0.81+0.37i -0.80-0.92i -0.29 )
( -0.1220+0.1844i )
B = ( 0.0034-0.4346i )
( 0.5339-0.1571i )
Sub Ex_Zhpsv()
Const N As Long = 3
Dim Ap(N * (N + 1) / 2) As Complex, B(N - 1) As Complex, IPiv(N - 1) As Long
Dim ANorm As Double, RCond As Double, Info As Long
Ap(1) = Cmplx(-0.11, -0.93): Ap(3) = Cmplx(-0.32, 0)
Ap(2) = Cmplx(0.81, 0.37): Ap(4) = Cmplx(-0.8, -0.92): Ap(5) = Cmplx(-0.29, 0)
B(0) = Cmplx(-0.122, 0.1844): B(1) = Cmplx(0.0034, -0.4346): B(2) = Cmplx(0.5339, -0.1571)
ANorm = Zlanhp("1", "L", N, Ap())
Call Zhpsv("L", N, Ap(), IPiv(), B(), Info)
If Info = 0 Then Call Zhpcon("L", N, Ap(), IPiv(), ANorm, RCond, Info)
Debug.Print "X =",
Debug.Print "RCond =", RCond
Debug.Print "Info =", Info
End Sub
Function Cmplx(R As Double, Optional I As Double=0) As Complex Building complex number
Function Cimag(A As Complex) As Double Imaginary part of complex number
Function Creal(A As Complex) As Double Real part of complex number
Function Zlanhp(Norm As String, Uplo As String, N As Long, Ap() As Complex, Optional Info As Long) As Double One norm, Frobenius norm, infinity norm, or largest absolute value of any element of a Hermitian matr...
Sub Zhpcon(Uplo As String, N As Long, Ap() As Complex, IPiv() As Long, ANorm As Double, RCond As Double, Info As Long) Condition number of a Hermitian matrix in packed form
Sub Zhpsv(Uplo As String, N As Long, Ap() As Complex, IPiv() As Long, B() As Complex, Info As Long, Optional Nrhs As Long=1) (Simple driver) Solution to system of linear equations AX = B for a Hermitian matrix in packed form
- Example Results
X = 0.86 0.64 0.51 0.71 0.590000000000001 -0.15
RCond = 4.46158691608911E-02
Info = 0
|