Purpose
To solve a system of the form A X = s B or A' X = s B with
possible scaling ("s") and perturbation of A. (A' means
A-transpose.) A is an N-by-N real matrix, and X and B are
N-by-M matrices. N may be 1 or 2. The scalar "s" is a scaling
factor (.LE. 1), computed by this subroutine, which is so chosen
that X can be computed without overflow. X is further scaled if
necessary to assure that norm(A)*norm(X) is less than overflow.
Specification
SUBROUTINE MB02UW( LTRANS, N, M, PAR, A, LDA, B, LDB, SCALE,
$ IWARN )
C .. Scalar Arguments ..
LOGICAL LTRANS
INTEGER IWARN, LDA, LDB, N, M
DOUBLE PRECISION SCALE, SMIN
C .. Array Arguments ..
DOUBLE PRECISION A( LDA, * ), B( LDB, * ), PAR( * )
Arguments
Mode Parameters
LTRANS LOGICAL
Specifies if A or A-transpose is to be used, as follows:
=.TRUE. : A-transpose will be used;
=.FALSE.: A will be used (not transposed).
Input/Output Parameters
N (input) INTEGER
The order of the matrix A. It may (only) be 1 or 2.
M (input) INTEGER
The number of right hand size vectors.
PAR (input) DOUBLE PRECISION array, dimension (3)
Machine related parameters:
PAR(1) =: PREC (machine precision)*base, DLAMCH( 'P' );
PAR(2) =: SFMIN safe minimum, DLAMCH( 'S' );
PAR(3) =: SMIN The desired lower bound on the singular
values of A. This should be a safe
distance away from underflow or overflow,
say, between (underflow/machine precision)
and (machine precision * overflow).
A (input) DOUBLE PRECISION array, dimension (LDA,N)
The leading N-by-N part of this array must contain the
matrix A.
LDA INTEGER
The leading dimension of the array A. LDA >= N.
B (input/output) DOUBLE PRECISION array, dimension (LDB,M)
On entry, the leading N-by-M part of this array must
contain the matrix B (right-hand side).
On exit, the leading N-by-M part of this array contains
the N-by-M matrix X (unknowns).
LDB INTEGER
The leading dimension of the array B. LDB >= N.
SCALE (output) DOUBLE PRECISION
The scale factor that B must be multiplied by to insure
that overflow does not occur when computing X. Thus,
A X will be SCALE*B, not B (ignoring perturbations of A).
SCALE will be at most 1.
Warning Indicator
IWARN INTEGER
= 0: no warnings (A did not have to be perturbed);
= 1: A had to be perturbed to make its smallest (or only)
singular value greater than SMIN (see below).
Method
Gaussian elimination with complete pivoting is used. The matrix A is slightly perturbed if it is (close to being) singular.Further Comments
If both singular values of A are less than SMIN, SMIN*identity will be used instead of A. If only one singular value is less than SMIN, one element of A will be perturbed enough to make the smallest singular value roughly SMIN. If both singular values are at least SMIN, A will not be perturbed. In any case, the perturbation will be at most some small multiple of max( SMIN, EPS*norm(A) ), where EPS is the machine precision (see LAPACK Library routine DLAMCH). The singular values are computed by infinity-norm approximations, and thus will only be correct to a factor of 2 or so. Note: all input quantities are assumed to be smaller than overflow by a reasonable factor. (See BIGNUM.) In the interests of speed, this routine does not check the inputs for errors.Example
Program Text
NoneProgram Data
NoneProgram Results
None