doubleOTHERsolve(3)

πŸ“¦
version 3.11.0 Β· 2 versions
, in debian bookworm

✨ doubleOTHERsolve(3) β€” LAPACK's double Other Solve Routines ✨

okay bestie, welcome to the doubleOTHERsolve(3) page from LAPACK. this is the double Other Solve Routines group, and it's literally giving linear algebra main character energy. πŸ’… no cap, we're about to go through every single function and parameter, so grab your iced coffee πŸ§‹ and let's slay. ✨


🌸 NAME 🌸

doubleOTHERsolve β€” double Other Solve Routines πŸ’–


✨ SYNOPSIS ✨

πŸŽ€ Functions πŸŽ€

okay so here's the whole friend group:

  • dgglse β€” DGGLSE solves overdetermined or underdetermined systems for OTHER matrices.
subroutine dgglse (M, N, P, A, LDA, B, LDB, C, D, X, WORK, LWORK, INFO)
  • dpbsv β€” DPBSV computes the solution to system of linear equations A * X = B for OTHER matrices.
subroutine dpbsv (UPLO, N, KD, NRHS, AB, LDAB, B, LDB, INFO)
  • dpbsvx β€” DPBSVX computes the solution to system of linear equations A * X = B for OTHER matrices.
subroutine dpbsvx (FACT, UPLO, N, KD, NRHS, AB, LDAB, AFB, LDAFB, EQUED,
    S, B, LDB, X, LDX, RCOND, FERR, BERR, WORK, IWORK, INFO)
  • dppsv β€” DPPSV computes the solution to system of linear equations A * X = B for OTHER matrices.
subroutine dppsv (UPLO, N, NRHS, AP, B, LDB, INFO)
  • dppsvx β€” DPPSVX computes the solution to system of linear equations A * X = B for OTHER matrices.
subroutine dppsvx (FACT, UPLO, N, NRHS, AP, AFP, EQUED, S, B, LDB, X,
    LDX, RCOND, FERR, BERR, WORK, IWORK, INFO)
  • dspsv β€” DSPSV computes the solution to system of linear equations A * X = B for OTHER matrices.
subroutine dspsv (UPLO, N, NRHS, AP, IPIV, B, LDB, INFO)
  • dspsvx β€” DSPSVX computes the solution to system of linear equations A * X = B for OTHER matrices.
subroutine dspsvx (FACT, UPLO, N, NRHS, AP, AFP, IPIV, B, LDB, X, LDX,
    RCOND, FERR, BERR, WORK, IWORK, INFO)

🌈 Detailed Description 🌈

This is the group of double Other Solve routines. That's the whole vibe. ✨


πŸ‘‘ Function Documentation πŸ‘‘

πŸ’– subroutine dgglse πŸ’–

subroutine dgglse (integer M, integer N, integer P, double precision,
    dimension( lda, * ) A, integer LDA, double precision, dimension( ldb, *
    ) B, integer LDB, double precision, dimension( * ) C, double precision,
    dimension( * ) D, double precision, dimension( * ) X, double precision,
    dimension( * ) WORK, integer LWORK, integer INFO)

DGGLSE solves overdetermined or underdetermined systems for OTHER matrices.

πŸŽ€ Purpose πŸŽ€

DGGLSE solves the linear equality-constrained least squares (LSE) problem:

        minimize || c - A*x ||_2   subject to   B*x = d

where A is an M-by-N matrix, B is a P-by-N matrix, c is a given M-vector, and d is a given P-vector. It is assumed that

P <= N <= M+P

and

                 rank(B) = P and  rank( (A) ) = N.
                                      ( (B) )

These conditions ensure that the LSE problem has a unique solution, which is obtained using a generalized RQ factorization of the matrices (B, A) given by

           B = (0 R)*Q,   A = Z*T*Q.

πŸ’… Parameters πŸ’…

  • M β€” M is INTEGER. The number of rows of the matrix A. M >= 0.
  • N β€” N is INTEGER. The number of columns of the matrices A and B. N >= 0.
  • P β€” P is INTEGER. The number of rows of the matrix B. 0 <= P <= N <= M+P.
  • A β€” A is DOUBLE PRECISION array, dimension (LDA,N). On entry, the M-by-N matrix A. On exit, the elements on and above the diagonal of the array contain the min(M,N)-by-N upper trapezoidal matrix T.
  • LDA β€” LDA is INTEGER. The leading dimension of the array A. LDA >= max(1,M).
  • B β€” B is DOUBLE PRECISION array, dimension (LDB,N). On entry, the P-by-N matrix B. On exit, the upper triangle of the subarray B(1:P,N-P+1:N) contains the P-by-P upper triangular matrix R.
  • LDB β€” LDB is INTEGER. The leading dimension of the array B. LDB >= max(1,P).
  • C β€” C is DOUBLE PRECISION array, dimension (M). On entry, C contains the right hand side vector for the least squares part of the LSE problem. On exit, the residual sum of squares for the solution is given by the sum of squares of elements N-P+1 to M of vector C.
  • D β€” D is DOUBLE PRECISION array, dimension (P). On entry, D contains the right hand side vector for the constrained equation. On exit, D is destroyed.
  • X β€” X is DOUBLE PRECISION array, dimension (N). On exit, X is the solution of the LSE problem.
  • WORK β€” WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)). On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
  • LWORK β€” LWORK is INTEGER. The dimension of the array WORK. LWORK >= max(1,M+N+P). For optimum performance LWORK >= P+min(M,N)+max(M,N)*NB, where NB is an upper bound for the optimal blocksizes for DGEQRF, SGERQF, DORMQR and SORMRQ.

If LWORK = -1, then a workspace query is assumed; the routine only calculates the optimal size of the WORK array, returns this value as the first entry of the WORK array, and no error message related to LWORK is issued by XERBLA.

  • INFO β€” INFO is INTEGER.
    • = 0: successful exit.
    • < 0: if INFO = -i, the i-th argument had an illegal value.
    • = 1: the upper triangular factor R associated with B in the generalized RQ factorization of the pair (B, A) is singular, so that rank(B) < P; the least squares solution could not be computed.
    • = 2: the (N-P) by (N-P) part of the upper trapezoidal factor T associated with A in the generalized RQ factorization of the pair (B, A) is singular, so that
rank( (A) ) < N; the least squares solution could not
    ( (B) )
be computed.

πŸ‘‘ Author πŸ‘‘

Univ. of Tennessee

Univ. of California Berkeley

Univ. of Colorado Denver

NAG Ltd.


πŸ’– subroutine dpbsv πŸ’–

subroutine dpbsv (character UPLO, integer N, integer KD, integer NRHS,
    double precision, dimension( ldab, * ) AB, integer LDAB, double
    precision, dimension( ldb, * ) B, integer LDB, integer INFO)

DPBSV computes the solution to system of linear equations A * X = B for OTHER matrices.

πŸŽ€ Purpose πŸŽ€

DPBSV computes the solution to a real system of linear equations

   A * X = B,

where A is an N-by-N symmetric positive definite band matrix and X and B are N-by-NRHS matrices.

The Cholesky decomposition is used to factor A as

   A = U**T * U,  if UPLO = 'U', or
   A = L * L**T,  if UPLO = 'L',

where U is an upper triangular band matrix, and L is a lower triangular band matrix, with the same number of superdiagonals or subdiagonals as A. The factored form of A is then used to solve the system of equations A * X = B.

πŸ’… Parameters πŸ’…

  • 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.
  • KD β€” KD is INTEGER. The number of superdiagonals of the matrix A if UPLO = 'U', or the number of subdiagonals if UPLO = 'L'. KD >= 0.
  • NRHS β€” NRHS is INTEGER. The number of right hand sides, i.e., the number of columns of the matrix B. NRHS >= 0.
  • AB β€” AB is DOUBLE PRECISION array, dimension (LDAB,N). On entry, the upper or lower triangle of the symmetric band matrix A, stored in the first KD+1 rows of the array. The j-th column of A is stored in the j-th column of the array AB as follows:
    • if UPLO = 'U', AB(KD+1+i-j,j) = A(i,j) for max(1,j-KD)<=i<=j;
    • if UPLO = 'L', AB(1+i-j,j) = A(i,j) for j<=i<=min(N,j+KD). See below for further details.

On exit, if INFO = 0, the triangular factor U or L from the Cholesky factorization A = U**T*U or A = L*L**T of the band matrix A, in the same storage format as A.

  • LDAB β€” LDAB is INTEGER. The leading dimension of the array AB. LDAB >= KD+1.
  • B β€” B is DOUBLE PRECISION array, dimension (LDB,NRHS). On entry, the N-by-NRHS right hand side matrix B. On exit, if INFO = 0, the N-by-NRHS solution matrix X.
  • LDB β€” LDB is INTEGER. The leading dimension of the array B. LDB >= max(1,N).
  • INFO β€” INFO is INTEGER.
    • = 0: successful exit
    • < 0: if INFO = -i, the i-th argument had an illegal value
    • > 0: if INFO = i, the leading minor of order i of A is not positive definite, so the factorization could not be completed, and the solution has not been computed.

πŸ‘‘ Author πŸ‘‘

Univ. of Tennessee

Univ. of California Berkeley

Univ. of Colorado Denver

NAG Ltd.

🌸 Further Details: 🌸

The band storage scheme is illustrated by the following example, when N = 6, KD = 2, and UPLO = 'U':

On entry:                       On exit:

    *    *   a13  a24  a35  a46      *    *   u13  u24  u35  u46
    *   a12  a23  a34  a45  a56      *   u12  u23  u34  u45  u56
   a11  a22  a33  a44  a55  a66     u11  u22  u33  u44  u55  u66

Similarly, if UPLO = 'L' the format of A is as follows:

On entry:                       On exit:

   a11  a22  a33  a44  a55  a66     l11  l22  l33  l44  l55  l66
   a21  a32  a43  a54  a65   *      l21  l32  l43  l54  l65   *
   a31  a42  a53  a64   *    *      l31  l42  l53  l64   *    *

Array elements marked * are not used by the routine.


πŸ’– subroutine dpbsvx πŸ’–

subroutine dpbsvx (character FACT, character UPLO, integer N, integer KD,
    integer NRHS, double precision, dimension( ldab, * ) AB, integer LDAB,
    double precision, dimension( ldafb, * ) AFB, integer LDAFB, 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)

DPBSVX computes the solution to system of linear equations A * X = B for OTHER matrices.

πŸŽ€ Purpose πŸŽ€

...DPBSVX is out here using 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 band matrix and X and B are N-by-NRHS matrices. 🫢

And bestie, it does not just hand you the answer β€” it also provides error bounds on the solution and a condition estimate. Overachiever behaviour, honestly. πŸ‘‘

Description πŸ’«

Okay so here's the whole little journey it goes on, step by step:

  1. 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.

  1. If FACT = 'N' or 'E', the Cholesky decomposition is used to factor the matrix A (after equilibration if FACT = 'E') as
A = U**T * U,  if UPLO = 'U', or
A = L * L**T,  if UPLO = 'L',

where U is an upper triangular band matrix, and L is a lower triangular band matrix.

  1. If the leading i-by-i principal minor is not positive definite, 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+1 is returned as a warning, but the routine still goes on to solve for X and compute error bounds as described below. 😀
  2. The system of equations is solved for X using the factored form of A.
  3. Iterative refinement is applied to improve the computed solution matrix and calculate error bounds and backward error estimates for it. ✨
  4. If equilibration was used, the matrix X is premultiplied by diag(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 matrix A is supplied on entry, and if not, whether the matrix A should be equilibrated before it is factored.

  • = 'F': On entry, AFB contains the factored form of A. If EQUED = 'Y', the matrix A has been equilibrated with scaling factors given by S. AB and AFB will not be modified.
  • = 'N': The matrix A will be copied to AFB and factored.
  • = 'E': The matrix A will be equilibrated if necessary, then copied to AFB and 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.

KD πŸ¦‹

KD is INTEGER. The number of superdiagonals of the matrix A if UPLO = 'U', or the number of subdiagonals if UPLO = 'L'. KD >= 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.

AB 🧚

AB is DOUBLE PRECISION array, dimension (LDAB,N).

On entry, the upper or lower triangle of the symmetric band matrix A, stored in the first KD+1 rows of the 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 j-th column of the array AB as follows:

if UPLO = 'U', AB(KD+1+i-j,j) = A(i,j) for max(1,j-KD)<=i<=j;
if UPLO = 'L', AB(1+i-j,j)    = A(i,j) for j<=i<=min(N,j+KD).

See below for further details. πŸ‘€

On exit, if FACT = 'E' and EQUED = 'Y', A is overwritten by diag(S)*A*diag(S).

LDAB πŸ“

LDAB is INTEGER. The leading dimension of the array A. LDAB >= KD+1.

AFB πŸ“

AFB is DOUBLE PRECISION array, dimension (LDAFB,N).

  • If FACT = 'F', then AFB is an input argument and on entry contains the triangular factor U or L from the Cholesky factorization A = U**T*U or A = L*L**T of the band matrix A, in the same storage format as A (see AB). If EQUED = 'Y', then AFB is the factored form of the equilibrated matrix A.
  • If FACT = 'N', then AFB is an output argument and on exit returns the triangular factor U or L from the Cholesky factorization A = U**T*U or A = L*L**T.
  • If FACT = 'E', then AFB is an output argument and on exit returns the triangular factor U or L from the Cholesky factorization A = U**T*U or A = L*L**T of the equilibrated matrix A (see the description of A for the form of the equilibrated matrix).

LDAFB πŸ“

LDAFB is INTEGER. The leading dimension of the array AFB. LDAFB >= KD+1.

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.

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.

B πŸ’œ

B is DOUBLE PRECISION 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 DOUBLE PRECISION 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.

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.

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.

BERR πŸ“Š

BERR is DOUBLE PRECISION 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).

WORK πŸ› οΈ

WORK is DOUBLE PRECISION array, dimension (3*N)

IWORK 🧰

IWORK is INTEGER array, dimension (N)

INFO 🚨

INFO is INTEGER

  • = 0: successful exit
  • < 0: if INFO = -i, the i-th argument had an illegal value
  • > 0: if INFO = i, and i is
    • <= N: the leading minor of order i of A is not positive definite, so the factorization could not be completed, and the solution has not been computed. RCOND = 0 is returned.
    • = N+1: U is nonsingular, but RCOND is 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 of RCOND would suggest.

Author πŸ‘‘

  • Univ. of Tennessee
  • Univ. of California Berkeley
  • Univ. of Colorado Denver
  • NAG Ltd.

Further Details πŸ”

The band storage scheme is illustrated by the following example, when N = 6, KD = 2, and UPLO = 'U':

Two-dimensional storage of the symmetric matrix A:

   a11  a12  a13
        a22  a23  a24
             a33  a34  a35
                  a44  a45  a46
                       a55  a56
   (aij=conjg(aji))         a66

Band storage of the upper triangle of A:

 *    *   a13  a24  a35  a46
 *   a12  a23  a34  a45  a56
a11  a22  a33  a44  a55  a66

Similarly, if UPLO = 'L' the format of A is as follows:

a11  a22  a33  a44  a55  a66
a21  a32  a43  a54  a65   *
a31  a42  a53  a64   *    *

Array elements marked * are not used by the routine. πŸ™…


subroutine dppsv (character UPLO, integer N, integer NRHS, double precision,
    dimension( * ) AP, double precision, dimension( ldb, * ) B, integer LDB,
    integer INFO)

DPPSV computes the solution to system of linear equations A * X = B for OTHER matrices

Purpose πŸ’–

DPPSV computes 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. πŸ¦‹

okay so bestie, the Cholesky decomposition is used to factor A 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. The factored form of A is then used to solve the system of equations A * X = B. periodt πŸ’…


✨ Parameters ✨

  • 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. no cap ✨
  • NRHS β€” NRHS is INTEGER. The number of right hand sides, i.e., the number of columns of the matrix B. NRHS >= 0.
  • AP β€” AP is DOUBLE PRECISION array, dimension (N*(N+1)/2). On entry, the upper or lower triangle of the symmetric matrix A, packed columnwise in a linear array. 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.

On exit, if INFO = 0, the factor U or L from the Cholesky factorization A = U**T*U or A = L*L**T, in the same storage format as A.

  • B β€” B is DOUBLE PRECISION array, dimension (LDB,NRHS). On entry, the N-by-NRHS right hand side matrix B. On exit, if INFO = 0, the N-by-NRHS solution matrix X.
  • LDB β€” LDB is INTEGER. The leading dimension of the array B. LDB >= max(1,N).
  • INFO β€” INFO is INTEGER
    • = 0: successful exit
    • < 0: if INFO = -i, the i-th argument had an illegal value
    • > 0: if INFO = i, the leading minor of order i of A is not positive definite, so the factorization could not be completed, and the solution has not been computed.

πŸ’– 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 ]

✨ subroutine dppsvx ✨

   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.

✨ Description: ✨

The following steps are performed:

  1. 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.

  1. If FACT = 'N' or 'E', the Cholesky decomposition is used to factor the matrix A (after equilibration if FACT = '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.

  1. If the leading i-by-i principal minor is not positive definite, 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+1 is returned as a warning, but the routine still goes on to solve for X and compute error bounds as described below.
  2. The system of equations is solved for X using the factored form of A.
  3. Iterative refinement is applied to improve the computed solution matrix and calculate error bounds and backward error estimates for it.
  4. If equilibration was used, the matrix X is premultiplied by diag(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 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.
  • 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 DOUBLE PRECISION array, dimension (N*(N+1)/2). On entry, the upper or lower triangle of the symmetric 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).

  • AFP β€” AFP is DOUBLE PRECISION 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**T*U or A = L*L**T, 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**T * U or A = L * L**T 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**T * U or A = L * L**T of the equilibrated matrix A (see the description of AP for 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.
  • 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.
  • B β€” B is DOUBLE PRECISION 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 DOUBLE PRECISION 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.
  • 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.
  • FERR β€”
  • FERR β€” DOUBLE PRECISION array, dimension (NRHS)</b>. It's the estimated forward error bound for each solution vector X(j) (that's the j-th column of the solution matrix X, bestie πŸ’–). If XTRUE is the true solution that goes with X(j), then FERR(j) is an estimated upper bound on the magnitude of the biggest element in (X(j) - XTRUE) divided by the magnitude of the biggest element in X(j). How reliable is it? As reliable as the estimate for RCOND, and it's almost always a slight overestimate of the true error. Not me being generous, it's just the math 😌
  • BERR β€” DOUBLE PRECISION array, dimension (NRHS)</b>. This one's the componentwise relative backward error of each solution vector X(j). In normal-human words: the smallest relative change in any element of A or B that would make X(j) an exact solution. So basically "how much would I have to lie to make this perfect" πŸ’€
  • WORK β€” DOUBLE PRECISION array, dimension (3*N)</b>. Just vibing, holding scratch space.
  • IWORK β€” INTEGER array, dimension (N)</b>. Same energy, integer edition ✨
  • INFO β€” INTEGER</b>, the status report, the vibe check of the whole operation:
    • = 0: successful exit πŸŽ‰ we ate.
    • < 0: if INFO = -i, the i-th argument had an illegal value. Rude of you, honestly.
    • > 0: if INFO = i, and i is:
      • <= N: the leading minor of order i of A is not positive definite, so the factorization could not be completed, and the solution has not been computed. RCOND = 0 is returned. πŸ’€
      • = N+1: U is nonsingular, but RCOND is less than machine precision, meaning the matrix is singular to working precision. BUT β€” and this is the plot twist β€” the solution and error bounds are still computed, because there are a bunch of situations where the computed solution can be more accurate than the value of RCOND would suggest. Main character energy from a singular matrix, honestly πŸ‘‘

🫢 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 ]

✨ subroutine dspsv ✨

subroutine dspsv (character UPLO, integer N, integer NRHS, double precision,
    dimension( * ) AP, integer, dimension( * ) IPIV, double precision,
    dimension( ldb, * ) B, integer LDB, integer INFO)

DSPSV computes the solution to system of linear equations A * X = B for OTHER matrices. (Yes, "OTHER" β€” that's literally what it says, don't come for me 😭)

Purpose:

DSPSV computes the solution to a real system of linear equations

A * X = B,

where A is an N-by-N symmetric matrix stored in packed format and X and B are N-by-NRHS matrices.

The diagonal pivoting method is used to factor A as

A = U * D * U**T,  if UPLO = 'U', or
A = L * D * L**T,  if UPLO = 'L',

where U (or L) is a product of permutation and unit upper (lower) triangular matrices, D is symmetric and block diagonal with 1-by-1 and 2-by-2 diagonal blocks. The factored form of A is then used to solve the system of equations A * X = B. So it factors, then it solves. Two-step slay πŸ’…

Parameters

  • UPLO β€” CHARACTER*1</b>. Pick your triangle, bestie:
    • = 'U': Upper triangle of A is stored;
    • = 'L': Lower triangle of A is stored.
  • N β€” INTEGER</b>. The number of linear equations, i.e., the order of the matrix A. N >= 0.
  • NRHS β€” INTEGER</b>. The number of right hand sides, i.e., the number of columns of the matrix B. NRHS >= 0.
  • AP β€” DOUBLE PRECISION array, dimension (N*(N+1)/2)</b>. On entry, the upper or lower triangle of the symmetric matrix A, packed columnwise in a linear array. 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. πŸ‘€

On exit, the block diagonal matrix D and the multipliers used to obtain the factor U or L from the factorization A = U*D*U**T or A = L*D*L**T as computed by DSPTRF, stored as a packed triangular matrix in the same storage format as A.

  • IPIV β€” INTEGER array, dimension (N)</b>. Details of the interchanges and the block structure of D, as determined by DSPTRF. Okay so listen carefully, this part is fiddly:
    • If IPIV(k) > 0, then rows and columns k and IPIV(k) were interchanged, and D(k,k) is a 1-by-1 diagonal block.
    • If UPLO = 'U' and IPIV(k) = IPIV(k-1) < 0, then rows and columns k-1 and -IPIV(k) were interchanged and D(k-1:k,k-1:k) is a 2-by-2 diagonal block.
    • If UPLO = 'L' and IPIV(k) = IPIV(k+1) < 0, then rows and columns k+1 and -IPIV(k) were interchanged and D(k:k+1,k:k+1) is a 2-by-2 diagonal block.
  • B β€” DOUBLE PRECISION array, dimension (LDB,NRHS)</b>. On entry, the N-by-NRHS right hand side matrix B. On exit, if INFO = 0, the N-by-NRHS solution matrix X. Glow up moment ✨
  • LDB β€” INTEGER</b>. The leading dimension of the array B. LDB >= max(1,N).
  • INFO β€” INTEGER</b>:
    • = 0: successful exit πŸ₯³
    • < 0: if INFO = -i, the i-th argument had an illegal value.
    • > 0: if INFO = i, D(i,i) is exactly zero. The factorization has been completed, but the block diagonal matrix D is exactly singular, so the solution could not be computed. 😭

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 = aji)
               a44

Packed storage of the upper triangle of A:

AP = [ a11, a12, a22, a13, a23, a33, a14, a24, a34, a44 ]

✨ subroutine dspsvx ✨

subroutine dspsvx (character FACT, character UPLO, integer N, integer NRHS,
    double precision, dimension( * ) AP, double precision, dimension( * )
    AFP, integer, dimension( * ) IPIV, 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)

DSPSVX computes the solution to system of linear equations A * X = B for OTHER matrices.

Purpose:

DSPSVX uses the diagonal pivoting factorization A = U*D*U**T or A = L*D*L**T to compute the solution to a real system of linear equations A * X = B, where A is an N-by-N symmetric 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. So it's the overachiever of the family, it does extra πŸŽ€

Description:

The following steps are performed:

  1. If FACT = 'N', the diagonal pivoting method is used to factor A as
A = U * D * U**T,  if UPLO = 'U', or
A = L * D * L**T,  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-by-1 and 2-by-2 diagonal blocks.

  1. If some D(i,i)=0, so that D is exactly singular, 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+1 is returned as a warning, but the routine still goes on to solve for X and compute error bounds as described below. She doesn't give up, she just warns you first πŸ’…
  2. The system of equations is solved for X using the factored form of A.
  3. Iterative refinement is applied to improve the computed solution matrix and calculate error bounds and backward error estimates for it. Glow up round two ✨

Parameters

  • FACT β€” CHARACTER*1</b>. Specifies whether or not the factored form of A has been supplied on entry.
    • = 'F': On entry, AFP and IPIV contain the factored form of A. AP, AFP and IPIV will not be modified.
    • = 'N': The matrix A will be copied to AFP and factored.
  • UPLO β€” CHARACTER*1</b>:
    • = 'U': Upper triangle of A is stored;
    • = 'L': Lower triangle of A is stored.
  • N β€” INTEGER</b>. The number of linear equations, i.e., the order of the matrix A. N >= 0.
  • NRHS β€” INTEGER</b>. The number of right hand sides, i.e., the number of columns of the matrices B and X. NRHS >= 0.
  • AP β€” DOUBLE PRECISION array, dimension (N*(N+1)/2)</b>. The upper or lower triangle of the symmetric matrix A, packed columnwise in a linear array. 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)*(2*n-j)/2) = A(i,j) for j<=i<=n.

