ppsvx(3)
π ppsvx(3) β ppsvx: factor and solve, expert β¨
okay so bestie, welcome to ppsvx(3) β this is the LAPACK page for ppsvx: factor and solve, expert. it's giving "I know what I'm doing and I brought receipts" energy. let's get into it π«Ά
πΈ NAME πΈ
ppsvx β ppsvx: factor and solve, expert π
β¨ SYNOPSIS β¨
Functions π¦
subroutine cppsvx (fact, uplo, n, nrhs, ap, afp, equed, s, b, ldb, x, ldx, rcond, ferr, berr, work, rwork, info)β CPPSVX computes the solution to system of linear equationsA * X = Bfor OTHER matricessubroutine dppsvx (fact, uplo, n, nrhs, ap, afp, equed, s, b, ldb, x, ldx, rcond, ferr, berr, work, iwork, info)β DPPSVX computes the solution to system of linear equationsA * X = Bfor OTHER matricessubroutine sppsvx (fact, uplo, n, nrhs, ap, afp, equed, s, b, ldb, x, ldx, rcond, ferr, berr, work, iwork, info)β SPPSVX computes the solution to system of linear equationsA * X = Bfor OTHER matricessubroutine zppsvx (fact, uplo, n, nrhs, ap, afp, equed, s, b, ldb, x, ldx, rcond, ferr, berr, work, rwork, info)β ZPPSVX computes the solution to system of linear equationsA * X = Bfor OTHER matrices
notice the pattern?c= complex,d= double,s= single,z= double-complex. the real ones passrwork, the real ones that are single/double passiwork. the complex ones passrwork. it's giving "family reunion, everyone shows up" π
π Detailed Description π
this page is where the actual explanations live. buckle up, it's long but iconic π
π Function Documentation π
subroutine cppsvx (character fact, character uplo, integer n, integer nrhs, complex, dimension( * ) ap, complex, dimension( * ) afp, character equed, real, dimension( * ) s, complex, dimension( ldb, * ) b, integer ldb, complex, dimension( ldx, * ) x, integer ldx, real rcond, real, dimension( * ) ferr, real, dimension( * ) berr, complex, dimension( * ) work, real, dimension( * ) rwork, integer info)
CPPSVX computes the solution to system of linear equations A * X = B for OTHER matrices π
π Purpose:
!>
!> CPPSVX uses the Cholesky factorization A = U**H*U or A = L*L**H to
!> compute the solution to a complex system of linear equations
!> A * X = B,
!> where A is an N-by-N Hermitian positive definite matrix stored in
!> packed format and X and B are N-by-NRHS matrices.
!>
!> Error bounds on the solution and a condition estimate are also
!> provided.
!>
lowkey that's the whole pitch: it solves A * X = B with a Hermitian positive definite A, packed format, Cholesky on deck, and it also hands you error bounds plus a condition estimate. main character behavior, honestly π
π₯ Description:
!>
!> The following steps are performed:
!>
- Equilibrate (maybe) β if
FACT = 'E', real scaling factors are computed to equilibrate the system:
diag(S) * A * diag(S) * inv(diag(S)) * X = diag(S) * B
whether or not the system actually gets equilibrated depends on the scaling of the matrix A. but if equilibration is used, A is overwritten by diag(S)*A*diag(S) and B by diag(S)*B. π (yes, they get modified, we'll get to that)
- Factor β if
FACT = 'N'or'E', the Cholesky decomposition factors the matrixA(after equilibration ifFACT = 'E') as:
A = U**H * U , if UPLO = 'U', or
A = L * L**H, if UPLO = 'L',
where U is upper triangular, L is lower triangular, and **H means conjugate transpose. periodt.
- Check the minors β if the leading principal minor of order i is not positive, the routine returns with
INFO = i. otherwise, the factored form ofAis used to estimate the condition number ofA. if the reciprocal of the condition number is less than machine precision,INFO = N+1is returned as a warning β but like, the routine still goes on to solve forXand compute error bounds as described below. it's not a quitter π«Ά - Solve β the system of equations is solved for
Xusing the factored form ofA. - Refine β iterative refinement is applied to improve the computed solution matrix, and to calculate error bounds and backward error estimates for it. glow-up round β¨
- Un-equilibrate β if equilibration was used, the matrix
Xis premultiplied bydiag(S)so that it solves the original system before equilibration. we put it back how we found it, bestie π
π§Έ Parameters π§Έ
FACT
!> FACT is CHARACTER*1
!> Specifies whether or not the factored form of the matrix A is
!> supplied on entry, and if not, whether the matrix A should be
!> equilibrated before it is factored.
!> = 'F': On entry, AFP contains the factored form of A.
!> If EQUED = 'Y', the matrix A has been equilibrated
!> with scaling factors given by S. AP and AFP will not
!> be modified.
!> = 'N': The matrix A will be copied to AFP and factored.
!> = 'E': The matrix A will be equilibrated if necessary, then
!> copied to AFP and factored.
!>
so FACT is the "did you already do the work or not" switch:
= 'F': you're bringing the factored form ofAinAFPon entry. ifEQUED = 'Y',Ahas already been equilibrated with scaling factors fromS.APandAFPwill not be modified π= 'N':Agets copied toAFPand factored= 'E':Agets equilibrated if necessary, then copied toAFPand factored
UPLO
!> UPLO is CHARACTER*1
!> = 'U': Upper triangle of A is stored;
!> = 'L': Lower triangle of A is stored.
!>
which triangle of A are we storing? that one. 'U' = upper, 'L' = lower. choose wisely π¦
N
!> N is INTEGER
!> The number of linear equations, i.e., the order of the
!> matrix A. N >= 0.
!>
the number of linear equations, i.e. the order of the matrix A. and it's N >= 0, no negative sizes, that's not a vibe.
NRHS
!> NRHS is INTEGER
!> The number of right hand sides, i.e., the number of columns
!> of the matrices B and X. NRHS >= 0.
!>
the number of right hand sides = the number of columns of B and X. also NRHS >= 0. bestie said no negatives in this house π«
AP
!> AP is COMPLEX array, dimension (N*(N+1)/2)
!> On entry, the upper or lower triangle of the Hermitian matrix
!> A, packed columnwise in a linear array, except if FACT = 'F'
!> and EQUED = 'Y', then A must contain the equilibrated matrix
!> diag(S)*A*diag(S). The j-th column of A is stored in the
!> array AP as follows:
!> if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j;
!> if UPLO = 'L', AP(i + (j-1)*(2n-j)/2) = A(i,j) for j<=i<=n.
!> See below for further details. A is not modified if
!> FACT = 'F' or 'N', or if FACT = 'E' and EQUED = 'N' on exit.
!>
!> On exit, if FACT = 'E' and EQUED = 'Y', A is overwritten by
!> diag(S)*A*diag(S).
!>
okay this one's the β¨packed storageβ¨ moment. AP is COMPLEX with dimension (N*(N+1)/2) β that's the whole triangle, no zero-padding, we're saving memory like it's our job (it is).
on entry it holds the upper or lower triangle of the Hermitian matrix A, packed columnwise in a linear array. except β and this is the iconic exception β if FACT = 'F' and EQUED = 'Y', then A must contain the equilibrated matrix diag(S)*A*diag(S).
the j-th column of A lives in AP like this:
if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j;
if UPLO = 'L', AP(i + (j-1)*(2n-j)/2) = A(i,j) for j<=i<=n.
see below for further details (there's literally a whole section below, patience bestie π). A is not modified if FACT = 'F' or 'N', or if FACT = 'E' and EQUED = 'N' on exit.
on exit, if FACT = 'E' and EQUED = 'Y', A is overwritten by diag(S)*A*diag(S). slay but also watch out π
AFP
!> AFP is COMPLEX array, dimension (N*(N+1)/2)
!> If FACT = 'F', then AFP is an input argument and on entry
!> contains the triangular factor U or L from the Cholesky
!> factorization A = U**H*U or A = L*L**H, in the same storage
!> format as A. If EQUED .ne. 'N', then AFP is the factored
!> form of the equilibrated matrix A.
!>
!> If FACT = 'N', then AFP is an output argument and on exit
!> returns the triangular factor U or L from the Cholesky
!> factorization A = U**H * U or A = L * L**H of the original
!> matrix A.
!>
!> If FACT = 'E', then AFP is an output argument and on exit
!> returns the triangular factor U or L from the Cholesky
!> factorization A = U**H*U or A = L*L**H of the equilibrated
!> matrix A (see the description of AP for the form of the
!> equilibrated matrix).
!>
AFP is the factor-holding twin, also COMPLEX, also dimension (N*(N+1)/2). whether it's input or output is literally just vibes based on FACT:
FACT = 'F'β input argument. on entry it contains the triangular factorUorLfrom the Cholesky factorizationA = U**H*UorA = L*L**H, in the same storage format asA. ifEQUED .ne. 'N', thenAFPis the factored form of the equilibrated matrixAπ«ΆFACT = 'N'β output argument. on exit it returns the triangular factorUorLfrom the Cholesky factorizationA = U**H * UorA = L * L**Hof the original matrixAFACT = 'E'β output argument. on exit it returns the triangular factorUorLfrom the Cholesky factorizationA = U**H*UorA = L*L**Hof the equilibrated matrixA(see the description ofAPfor the form of the equilibrated matrix)
EQUED
!> EQUED is CHARACTER*1
!> Specifies the form of equilibration that was done.
!> = 'N': No equilibration (always true if FACT = 'N').
!> = 'Y': Equilibration was done, i.e., A has been replaced by
!> diag(S) * A * diag(S).
!> EQUED is an input argument if FACT = 'F'; otherwise, it is an
!> output argument.
!>
EQUED is CHARACTER*1 and it tells you what equilibration happened:
= 'N': no equilibration (always true ifFACT = 'N')= 'Y': equilibration was done, i.e.Ahas been replaced bydiag(S) * A * diag(S)
and here's the gossip: EQUED is an input argument if FACT = 'F'; otherwise it's an output argument. it's giving "depends on the situation" π
S
!> S is REAL array, dimension (N)
!> The scale factors for A; not accessed if EQUED = 'N'. S is
!> an input argument if FACT = 'F'; otherwise, S is an output
!> argument. If FACT = 'F' and EQUED = 'Y', each element of S
!> must be positive.
!>
S is the REAL array of dimension (N) holding the scale factors for A. not accessed if EQUED = 'N' (if we're not equilibrating, we don't touch it, boundaries bestie π¦).
S is an input argument if FACT = 'F'; otherwise it's an output argument. and important: if FACT = 'F' and EQUED = 'Y', each element of S must be positive. no zeroes, no negatives, positive only, periodt β
B
!> B is COMPLEX array, dimension (LDB,NRHS)
!> On entry, the N-by-NRHS right hand side matrix B.
!> On exit, if EQUED = 'N', B is not modified; if EQUED = 'Y',
!> B is overwritten by diag(S) * B.
!>
B is COMPLEX, dimension (LDB,NRHS). on entry: the N-by-NRHS right hand side matrix B. on exit: if EQUED = 'N', B is not modified; if EQUED = 'Y', B is overwritten by diag(S) * B. so like, check EQUED before you act surprised, ok π
LDB
!> LDB is INTEGER
!> The leading dimension of the array B. LDB >= max(1,N).
!>
LDB is INTEGER β the leading dimension of the array B. and LDB >= max(1,N). don't test it πΈ
X
!> X is COMPLEX array, dimension (LDX,NRHS)
!> If INFO = 0 or INFO = N+1, the N-by-NRHS solution matrix X to
!> the original system of equations. Note that if EQUED = 'Y',
!> A and B are modified on exit, and the solution to the
!> equilibrated system is inv(diag(S))*X.
!>
X is COMPLEX, dimension (LDX,NRHS). if INFO = 0 or INFO = N+1, this is the N-by-NRHS solution matrix X to the original system of equations π
β οΈ note that ifEQUED = 'Y',AandBare modified on exit, and the solution to the equilibrated system isinv(diag(S))*X. keep that in your notes bestie, it matters.
LDX
!> LDX is INTEGER
!> The leading dimension of the array X. LDX >= max(1,N).
!>
LDX is INTEGER, the leading dimension of the array X, and LDX >= max(1,N). same rules, different array π
RCOND
!> RCOND is REAL
!> The estimate of the reciprocal condition number of the matrix
!> A after equilibration (if done). If RCOND is less than the
!> machine precision (in particular, if RCOND = 0), the matrix
!> is singular to working precision. This condition is
!> indicated by a return code of INFO > 0.
!>
RCOND is REAL: the estimate of the reciprocal condition number of the matrix A after equilibration (if done). if RCOND is less than machine precision (in particular, if RCOND = 0), the matrix is singular to working precision β and that condition is flagged by a return code of INFO > 0. so if you see that, it's not a glitch, it's a warning π₯
FERR
!> FERR is REAL array, dimension (NRHS)
!> The estimated forward error bound for each solution vector
!> X(j) (the j-th column of the solution matrix X).
!> If XTRUE is the true solution corresponding to X(j), FERR(j)
!> is an estimated upper bound for the magnitude of the largest
!> element in (X(j) - XTRUE) divided by the magnitude of the
!> largest element in X(j). The estimate is as reliable as
!> the estimate for RCOND, and is almost always a slight
!> overestimate of the true error.
!>
FERR is a REAL array, dimension (NRHS) β the estimated forward error bound for each solution vector X(j) (the j-th column of the solution matrix X).
if XTRUE is the true solution corresponding to X(j), then FERR(j) is an estimated upper bound for the magnitude of the largest element in (X(j) - XTRUE) divided by the magnitude of the largest element in X(j). the estimate is as reliable as the estimate for RCOND, and is almost always a slight overestimate of the true error. it's humble-bragging, honestly π«Ά
BERR
!> BERR is REAL array, dimension (NRHS)
!> The componentwise relative backward error of each solution
!> vector X(j) (i.e., the smallest relative change in
!> any element of A or B that makes X(j) an exact solution).
!>
BERR is a REAL array, dimension (NRHS) β the componentwise relative backward error of each solution vector X(j) (i.e., the smallest relative change in any element of A or B that makes X(j) an exact solution). tiny change energy β¨
WORK
!> WORK is COMPLEX array, dimension (2*N)
!>
WORK is a COMPLEX array, dimension (2*N). that's it, that's the whole parameter. it works so WORK can work π
RWORK
!> RWORK is REAL array, dimension (N)
!>
RWORK is a REAL array, dimension (N). the real one next to the complex one. iconic duo π
INFO
INFOβ INTEGER, the receipts on how it went π= 0: successful exit β¨ slay, we're done< 0: ifINFO = -i, the i-th argument had an illegal value π (you gave it nonsense, bestie)> 0: ifINFO = i, and i isβ¦<= N: the leading principal minor of order i ofAis not positive, so the factorization could not be completed, and the solution has not been computed.RCOND = 0is returned π= N+1:Uis nonsingular, butRCONDis less than machine precision, meaning that the matrix is singular to working precision. Nevertheless, the solution and error bounds are computed because there are a number of situations where the computed solution can be more accurate than the value ofRCONDwould suggest π«Ά (like, don't panic, it's still giving useful answers)
π§ AUTHOR
- Univ. of Tennessee
- Univ. of California Berkeley
- Univ. of Colorado Denver
- NAG Ltd.
π FURTHER DETAILS:
The packed storage scheme is illustrated by the following example when N = 4, UPLO = 'U' π
Two-dimensional storage of the Hermitian matrix A:
a11 a12 a13 a14
a22 a23 a24
a33 a34 (aij = conjg(aji))
a44
Packed storage of the upper triangle of A:
AP = [ a11, a12, a22, a13, a23, a33, a14, a24, a34, a44 ]
Definition at line 309 of file cppsvx.f.
π subroutine dppsvx (character fact, character uplo, integer n, integer nrhs, double precision, dimension( * ) ap, double precision, dimension( * ) afp, character equed, double precision, dimension( * ) s, double precision, dimension( ldb, * ) b, integer ldb, double precision, dimension( ldx, * ) x, integer ldx, double precision rcond, double precision, dimension( * ) ferr, double precision, dimension( * ) berr, double precision, dimension( * ) work, integer, dimension( * ) iwork, integer info)
subroutine dppsvx (character fact, character uplo, integer n, integer nrhs,
double precision, dimension( * ) ap, double precision, dimension( * )
afp, character equed, double precision, dimension( * ) s, double
precision, dimension( ldb, * ) b, integer ldb, double precision,
dimension( ldx, * ) x, integer ldx, double precision rcond, double
precision, dimension( * ) ferr, double precision, dimension( * ) berr,
double precision, dimension( * ) work, integer, dimension( * ) iwork,
integer info)
DPPSVX computes the solution to system of linear equations A * X = B for OTHER matrices πΈ
β¨ Purpose:
DPPSVX uses the Cholesky factorization A = U**T*U or A = L*L**T to compute the solution to a real system of linear equations
A * X = B,
where A is an N-by-N symmetric positive definite matrix stored in packed format and X and B are N-by-NRHS matrices π¦
Error bounds on the solution and a condition estimate are also provided. Yes, we're doing the whole glow-up: solution, error bounds, condition estimate, all of it π
π Description:
The following steps are performed:
- If
FACT = 'E', real scaling factors are computed to equilibrate the system:
diag(S) * A * diag(S) * inv(diag(S)) * X = diag(S) * B
Whether or not the system will be equilibrated depends on the scaling of the matrix A, but if equilibration is used, A is overwritten by diag(S)*A*diag(S) and B by diag(S)*B.
- If
FACT = 'N'or'E', the Cholesky decomposition is used to factor the matrixA(after equilibration ifFACT = 'E') as
A = U**T* U, if UPLO = 'U', or
A = L * L**T, if UPLO = 'L',
where U is an upper triangular matrix and L is a lower triangular matrix.
- If the leading principal minor of order i is not positive, then the routine returns with
INFO = i. Otherwise, the factored form ofAis used to estimate the condition number of the matrixA. If the reciprocal of the condition number is less than machine precision,INFO = N+1is returned as a warning, but the routine still goes on to solve forXand compute error bounds as described below π«Ά - The system of equations is solved for
Xusing the factored form ofA. - Iterative refinement is applied to improve the computed solution matrix and calculate error bounds and backward error estimates for it. Bestie it literally polishes the answer, iconic π₯
- If equilibration was used, the matrix
Xis premultiplied bydiag(S)so that it solves the original system before equilibration.
π§ Parameters
FACTβFACT is CHARACTER*1β specifies whether or not the factored form of the matrixAis supplied on entry, and if not, whether the matrixAshould be equilibrated before it is factored.= 'F': On entry,AFPcontains the factored form ofA. IfEQUED = 'Y', the matrixAhas been equilibrated with scaling factors given byS.APandAFPwill not be modified.= 'N': The matrixAwill be copied toAFPand factored.= 'E': The matrixAwill be equilibrated if necessary, then copied toAFPand factored.
UPLOβUPLO is CHARACTER*1= 'U': Upper triangle ofAis stored;= 'L': Lower triangle ofAis stored.
NβN is INTEGERβ the number of linear equations, i.e., the order of the matrixA.N >= 0.NRHSβNRHS is INTEGERβ the number of right hand sides, i.e., the number of columns of the matricesBandX.NRHS >= 0.APβAP is DOUBLE PRECISION array, dimension (N*(N+1)/2)β on entry, the upper or lower triangle of the symmetric matrixA, packed columnwise in a linear array, except ifFACT = 'F'andEQUED = 'Y', thenAmust contain the equilibrated matrixdiag(S)*A*diag(S). The j-th column ofAis stored in the arrayAPas follows:
if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j;
if UPLO = 'L', AP(i + (j-1)*(2n-j)/2) = A(i,j) for j<=i<=n.
See below for further details. A is not modified if FACT = 'F' or 'N', or if FACT = 'E' and EQUED = 'N' on exit.
On exit, if FACT = 'E' and EQUED = 'Y', A is overwritten by diag(S)*A*diag(S) π she changes in place, main character energy
AFPβAFP is DOUBLE PRECISION array, dimension (N*(N+1)/2)- If
FACT = 'F', thenAFPis an input argument and on entry contains the triangular factorUorLfrom the Cholesky factorizationA = U**T*UorA = L*L**T, in the same storage format asA. IfEQUED .ne. 'N', thenAFPis the factored form of the equilibrated matrixA. - If
FACT = 'N', thenAFPis an output argument and on exit returns the triangular factorUorLfrom the Cholesky factorizationA = U**T * UorA = L * L**Tof the original matrixA. - If
FACT = 'E', thenAFPis an output argument and on exit returns the triangular factorUorLfrom the Cholesky factorizationA = U**T * UorA = L * L**Tof the equilibrated matrixA(see the description ofAPfor the form of the equilibrated matrix).
- If
EQUEDβEQUED is CHARACTER*1β specifies the form of equilibration that was done.= 'N': No equilibration (always true ifFACT = 'N').= 'Y': Equilibration was done, i.e.,Ahas been replaced bydiag(S) * A * diag(S).
EQUED is an input argument if FACT = 'F'; otherwise, it is an output argument π (yes, it switches sides, we love a flexible icon)
SβS is DOUBLE PRECISION array, dimension (N)β the scale factors forA; not accessed ifEQUED = 'N'.Sis an input argument ifFACT = 'F'; otherwise,Sis an output argument. IfFACT = 'F'andEQUED = 'Y', each element ofSmust be positive πΈBβB is DOUBLE PRECISION array, dimension (LDB,NRHS)β on entry, the N-by-NRHS right hand side matrixB. On exit, ifEQUED = 'N',Bis not modified; ifEQUED = 'Y',Bis overwritten bydiag(S) * B.LDBβLDB is INTEGERβ the leading dimension of the arrayB.LDB >= max(1,N).XβX is DOUBLE PRECISION array, dimension (LDX,NRHS)β ifINFO = 0orINFO = N+1, the N-by-NRHS solution matrixXto the original system of equations. Note that ifEQUED = 'Y',AandBare modified on exit, and the solution to the equilibrated system isinv(diag(S))*XπLDXβLDX is INTEGERβ the leading dimension of the arrayX.LDX >= max(1,N).RCONDβRCOND is DOUBLE PRECISIONβ the estimate of the reciprocal condition number of the matrixAafter equilibration (if done). IfRCONDis less than the machine precision (in particular, ifRCOND = 0), the matrix is singular to working precision. This condition is indicated by a return code ofINFO > 0πFERRβFERR is DOUBLE PRECISION array, dimension (NRHS)β the estimated forward error bound for each solution vectorX(j)(the j-th column of the solution matrixX). IfXTRUEis the true solution corresponding toX(j),FERR(j)is an estimated upper bound for the magnitude of the largest element in(X(j) - XTRUE)divided by the magnitude of the largest element inX(j). The estimate is as reliable as the estimate forRCOND, and is almost always a slight overestimate of the true error π«Ά (she's generous, not dramatic)BERRβBERR is DOUBLE PRECISION array, dimension (NRHS)β the componentwise relative backward error of each solution vectorX(j)(i.e., the smallest relative change in any element ofAorBthat makesX(j)an exact solution).WORKWORKβ aDOUBLE PRECISIONarray, dimension(3*N). That's it. That's the whole description. No notes, just vibes πIWORKβ anINTEGERarray, dimension(N). Same energy: name, type, size, done. Iconic minimalism honestly β¨INFOβINTEGER, and this one's the receipts bestie, so listen up π= 0: successful exit π< 0: ifINFO = -i, the i-th argument had an illegal value π> 0: ifINFO = i, and i is:<= N: the leading principal minor of order i ofAis not positive, so the factorization could not be completed, and the solution has not been computed.RCOND = 0is returned π= N+1:Uis nonsingular, butRCONDis less than machine precision, meaning the matrix is singular to working precision. Nevertheless, the solution and error bounds are computed because there are a number of situations where the computed solution can be more accurate than the value ofRCONDwould suggest π«Ά
Author
- Univ. of Tennessee
- Univ. of California Berkeley
- Univ. of Colorado Denver
- NAG Ltd.
Further Details:
The packed storage scheme is illustrated by the following example when N = 4, UPLO = 'U':
Two-dimensional storage of the symmetric matrix A:
a11 a12 a13 a14
a22 a23 a24
a33 a34 (aij = conjg(aji))
a44
Packed storage of the upper triangle of A:
AP = [ a11, a12, a22, a13, a23, a33, a14, a24, a34, a44 ]
Definition at line 309 of file dppsvx.f.
πΈ subroutine sppsvx
subroutine sppsvx (character fact, character uplo, integer n, integer nrhs,
real, dimension( * ) ap, real, dimension( * ) afp, character equed,
real, dimension( * ) s, real, dimension( ldb, * ) b, integer ldb, real,
dimension( ldx, * ) x, integer ldx, real rcond, real, dimension( * )
ferr, real, dimension( * ) berr, real, dimension( * ) work, integer,
dimension( * ) iwork, integer info)
SPPSVX computes the solution to system of linear equations A * X = B for OTHER matrices π¦
π― Purpose
SPPSVX uses the Cholesky factorizationA = U**T*UorA = L*L**Tto compute the solution to a real system of linear equationsA * X = B,whereAis anN-by-Nsymmetric positive definite matrix stored in packed format andXandBareN-by-NRHSmatrices. Error bounds on the solution and a condition estimate are also provided. The whole package, no cap π
π Description
The following steps are performed, in this exact order, main character energy only:
- If
FACT = 'E', real scaling factors are computed to equilibrate the system:
diag(S) * A * diag(S) * inv(diag(S)) * X = diag(S) * B
Whether or not the system will be equilibrated depends on the scaling of the matrix A, but if equilibration is used, A is overwritten by diag(S)*A*diag(S) and B by diag(S)*B.
- If
FACT = 'N'or'E', the Cholesky decomposition is used to factor the matrixA(after equilibration ifFACT = 'E') as
A = U**T* U, if UPLO = 'U', or
A = L * L**T, if UPLO = 'L',
where U is an upper triangular matrix and L is a lower triangular matrix.
- If the leading principal minor of order i is not positive, then the routine returns with
INFO = i. Otherwise, the factored form ofAis used to estimate the condition number of the matrixA. If the reciprocal of the condition number is less than machine precision,INFO = N+1is returned as a warning, but the routine still goes on to solve forXand compute error bounds as described below. She doesn't give up, she just files a complaint π - The system of equations is solved for
Xusing the factored form ofA. - Iterative refinement is applied to improve the computed solution matrix and calculate error bounds and backward error estimates for it. Glow-up step β¨
- If equilibration was used, the matrix
Xis premultiplied bydiag(S)so that it solves the original system before equilibration. Undo the makeover so it matches the original pic π
Parameters
FACTβCHARACTER*1. Specifies whether or not the factored form of the matrixAis supplied on entry, and if not, whether the matrixAshould be equilibrated before it is factored.= 'F': on entry,AFPcontains the factored form ofA. IfEQUED = 'Y', the matrixAhas been equilibrated with scaling factors given byS.APandAFPwill not be modified.= 'N': the matrixAwill be copied toAFPand factored.= 'E': the matrixAwill be equilibrated if necessary, then copied toAFPand factored.
UPLOβCHARACTER*1.= 'U': upper triangle ofAis stored;= 'L': lower triangle ofAis stored.
NβINTEGER. The number of linear equations, i.e., the order of the matrixA.N >= 0.NRHSβINTEGER. The number of right hand sides, i.e., the number of columns of the matricesBandX.NRHS >= 0.APβREALarray, dimension(N*(N+1)/2). On entry, the upper or lower triangle of the symmetric matrixA, packed columnwise in a linear array, except ifFACT = 'F'andEQUED = 'Y', thenAmust contain the equilibrated matrixdiag(S)*A*diag(S). The j-th column ofAis stored in the arrayAPas follows:- if
UPLO = 'U',AP(i + (j-1)*j/2) = A(i,j)for1<=i<=j; - if
UPLO = 'L',AP(i + (j-1)*(2n-j)/2) = A(i,j)forj<=i<=n.
- if
See below for further details. A is not modified if FACT = 'F' or 'N', or if FACT = 'E' and EQUED = 'N' on exit.
On exit, if FACT = 'E' and EQUED = 'Y', A is overwritten by diag(S)*A*diag(S).
AFPβREALarray, dimension(N*(N+1)/2).- If
FACT = 'F', thenAFPis an input argument and on entry contains the triangular factorUorLfrom the Cholesky factorizationA = U**T*UorA = L*L**T, in the same storage format asA. IfEQUED .ne. 'N', thenAFPis the factored form of the equilibrated matrixA. - If
FACT = 'N', thenAFPis an output argument and on exit returns the triangular factorUorLfrom the Cholesky factorizationA = U**T * UorA = L * L**Tof the original matrixA. - If
FACT = 'E', thenAFPis an output argument and on exit returns the triangular factorUorLfrom the Cholesky factorizationA = U**T * UorA = L * L**Tof the equilibrated matrixA(see the description ofAPfor the form of the equilibrated matrix).
- If
EQUEDβCHARACTER*1. Specifies the form of equilibration that was done.= 'N': no equilibration (always true ifFACT = 'N').= 'Y': equilibration was done, i.e.,Ahas been replaced bydiag(S) * A * diag(S).
EQUED is an input argument if FACT = 'F'; otherwise, it is an output argument. Sneaky little switcharoo, love that for her π
SβREALarray, dimension(N). The scale factors forA; not accessed ifEQUED = 'N'.Sis an input argument ifFACT = 'F'; otherwise,Sis an output argument. IfFACT = 'F'andEQUED = 'Y', each element ofSmust be positive.BβREALarray, dimension(LDB,NRHS). On entry, theN-by-NRHSright hand side matrixB. On exit, ifEQUED = 'N',Bis not modified; ifEQUED = 'Y',Bis overwritten bydiag(S) * B.LDBβINTEGER. The leading dimension of the arrayB.LDB >= max(1,N).XβREALarray, dimension(LDX,NRHS). IfINFO = 0orINFO = N+1, theN-by-NRHSsolution matrixXto the original system of equations. Note that ifEQUED = 'Y',AandBare modified on exit, and the solution to the equilibrated system isinv(diag(S))*Xπ«ΆLDXβINTEGER. The leading dimension of the arrayX.LDX >= max(1,N).RCONDβREAL. The estimate of the reciprocal condition number of the matrixAafter equilibration (if done). IfRCONDis less than the machine precision (in particular, ifRCOND = 0), the matrix is singular to working precision. This condition is indicated by a return code ofINFO > 0π¨FERRβREALarray, dimension(NRHS). The estimated forward error bound for each solution vectorX(j)(the j-th column of the solution matrixX). IfXTRUEis the true solution corresponding toX(j),FERR(j)is an estimated upper bound for the magnitude of the largest element in(X(j) - XTRUE)divided by the magnitude of the largest element inX(j). The estimate is as reliable as the estimate forRCOND, and is almost always a slight overestimate of the true error. Humble brag but make it math πBERRβREALarray, dimension(NRHS). The componentwise relative backward error of each solution vectorX(j)(i.e., the smallest relative change in any element ofAorBthat makesX(j)an exact solution).WORKβREALarray, dimension(3*N)πΈ
IWORK
IWORK is INTEGER array, dimension (N) β and that's genuinely the entire description, bestie. The docs give us nothing more, so I'm not gonna invent lore π she's just an integer workspace of size N, living her truth.
INFO
INFO is INTEGER, and here's the whole gossip chain:
= 0: successful exit β¨ everything ate, no crumbs.< 0: ifINFO = -i, the i-th argument had an illegal value π (you passed something cursed).> 0: ifINFO = i, andiisβ¦<= N: the leading principal minor of order i of A is not positive, so the factorization could not be completed, and the solution has not been computed.RCOND = 0is returned. She said nope π= N+1: U is nonsingular, butRCONDis less than machine precision, meaning that the matrix is singular to working precision. Nevertheless, the solution and error bounds are computed, because there are a number of situations where the computed solution can be more accurate than the value ofRCONDwould suggest. So likeβ¦ it's giving β¨technically singularβ¨ but we ball anyway π«Ά
β Author β
- Univ. of Tennessee
- Univ. of California Berkeley
- Univ. of Colorado Denver
- NAG Ltd.
π¦ Further Details:
Okay so picture this: the packed storage scheme, illustrated with N = 4, UPLO = 'U' β we're storing the upper triangle, no waste, very demure, very mindful π
Two-dimensional storage of the symmetric matrix A:
a11 a12 a13 a14
a22 a23 a24
a33 a34 (aij = conjg(aji))
a44
And now the same thing, packed π β packed storage of the upper triangle of A:
AP = [ a11, a12, a22, a13, a23, a33, a14, a24, a34, a44 ]
Notice how every element is accounted for, character for character? That's the icon behavior, no cap π
Definition at line 309 of file sppsvx.f.
π subroutine zppsvx
subroutine zppsvx (character fact, character uplo, integer n, integer nrhs,
complex*16, dimension( * ) ap, complex*16, dimension( * ) afp, character
equed, double precision, dimension( * ) s, complex*16, dimension( ldb, *
) b, integer ldb, complex*16, dimension( ldx, * ) x, integer ldx, double
precision rcond, double precision, dimension( * ) ferr, double
precision, dimension( * ) berr, complex*16, dimension( * ) work, double
precision, dimension( * ) rwork, integer info)
ZPPSVX computes the solution to system of linear equations A * X = B for OTHER matrices
πΈ Purpose:
ZPPSVXuses the Cholesky factorizationA = U**H * UorA = L * L**Hto compute the solution to a complex system of linear equationsA * X = B,where A is an N-by-N Hermitian positive definite matrix stored in packed format and X and B are N-by-NRHS matrices. Error bounds on the solution and a condition estimate are also provided. The full package of care and attention, honestly π
π Description:
The following steps are performed, bestie, in order, no skipping:
- If
FACT = 'E', real scaling factors are computed to equilibrate the system:
diag(S) * A * diag(S) * inv(diag(S)) * X = diag(S) * B
Whether or not the system will be equilibrated depends on the scaling of the matrix A, but if equilibration is used, A is overwritten by diag(S)*A*diag(S) and B by diag(S)*B.
- If
FACT = 'N'or'E', the Cholesky decomposition is used to factor the matrix A (after equilibration ifFACT = 'E') as
A = U**H * U , if UPLO = 'U', or
A = L * L**H, if UPLO = 'L',
where U is an upper triangular matrix, L is a lower triangular matrix, and **H indicates conjugate transpose. Slay π
- If the leading principal minor of order i is not positive, then the routine returns with
INFO = i. Otherwise, the factored form of A is used to estimate the condition number of the matrix A. If the reciprocal of the condition number is less than machine precision,INFO = N+1is returned as a warning, but the routine still goes on to solve for X and compute error bounds as described below. (Warning but still functioning β main character energy, honestly.) - The system of equations is solved for X using the factored form of A.
- Iterative refinement is applied to improve the computed solution matrix and calculate error bounds and backward error estimates for it.
- If equilibration was used, the matrix X is premultiplied by
diag(S)so that it solves the original system before equilibration. She comes back home to the original coordinates π§
π Parameters
FACT
FACT is CHARACTER*1 β specifies whether or not the factored form of the matrix A is supplied on entry, and if not, whether the matrix A should be equilibrated before it is factored.
= 'F': On entry,AFPcontains the factored form of A. IfEQUED = 'Y', the matrix A has been equilibrated with scaling factors given byS.APandAFPwill not be modified.= 'N': The matrix A will be copied toAFPand factored.= 'E': The matrix A will be equilibrated if necessary, then copied toAFPand factored.
UPLO
UPLO is CHARACTER*1:
= 'U': Upper triangle of A is stored;= 'L': Lower triangle of A is stored.
N
N is INTEGER β the number of linear equations, i.e., the order of the matrix A. N >= 0.
NRHS
NRHS is INTEGER β the number of right hand sides, i.e., the number of columns of the matrices B and X. NRHS >= 0.
AP
AP is COMPLEX*16 array, dimension (N*(N+1)/2).
On entry, the upper or lower triangle of the Hermitian matrix A, packed columnwise in a linear array, except if FACT = 'F' and EQUED = 'Y', then A must contain the equilibrated matrix diag(S)*A*diag(S). The j-th column of A is stored in the array AP as follows:
- if
UPLO = 'U',AP(i + (j-1)*j/2) = A(i,j)for1<=i<=j; - if
UPLO = 'L',AP(i + (j-1)*(2n-j)/2) = A(i,j)forj<=i<=n.
See below for further details. A is not modified if FACT = 'F' or 'N', or if FACT = 'E' and EQUED = 'N' on exit. (A stays unbothered, as she should π
)
On exit, if FACT = 'E' and EQUED = 'Y', A is overwritten by diag(S)*A*diag(S).
AFP
AFP is COMPLEX*16 array, dimension (N*(N+1)/2).
- If
FACT = 'F', thenAFPis an input argument and on entry contains the triangular factor U or L from the Cholesky factorizationA = U**H*UorA = L*L**H, in the same storage format as A. IfEQUED .ne. 'N', thenAFPis the factored form of the equilibrated matrix A. - If
FACT = 'N', thenAFPis an output argument and on exit returns the triangular factor U or L from the Cholesky factorizationA = U**H * UorA = L * L**Hof the original matrix A. - If
FACT = 'E', thenAFPis an output argument and on exit returns the triangular factor U or L from the Cholesky factorizationA = U**H * UorA = L * L**Hof the equilibrated matrix A (see the description ofAPfor the form of the equilibrated matrix).
EQUED
EQUED is CHARACTER*1 β specifies the form of equilibration that was done.
= 'N': No equilibration (always true ifFACT = 'N').= 'Y': Equilibration was done, i.e., A has been replaced bydiag(S) * A * diag(S).
EQUED is an input argument if FACT = 'F'; otherwise, it is an output argument. Know which one you're dealing with, bestie π«Ά
S
S is DOUBLE PRECISION array, dimension (N) β the scale factors for A; not accessed if EQUED = 'N'.
S is an input argument if FACT = 'F'; otherwise, S is an output argument. If FACT = 'F' and EQUED = 'Y', each element of S must be positive. Positive only, we don't do negative scale factors in this house π
ββοΈ
B
B is COMPLEX*16 array, dimension (LDB,NRHS).
On entry, the N-by-NRHS right hand side matrix B.
On exit, if EQUED = 'N', B is not modified; if EQUED = 'Y', B is overwritten by diag(S) * B.
LDB
LDB is INTEGER β the leading dimension of the array B. LDB >= max(1,N).
X
X is COMPLEX*16 array, dimension (LDX,NRHS).
If INFO = 0 or INFO = N+1, the N-by-NRHS solution matrix X to the original system of equations. Note that if EQUED = 'Y', A and B are modified on exit, and the solution to the equilibrated system is inv(diag(S))*X. Fold that piece of lore into your brain, it matters π
LDX
LDX is INTEGER β the leading dimension of the array X. LDX >= max(1,N).
RCOND
RCOND is DOUBLE PRECISION β the estimate of the reciprocal condition number of the matrix A after equilibration (if done).
If RCOND is less than the machine precision (in particular, if RCOND = 0), the matrix is singular to working precision. This condition is indicated by a return code of INFO > 0. So if you see that, she's telling you something π¨
FERR
FERR is DOUBLE PRECISION array, dimension (NRHS) β the estimated forward error bound for each solution vector X(j) (the j-th column of the solution matrix X).
If XTRUE is the true solution corresponding to X(j), FERR(j) is an estimated upper bound for the magnitude of the largest element in (X(j) - XTRUE) divided by the magnitude of the largest element in X(j). The estimate is as reliable as the estimate for RCOND, and is almost always a slight overestimate of the true error. Overcautious queen, but we respect her π
BERR
BERRβ itβs aDOUBLE PRECISIONarray, dimension(NRHS). The componentwise relative backward error of each solution vectorX(j)(i.e., the smallest relative change in any element ofAorBthat makesX(j)an exact solution). πWORKβ aCOMPLEX*16array, dimension(2*N). β¨RWORKβ aDOUBLE PRECISIONarray, dimension(N). πΈINFOβ anINTEGER. Hereβs the whole mood:= 0: successful exit< 0: ifINFO = -i, thei-th argument had an illegal value> 0: ifINFO = i, andiis:<= N: the leading principal minor of orderiofAis not positive, so the factorization could not be completed, and the solution has not been computed.RCOND = 0is returned.= N+1:Uis nonsingular, butRCONDis less than machine precision, meaning that the matrix is singular to working precision. Nevertheless, the solution and error bounds are computed because there are a number of situations where the computed solution can be more accurate than the value ofRCONDwould suggest.
β¨ Author β¨
No cap, these legends wrote it:
- Univ. of Tennessee
- Univ. of California Berkeley
- Univ. of Colorado Denver
- NAG Ltd.
πΈ Further Details πΈ
The packed storage scheme is illustrated by the following example when N = 4, UPLO = 'U':
Two-dimensional storage of the Hermitian matrix A:
a11 a12 a13 a14
a22 a23 a24
a33 a34 (aij = conjg(aji))
a44
Packed storage of the upper triangle of A:
AP = [ a11, a12, a22, a13, a23, a33, a14, a24, a34, a44 ]
Definition at line 309 of file zppsvx.f. π
π€ Author (Doxygenβs receipt) π€
Generated automatically by Doxygen for LAPACK from the source code. π«Ά
Okay bestie, thatβs the whole page! Footer check: LAPACK Version 3.12.0 and this iconic lil page is ppsvx(3) β thatβs the source/version flex and page name, signed off with love. Periodt. π
π¦ where this page comes from
- arch rolling: lapack-doc 3.12.1-2 Β· custom
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms