latrs(3)
๐ latrs(3) โ from the Library Functions Manual โ triangular solve with robust scaling ๐
๐ธ NAME ๐ธ
latrs โ latrs: triangular solve with robust scaling ๐
โจ SYNOPSIS โจ
๐ Functions ๐
clatrsโ CLATRS solves a triangular system of equations with the scale factor set to prevent overflow. Signature:subroutine clatrs (uplo, trans, diag, normin, n, a, lda, x, scale, cnorm, info)dlatrsโ DLATRS solves a triangular system of equations with the scale factor set to prevent overflow. Signature:subroutine dlatrs (uplo, trans, diag, normin, n, a, lda, x, scale, cnorm, info)slatrsโ SLATRS solves a triangular system of equations with the scale factor set to prevent overflow. Signature:subroutine slatrs (uplo, trans, diag, normin, n, a, lda, x, scale, cnorm, info)zlatrsโ ZLATRS solves a triangular system of equations with the scale factor set to prevent overflow. Signature:subroutine zlatrs (uplo, trans, diag, normin, n, a, lda, x, scale, cnorm, info)
๐ DETAILED DESCRIPTION ๐
Okay so this page is the full breakdown of the latrs family โ the routines that solve triangular systems with scaling so overflow doesn't crash the party. ๐
๐ง FUNCTION DOCUMENTATION ๐ง
Each subroutine gets its own little spotlight. ๐
๐ subroutine clatrs ๐
subroutine clatrs (character uplo, character trans, character diag, character normin, integer n, complex, dimension( lda, * ) a, integer lda, complex, dimension( * ) x, real scale, real, dimension( * ) cnorm, integer info)
CLATRS solves a triangular system of equations with the scale factor set to prevent overflow. ๐
๐ฏ Purpose ๐ฏ
CLATRS solves one of the triangular systems:
A * x = s*b, A**T * x = s*b, or A**H * x = s*b,
with scaling to prevent overflow. Here A is an upper or lower triangular matrix, A**T denotes the transpose of A, A**H denotes the conjugate transpose of A, x and b are n-element vectors, and s is a scaling factor, usually less than or equal to 1, chosen so that the components of x will be less than the overflow threshold. If the unscaled problem will not cause overflow, the Level 2 BLAS routine CTRSV is called. If the matrix A is singular (A(j,j) = 0 for some j), then s is set to 0 and a non-trivial solution to A*x = 0 is returned.
๐จ Singular matrix alert: ifA(j,j) = 0for somej, thensis set to0and a non-trivial solution toA*x = 0is returned. That's the contract, bestie. ๐
๐ธ Parameters ๐ธ
UPLO โ CHARACTER*1. Specifies whether the matrix A is upper or lower triangular.
'U': Upper triangular'L': Lower triangular
TRANS โ CHARACTER*1. Specifies the operation applied to A.
'N': SolveA * x = s*b(No transpose)'T': SolveA**T * x = s*b(Transpose)'C': SolveA**H * x = s*b(Conjugate transpose)
DIAG โ CHARACTER*1. Specifies whether or not the matrix A is unit triangular.
'N': Non-unit triangular'U': Unit triangular
NORMIN โ CHARACTER*1. Specifies whether CNORM has been set or not.
'Y':CNORMcontains the column norms on entry'N':CNORMis not set on entry. On exit, the norms will be computed and stored inCNORM.
N โ INTEGER. The order of the matrix A. N >= 0.
A โ COMPLEX array, dimension (LDA,N). The triangular matrix A. If UPLO = 'U', the leading n by n upper triangular part of the array A contains the upper triangular matrix, and the strictly lower triangular part of A is not referenced. If UPLO = 'L', the leading n by n lower triangular part of the array A contains the lower triangular matrix, and the strictly upper triangular part of A is not referenced. If DIAG = 'U', the diagonal elements of A are also not referenced and are assumed to be 1.
LDA โ INTEGER. The leading dimension of the array A. LDA >= max (1,N).
X โ COMPLEX array, dimension (N). On entry, the right hand side b of the triangular system. On exit, X is overwritten by the solution vector x.
SCALE โ REAL. The scaling factor s for the triangular system:
A * x = s*b, A**T * x = s*b, or A**H * x = s*b.
If SCALE = 0, the matrix A is singular or badly scaled, and the vector x is an exact or approximate solution to A*x = 0.
CNORM โ REAL array, dimension (N).
If NORMIN = 'Y', CNORM is an input argument and CNORM(j) contains the norm of the off-diagonal part of the j-th column of A. If TRANS = 'N', CNORM(j) must be greater than or equal to the infinity-norm, and if TRANS = 'T' or 'C', CNORM(j) must be greater than or equal to the 1-norm.
If NORMIN = 'N', CNORM is an output argument and CNORM(j) returns the 1-norm of the offdiagonal part of the j-th column of A.
INFO โ INTEGER.
= 0: successful exit< 0: ifINFO = -k, the k-th argument had an illegal value
๐ Author ๐
- Univ. of Tennessee
- Univ. of California Berkeley
- Univ. of Colorado Denver
- NAG Ltd.
๐ Further Details ๐
A rough bound on x is computed; if that is less than overflow, CTRSV is called; otherwise, specific code is used which checks for possible overflow or divide-by-zero at every operation.
A columnwise scheme is used for solving A*x = b. The basic algorithm if A is lower triangular is:
x[1:n] := b[1:n]
for j = 1, ..., n
x(j) := x(j) / A(j,j)
x[j+1:n] := x[j+1:n] - x(j) * A[j+1:n,j]
end
Define bounds on the components of x after j iterations of the loop:
M(j) = bound on x[1:j]
G(j) = bound on x[j+1:n]
Initially, let M(0) = 0 and G(0) = max{x(i), i=1,...,n}.
Then for iteration j+1 we have:
M(j+1) <= G(j) / | A(j+1,j+1) |
G(j+1) <= G(j) + M(j+1) * | A[j+2:n,j+1] |
<= G(j) ( 1 + CNORM(j+1) / | A(j+1,j+1) | )
where CNORM(j+1) is greater than or equal to the infinity-norm of column j+1 of A, not counting the diagonal. Hence:
G(j) <= G(0) product ( 1 + CNORM(i) / | A(i,i) | )
1<=i<=j
and:
|x(j)| <= ( G(0) / |A(j,j)| ) product ( 1 + CNORM(i) / |A(i,i)| )
1<=i< j
Since |x(j)| <= M(j), we use the Level 2 BLAS routine CTRSV if the reciprocal of the largest M(j), j=1,..,n, is larger than max(underflow, 1/overflow).
The bound on x(j) is also used to determine when a step in the columnwise method can be performed without fear of overflow. If the computed bound is greater than a large constant, x is scaled to prevent overflow, but if the bound overflows, x is set to 0, x(j) to 1, and scale to 0, and a non-trivial solution to A*x = 0 is found.
Similarly, a row-wise scheme is used to solve A**T *x = b or A**H *x = b. The basic algorithm for A upper triangular is:
for j = 1, ..., n
x(j) := ( b(j) - A[1:j-1,j]' * x[1:j-1] ) / A(j,j)
end
We simultaneously compute two bounds:
G(j) = bound on ( b(i) - A[1:i-1,i]' * x[1:i-1] ), 1<=i<=j
M(j) = bound on x(i), 1<=i<=j
The initial values are G(0) = 0, M(0) = max{b(i), i=1,..,n}, and we add the constraint G(j) >= G(j-1) and M(j) >= M(j-1) for j >= 1. Then the bound on x(j) is:
M(j) <= M(j-1) * ( 1 + CNORM(j) ) / | A(j,j) |
<= M(0) * product ( ( 1 + CNORM(i) ) / |A(i,i)| )
1<=i<=j
and we can safely call CTRSV if 1/M(n) and 1/G(n) are both greater than max(underflow, 1/overflow).
Definition at line 237 of file clatrs.f.
๐ subroutine dlatrs ๐
subroutine dlatrs (character uplo, character trans, character diag, character normin, integer n, double precision, dimension( lda, * ) a, integer lda, double precision, dimension( * ) x, double precision scale, double precision, dimension( * ) cnorm, integer info)
DLATRS solves a triangular system of equations with the scale factor set to prevent overflow. ๐
๐ฏ Purpose ๐ฏ
DLATRS solves one of the triangular systems:
A *x = s*b or A**T *x = s*b
with scaling to prevent overflow. Here A is an upper or lower triangular matrix, A**T denotes the transpose of A, x and b are n-element vectors, and s is a scaling factor, usually less than or equal to 1, chosen so that the components of x will be less than the overflow threshold. If the unscaled problem will not cause overflow, the Level 2 BLAS routine DTRSV is called. If the matrix A is singular (A(j,j) = 0 for some j), then s is set to 0 and a non-trivial solution to A*x = 0 is returned.
๐จ Same singular-matrix energy: ifA(j,j) = 0for somej, thensis set to0and a non-trivial solution toA*x = 0is returned. Not a drill. ๐
๐ธ Parameters ๐ธ
UPLO โ CHARACTER*1. Specifies whether the matrix A is upper or lower triangular.
'U': Upper triangular'L': Lower triangular
TRANS โ CHARACTER*1. Specifies the operation applied to A.
'N': SolveA * x = s*b(No transpose)'T': SolveA**T* x = s*b(Transpose)'C': SolveA**T* x = s*b(Conjugate transpose = Transpose)
DIAG โ CHARACTER*1. Specifies whether or not the matrix A is unit triangular.
'N': Non-unit triangular'U': Unit triangular
NORMIN
NORMIN(CHARACTER*1) โ tells the routine whetherCNORMis already loaded or not.= 'Y'means yep,CNORMhas the column norms on entry ๐ .= 'N'means nope, nothing set โ and on the way out the norms get computed and dropped intoCNORMfor you ๐ซถN(INTEGER) โ the order of the matrixA.N >= 0, bestie, non-negotiable โจA(DOUBLE PRECISIONarray, dimension(LDA,N)) โ the triangular matrixAitself ๐- If
UPLO = 'U', the leadingnbynupper triangular part of the arrayAholds the upper triangular matrix, and the strictly lower triangular part ofAis not referenced (we literally do not look at it ๐). - If
UPLO = 'L', the leadingnbynlower triangular part of the arrayAholds the lower triangular matrix, and the strictly upper triangular part ofAis not referenced. - If
DIAG = 'U', the diagonal elements ofAare also not referenced and are assumed to be1โ free real estate, we just pretend they're ones ๐
- If
LDA(INTEGER) โ the leading dimension of the arrayA. Must satisfyLDA >= max (1,N). Math is math, no cap ๐X(DOUBLE PRECISIONarray, dimension(N)) โ on entry, this is the right hand sidebof the triangular system. On exit,Xgets overwritten by the solution vectorx๐ฅ (so screenshot your input first if you were attached to it ๐ญ)SCALE(DOUBLE PRECISION) โ the scaling factorsfor the triangular system
A * x = s*b or A**T* x = s*b
If SCALE = 0, then the matrix A is singular or badly scaled, and the vector x is an exact or approximate solution to A*x = 0. That's your "we tried, it's cooked" signal ๐
CNORM(DOUBLE PRECISIONarray, dimension(N)) โ the column-norm situation, and it flips roles based onNORMIN๐- If
NORMIN = 'Y',CNORMis an input argument andCNORM(j)contains the norm of the off-diagonal part of thej-th column ofA. IfTRANS = 'N',CNORM(j)must be greater than or equal to the infinity-norm, and ifTRANS = 'T'or'C',CNORM(j)must be greater than or equal to the 1-norm. Respect the requirements, bestie ๐ง - If
NORMIN = 'N',CNORMis an output argument andCNORM(j)returns the 1-norm of the offdiagonal part of thej-th column ofA๐ธ
- If
INFO(INTEGER) โ the receipts ๐= 0: successful exit, we ate and left no crumbs โจ< 0: ifINFO = -k, thek-th argument had an illegal value ๐จ
๐ Author ๐
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.
๐ Further Details ๐
okay so this part is the why and it's honestly iconic. A rough bound on x is computed; if that is less than overflow, DTRSV is called, otherwise, specific code is used which checks for possible overflow or divide-by-zero at every operation ๐
A columnwise scheme is used for solving A*x = b. The basic algorithm if A is lower triangular is
x[1:n] := b[1:n]
for j = 1, ..., n
x(j) := x(j) / A(j,j)
x[j+1:n] := x[j+1:n] - x(j) * A[j+1:n,j]
end
Define bounds on the components of x after j iterations of the loop:
M(j) = bound on x[1:j]
G(j) = bound on x[j+1:n]
Initially, let M(0) = 0 and G(0) = max{x(i), i=1,...,n}.
Then for iteration j+1 we have
M(j+1) <= G(j) / | A(j+1,j+1) |
G(j+1) <= G(j) + M(j+1) * | A[j+2:n,j+1] |
<= G(j) ( 1 + CNORM(j+1) / | A(j+1,j+1) | )
where CNORM(j+1) is greater than or equal to the infinity-norm of column j+1 of A, not counting the diagonal. Hence
G(j) <= G(0) product ( 1 + CNORM(i) / | A(i,i) | )
1<=i<=j
and
|x(j)| <= ( G(0) / |A(j,j)| ) product ( 1 + CNORM(i) / |A(i,i)| )
1<=i< j
Since |x(j)| <= M(j), we use the Level 2 BLAS routine DTRSV if the reciprocal of the largest M(j), j=1,..,n, is larger than max(underflow, 1/overflow) ๐งฎ
The bound on x(j) is also used to determine when a step in the columnwise method can be performed without fear of overflow. If the computed bound is greater than a large constant, x is scaled to prevent overflow, but if the bound overflows, x is set to 0, x(j) to 1, and scale to 0, and a non-trivial solution to A*x = 0 is found ๐ณ (yes that's real, read it twice)
Similarly, a row-wise scheme is used to solve A**T*x = b. The basic algorithm for A upper triangular is
for j = 1, ..., n
x(j) := ( b(j) - A[1:j-1,j]**T * x[1:j-1] ) / A(j,j)
end
We simultaneously compute two bounds
G(j) = bound on ( b(i) - A[1:i-1,i]**T * x[1:i-1] ), 1<=i<=j
M(j) = bound on x(i), 1<=i<=j
The initial values are G(0) = 0, M(0) = max{b(i), i=1,..,n}, and we add the constraint G(j) >= G(j-1) and M(j) >= M(j-1) for j >= 1. Then the bound on x(j) is
M(j) <= M(j-1) * ( 1 + CNORM(j) ) / | A(j,j) |
<= M(0) * product ( ( 1 + CNORM(i) ) / |A(i,i)| )
1<=i<=j
and we can safely call DTRSV if 1/M(n) and 1/G(n) are both greater than max(underflow, 1/overflow) โญ
Definition at line 236 of file dlatrs.f.
๐ subroutine slatrs ๐
subroutine slatrs (character uplo, character trans, character diag,
character normin, integer n, real, dimension( lda, * ) a, integer lda,
real, dimension( * ) x, real scale, real, dimension( * ) cnorm, integer
info)
SLATRS solves a triangular system of equations with the scale factor set to prevent overflow ๐
same energy as the D version, just single precision, and honestly? she's giving reliable ๐ฅ
โจ Purpose โจ
SLATRS solves one of the triangular systems
A *x = s*b or A**T*x = s*b
with scaling to prevent overflow. Here A is an upper or lower triangular matrix, A**T denotes the transpose of A, x and b are n-element vectors, and s is a scaling factor, usually less than or equal to 1, chosen so that the components of x will be less than the overflow threshold ๐
If the unscaled problem will not cause overflow, the Level 2 BLAS routine STRSV is called. If the matrix A is singular (A(j,j) = 0 for some j), then s is set to 0 and a non-trivial solution to A*x = 0 is returned ๐ซถ (yes, singular means you get the "not the zero vector somehow" outcome โ iconic behaviour, lowkey)
๐ฆ Parameters ๐ฆ
UPLO(CHARACTER*1) โ specifies whether the matrixAis upper or lower triangular.= 'U': Upper triangular= 'L': Lower triangular
TRANS(CHARACTER*1) โ specifies the operation applied toA.= 'N': SolveA * x = s*b(No transpose)= 'T': SolveA**T* x = s*b(Transpose)= 'C': SolveA**T* x = s*b(Conjugate transpose = Transpose) โ same thing here, do not panic ๐
DIAG(CHARACTER*1) โ specifies whether or not the matrixAis unit triangular.= 'N': Non-unit triangular= 'U': Unit triangular
NORMIN(CHARACTER*1) โ specifies whetherCNORMhas been set or not.= 'Y':CNORMcontains the column norms on entry= 'N':CNORMis not set on entry. On exit, the norms will be computed and stored inCNORM๐ธ
N(INTEGER) โ the order of the matrixA.N >= 0.A(REALarray, dimension(LDA,N)) โ the triangular matrixA๐- If
UPLO = 'U', the leadingnbynupper triangular part of the arrayAcontains the upper triangular matrix, and the strictly lower triangular part ofAis not referenced. - If
UPLO = 'L', the leadingnbynlower triangular part of the arrayAcontains the lower triangular matrix, and the strictly upper triangular part ofAis not referenced. - If
DIAG = 'U', the diagonal elements ofAare also not referenced and are assumed to be1โจ
- If
LDA(INTEGER) โ the leading dimension of the arrayA.LDA >= max (1,N).X(REALarray, dimension(N)) โ on entry, the right hand sidebof the triangular system. On exit,Xis overwritten by the solution vectorx๐ฅSCALE(REAL) โ the scaling factorsfor the triangular system
A * x = s*b or A**T* x = s*b
If SCALE = 0, the matrix A is singular or badly scaled, and the vector x is an exact or approximate solution to A*x = 0 ๐
CNORM(REALarray, dimension(N)) โ- If
NORMIN = 'Y',CNORMis an input argument andCNORM(j)contains the norm of the off-diagonal part of thej-th column ofA. IfTRANS = 'N',CNORM(j)must be greater than or equal to the infinity-norm, and ifTRANS = 'T'or'C',CNORM(j)must be greater than or equal to the 1-norm โญ - If
NORMIN = 'N',CNORMis an output argument andCNORM(j)returns the 1-norm of the offdiagonal part of thej-th column ofA๐
- If
INFO(INTEGER) โ= 0: successful exit ๐< 0: ifINFO = -k, thek-th argument had an illegal value ๐จ
๐ธ Author ๐ธ
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.
๐ Further Details ๐
ngl bestie there is literally nothing here โ the original page leaves this section empty ๐ (the D version above has the whole bound-derivation essay, so go read that one if you want the math tea โ)
so like, a rough bound on x gets computed first. if that bound is less than overflow, STRSV is called. otherwise, specific code is used which checks for possible overflow or divide-by-zero at every operation. no cap, it's giving cautious.
for solving A*x = b, itโs a columnwise scheme. the basic algorithm if A is lower triangular is:
x[1:n] := b[1:n]
for j = 1, ..., n
x(j) := x(j) / A(j,j)
x[j+1:n] := x[j+1:n] - x(j) * A[j+1:n,j]
end
define bounds on the components of x after j iterations of the loop:
M(j) = bound on x[1:j]
G(j) = bound on x[j+1:n]
initially, let M(0) = 0 and G(0) = max{x(i), i=1,...,n}.
then for iteration j+1 we have:
M(j+1) <= G(j) / | A(j+1,j+1) |
G(j+1) <= G(j) + M(j+1) * | A[j+2:n,j+1] |
<= G(j) ( 1 + CNORM(j+1) / | A(j+1,j+1) | )
where CNORM(j+1) is greater than or equal to the infinity-norm of column j+1 of A, not counting the diagonal. hence:
G(j) <= G(0) product ( 1 + CNORM(i) / | A(i,i) | )
1<=i<=j
and:
|x(j)| <= ( G(0) / |A(j,j)| ) product ( 1 + CNORM(i) / |A(i,i)| )
1<=i< j
since |x(j)| <= M(j), we use the Level 2 BLAS routine STRSV if the reciprocal of the largest M(j), j=1,..,n, is larger than max(underflow, 1/overflow).
the bound on x(j) is also used to determine when a step in the columnwise method can be performed without fear of overflow. if the computed bound is greater than a large constant, x is scaled to prevent overflow, but if the bound overflows, x is set to 0, x(j) to 1, and scale to 0, and a non-trivial solution to A*x = 0 is found. periodt, thatโs the overflow safety tea.
similarly, a row-wise scheme is used to solve A**T*x = b. the basic algorithm for A upper triangular is:
for j = 1, ..., n
x(j) := ( b(j) - A[1:j-1,j]**T * x[1:j-1] ) / A(j,j)
end
we simultaneously compute two bounds:
G(j) = bound on ( b(i) - A[1:i-1,i]**T * x[1:i-1] ), 1<=i<=j
M(j) = bound on x(i), 1<=i<=j
the initial values are G(0) = 0, M(0) = max{b(i), i=1,..,n}, and we add the constraint G(j) >= G(j-1) and M(j) >= M(j-1) for j >= 1. then the bound on x(j) is:
M(j) <= M(j-1) * ( 1 + CNORM(j) ) / | A(j,j) |
<= M(0) * product ( ( 1 + CNORM(i) ) / |A(i,i)| )
1<=i<=j
and we can safely call STRSV if 1/M(n) and 1/G(n) are both greater than max(underflow, 1/overflow).
Definition at line 236 of file slatrs.f.
subroutine zlatrs ๐
subroutine zlatrs (character uplo, character trans, character diag,
character normin, integer n, complex*16, dimension( lda, * ) a, integer
lda, complex*16, dimension( * ) x, double precision scale, double
precision, dimension( * ) cnorm, integer info)
ZLATRS solves a triangular system of equations with the scale factor set to prevent overflow.
Purpose ๐
okay so ZLATRS solves one of the triangular systems:
A * x = s*b, A**T * x = s*b, or A**H * x = s*b,
with scaling to prevent overflow. here A is an upper or lower triangular matrix, A**T denotes the transpose of A, A**H denotes the conjugate transpose of A, x and b are n-element vectors, and s is a scaling factor, usually less than or equal to 1, chosen so that the components of x will be less than the overflow threshold. if the unscaled problem will not cause overflow, the Level 2 BLAS routine ZTRSV is called. if the matrix A is singular (A(j,j) = 0 for some j), then s is set to 0 and a non-trivial solution to A*x = 0 is returned. iconic scaling behavior, honestly.
Parameters ๐
UPLOโUPLO is CHARACTER*1. specifies whether the matrixAis upper or lower triangular.= 'U': upper triangular.= 'L': lower triangular.TRANSโTRANS is CHARACTER*1. specifies the operation applied toA.= 'N': solveA * x = s*b(No transpose).= 'T': solveA**T * x = s*b(Transpose).= 'C': solveA**H * x = s*b(Conjugate transpose).DIAGโDIAG is CHARACTER*1. specifies whether or not the matrixAis unit triangular.= 'N': non-unit triangular.= 'U': unit triangular.NORMINโNORMIN is CHARACTER*1. specifies whetherCNORMhas been set or not.= 'Y':CNORMcontains the column norms on entry.= 'N':CNORMis not set on entry. on exit, the norms will be computed and stored inCNORM.NโN is INTEGER. the order of the matrixA.N >= 0.AโA is COMPLEX*16 array, dimension (LDA,N). the triangular matrixA. ifUPLO = 'U', the leading n by n upper triangular part of the arrayAcontains the upper triangular matrix, and the strictly lower triangular part ofAis not referenced. ifUPLO = 'L', the leading n by n lower triangular part of the arrayAcontains the lower triangular matrix, and the strictly upper triangular part ofAis not referenced. ifDIAG = 'U', the diagonal elements ofAare also not referenced and are assumed to be1.LDAโLDA is INTEGER. the leading dimension of the arrayA.LDA >= max (1,N).XโX is COMPLEX*16 array, dimension (N). on entry, the right hand sidebof the triangular system. on exit,Xis overwritten by the solution vectorx.SCALEโSCALE is DOUBLE PRECISION. the scaling factorsfor the triangular systemA * x = s*b,A**T * x = s*b, orA**H * x = s*b. ifSCALE = 0, the matrixAis singular or badly scaled, and the vectorxis an exact or approximate solution toA*x = 0.
ngl, that SCALE = 0 case is the โbestie, the matrix is not okayโ moment.
CNORMโCNORM is DOUBLE PRECISION array, dimension (N). ifNORMIN = 'Y',CNORMis an input argument andCNORM(j)contains the norm of the off-diagonal part of the j-th column ofA. ifTRANS = 'N',CNORM(j)must be greater than or equal to the infinity-norm, and ifTRANS = 'T'or'C',CNORM(j)must be greater than or equal to the 1-norm. ifNORMIN = 'N',CNORMis an output argument andCNORM(j)returns the 1-norm of the offdiagonal part of the j-th column ofA.INFOโINFO is INTEGER.= 0: successful exit.< 0: ifINFO = -k, the k-th argument had an illegal value.
Author ๐
- Univ. of Tennessee
- Univ. of California Berkeley
- Univ. of Colorado Denver
- NAG Ltd.
Further Details: ๐ฅ
a rough bound on x is computed; if that is less than overflow, ZTRSV is called, otherwise, specific code is used which checks for possible overflow or divide-by-zero at every operation. very demure, very mindful.
a columnwise scheme is used for solving A*x = b. the basic algorithm if A is lower triangular is:
x[1:n] := b[1:n]
for j = 1, ..., n
x(j) := x(j) / A(j,j)
x[j+1:n] := x[j+1:n] - x(j) * A[j+1:n,j]
end
define bounds on the components of x after j iterations of the loop:
M(j) = bound on x[1:j]
G(j) = bound on x[j+1:n]
initially, let M(0) = 0 and G(0) = max{x(i), i=1,...,n}.
then for iteration j+1 we have:
M(j+1) <= G(j) / | A(j+1,j+1) |
G(j+1) <= G(j) + M(j+1) * | A[j+2:n,j+1] |
<= G(j) ( 1 + CNORM(j+1) / | A(j+1,j+1) | )
where CNORM(j+1) is greater than or equal to the infinity-norm of column j+1 of A, not counting the diagonal. hence:
G(j) <= G(0) product ( 1 + CNORM(i) / | A(i,i) | )
1<=i<=j
and:
|x(j)| <= ( G(0) / |A(j,j)| ) product ( 1 + CNORM(i) / |A(i,i)| )
1<=i< j
since |x(j)| <= M(j), we use the Level 2 BLAS routine ZTRSV if the reciprocal of the largest M(j), j=1,..,n, is larger than max(underflow, 1/overflow).
the bound on x(j) is also used to determine when a step in the columnwise method can be performed without fear of overflow. if the computed bound is greater than a large constant, x is scaled to prevent overflow, but if the bound overflows, x is set to 0, x(j) to 1, and scale to 0, and a non-trivial solution to A*x = 0 is found. thatโs the overflow plot twist, bestie.
similarly, a row-wise scheme is used to solve A**T *x = b or A**H *x = b. the basic algorithm for A upper triangular is:
for j = 1, ..., n
x(j) := ( b(j) - A[1:j-1,j]' * x[1:j-1] ) / A(j,j)
end
we simultaneously compute two bounds:
G(j) = bound on ( b(i) - A[1:i-1,i]' * x[1:i-1] ), 1<=i<=j
M(j) = bound on x(i), 1<=i<=j
the initial values are G(0) = 0, M(0) = max{b(i), i=1,..,n}, and we add the constraint G(j) >= G(j-1) and M(j) >= M(j-1) for j >= 1. then the bound on x(j) is:
M(j) <= M(j-1) * ( 1 + CNORM(j) ) / | A(j,j) |
<= M(0) * product ( ( 1 + CNORM(i) ) / |A(i,i)| )
1<=i<=j
and we can safely call ZTRSV if 1/M(n) and 1/G(n) are both greater than max(underflow, 1/overflow).
Definition at line 237 of file zlatrs.f.
๐ซถ AUTHOR ๐ซถ
So who wrote this masterpiece? Plot twist: nobody sat down and typed it, bestie. This page was generated automatically by Doxygen for LAPACK from the source code โ Doxygen literally pulled it out of the source, no human author hand-crafting it, no cap. Iconic automation moment โจ
Lowkey important vibe check: because it's auto-generated from the source, the source is the main character here โ the docs just follow along ๐
<h2>๐ the cute lil sign-off ๐</h2>
And that's the whole page, bestie โ you made it to the end, obsessed with your dedication fr fr ๐ธ This gem comes from LAPACK, Version 3.12.0, and the page in your hands is latrs(3) ๐ฆ Go forth and triangular-solve with main character energy ๐๐
๐ฆ 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