See below for further details. (Yes, again. It's important, okay πŸ™ˆ)

  • AFP β€” DOUBLE PRECISION array, dimension (N*(N+1)/2)</b>. If FACT = 'F', then AFP is an input argument and on entry contains the block diagonal matrix D and the multipliers used to obtain the factor U or L from the factorization A = U*D*U**T or A = L*D*L**T as computed by DSPTRF, stored as a packed triangular matrix in the same storage format as A.

And if FACT = 'N', then AFP is an output argument and on exit it contains the block diagonal matrix D and the multipliers used to obtain the factor U or L from the factorization A = U*D*U**T or A = L*D*L**T as computed by DSPTRF, stored as a packed triangular matrix in the same storage format as A. Slay. πŸ’…

  • IPIV β€” IPIV is INTEGER array, dimension (N). Okay so if FACT = 'F', then IPIV is an input argument and on entry it contains details of the interchanges and the block structure of D, as determined by DSPTRF. If IPIV(k) > 0, then rows and columns k and IPIV(k) were interchanged and D(k,k) is a 1-by-1 diagonal block. If UPLO = 'U' and IPIV(k) = IPIV(k-1) < 0, then rows and columns k-1 and -IPIV(k) were interchanged and D(k-1:k,k-1:k) is a 2-by-2 diagonal block. If UPLO = 'L' and IPIV(k) = IPIV(k+1) < 0, then rows and columns k+1 and -IPIV(k) were interchanged and D(k:k+1,k:k+1) is a 2-by-2 diagonal block. If FACT = 'N', then IPIV is an output argument and on exit it contains details of the interchanges and the block structure of D, as determined by DSPTRF.
  • B β€” B is DOUBLE PRECISION array, dimension (LDB,NRHS). It's the N-by-NRHS right hand side matrix B. The main character of the equation, periodt. πŸ‘‘
  • LDB β€” LDB is INTEGER. The leading dimension of the array B. LDB >= max(1,N). Don't play with this, bestie. 🚨
  • X β€” X is DOUBLE PRECISION array, dimension (LDX,NRHS). If INFO = 0 or INFO = N+1, this is the N-by-NRHS solution matrix X. The glow-up we've been waiting for. ✨
  • LDX β€” LDX is INTEGER. The leading dimension of the array X. LDX >= max(1,N). Respect the dimension, fr fr. πŸ’―
  • RCOND β€” RCOND is DOUBLE PRECISION. The estimate of the reciprocal condition number of the matrix A. 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 RCOND is giving nothing, that's a red flag. 🚩
  • 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. So it's like, cautious but honest. 🫢
  • BERR β€” BERR is DOUBLE PRECISION 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 changes, big drama. πŸ’€
  • WORK β€” WORK is DOUBLE PRECISION array, dimension (3*N). The workspace. It's doing the behind-the-scenes labor. πŸ› οΈ
  • IWORK β€” IWORK is INTEGER array, dimension (N). More workspace, but make it integer. πŸ”’
  • INFO β€” INFO is INTEGER. The vibe check on your exit status. Here's the breakdown:
    • = 0: successful exit. We ate. πŸ’…
    • < 0: if INFO = -i, the i-th argument had an illegal value. Not iconic. πŸ™ˆ
    • > 0: if INFO = i, and i is:
      • <= N: D(i,i) is exactly zero. The factorization has been completed but the factor D is exactly singular, so the solution and error bounds could not be computed. RCOND = 0 is returned. Oof. πŸ’€
      • = N+1: D is nonsingular, but RCOND is 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 of RCOND would suggest. So like, plot twist, it might still serve. πŸ”₯

πŸ‘‘ 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 = aji)
                            a44

Packed storage of the upper triangle of A:

AP = [ a11, a12, a22, a13, a23, a33, a14, a24, a34, a44 ]

πŸ’– Author (Doxygen's Version) πŸ’–

Generated automatically by Doxygen for LAPACK from the source code.


And that's the whole page, bestie! This iconic manual page is doubleOTHERsolve(3), version 3.11.0, dated Sun Nov 27 2022. Stay linear, stay factored, and don't forget to check your RCOND. Bye! πŸ’œπŸ¦‹

πŸ“¦ where this page comes from