ROOT 6.13/01 Reference Guide |
Decomposition Base class.
This class forms the base for all the decompositions methods in the linear algebra package . It or its derived classes have installed the methods to solve equations,invert matrices and calculate determinants while monitoring the accuracy.
Each derived class has always the following methods available:
In an iterative scheme the condition number for matrix inversion is calculated . This number is of interest for estimating the accuracy of x in the equation Ax=b For example: A is a (10x10) Hilbert matrix which looks deceivingly innocent and simple, A(i,j) = 1/(i+j+1) b(i) = Sum_j A(i,j), so a sum of a row in A
the solution is x(i) = 1. i=0,.,9
However,
gives,
Looking at the condition number, this is in line with expected the accuracy . The condition number is 3.957e+12 . As a simple rule of thumb, a condition number of 1.0e+n means that you lose up to n digits of accuracy in a solution . Since doubles are stored with 15 digits, we can expect the accuracy to be as small as 3 digits .
The determinant is d1*TMath::Power(2.,d2) Expressing the determinant this way makes under/over-flow very unlikely .
Here the actually decomposition is performed . One can change the matrix A after the decomposition constructor has been called without effecting the decomposition result
Solve A x = b . x is supplied through the argument and replaced with the solution .
Solve A^T x = b . x is supplied through the argument and replaced with the solution .
Solve A X = B . where X and are now matrices . X is supplied through the argument and replaced with the solution .
This is of course just a call to MultiSolve with as input argument the unit matrix . Note that for a matrix a(m,n) with m > n a pseudo-inverse is calculated .
The tolerance parameter (which is a member of this base class) plays a crucial role in all operations of the decomposition classes . It gives the user a powerful tool to monitor and steer the operations Its default value is sqrt(epsilon) where 1+epsilon = 1
If you do not want to be bothered by the following considerations, like in most other linear algebra packages, just set the tolerance with SetTol to an arbitrary small number .
The tolerance number is used by each decomposition method to decide whether the matrix is near singular, except of course SVD which can handle singular matrices . For each decomposition this will be checked in a different way; in LU the matrix is considered singular when, at some point in the decomposition, a diagonal element < fTol . Therefore, we had to set in the example above of the (10x10) Hilbert, which is near singular, the tolerance on 10e-12 . (The fact that we have to set the tolerance < sqrt(epsilon) is a clear indication that we are losing precision .)
If the matrix is flagged as being singular, operations with the decomposition will fail and will return matrices/vectors that are invalid .
The observant reader will notice that by scaling the complete matrix by some small number the decomposition will detect a singular matrix . In this case the user will have to reduce the tolerance number by this factor . (For CPU time saving we decided not to make this an automatic procedure) .
Code for this could look as follows:
For usage examples see $ROOTSYS/test/stressLinear.cxx
Definition at line 33 of file TDecompBase.h.
Public Member Functions | |
TDecompBase () | |
Default constructor. More... | |
TDecompBase (const TDecompBase &another) | |
Copy constructor. More... | |
virtual | ~TDecompBase () |
virtual Double_t | Condition () |
Matrix condition number. More... | |
virtual Bool_t | Decompose ()=0 |
virtual void | Det (Double_t &d1, Double_t &d2) |
Matrix determinant det = d1*TMath::Power(2.,d2) More... | |
Int_t | GetColLwb () const |
Double_t | GetCondition () const |
Double_t | GetDet1 () const |
Double_t | GetDet2 () const |
virtual Int_t | GetNcols () const =0 |
virtual Int_t | GetNrows () const =0 |
Int_t | GetRowLwb () const |
Double_t | GetTol () const |
virtual Bool_t | MultiSolve (TMatrixD &B) |
Solve set of equations with RHS in columns of B. More... | |
TDecompBase & | operator= (const TDecompBase &source) |
Assignment operator. More... | |
void | Print (Option_t *opt="") const |
Print class members. More... | |
Double_t | SetTol (Double_t tol) |
virtual Bool_t | Solve (TVectorD &b)=0 |
virtual TVectorD | Solve (const TVectorD &b, Bool_t &ok)=0 |
virtual Bool_t | Solve (TMatrixDColumn &b)=0 |
virtual Bool_t | TransSolve (TVectorD &b)=0 |
virtual TVectorD | TransSolve (const TVectorD &b, Bool_t &ok)=0 |
virtual Bool_t | TransSolve (TMatrixDColumn &b)=0 |
Protected Types | |
enum | { kWorkMax = 100 } |
enum | EMatrixDecompStat { kInit = BIT(14), kPatternSet = BIT(15), kValuesSet = BIT(16), kMatrixSet = BIT(17), kDecomposed = BIT(18), kDetermined = BIT(19), kCondition = BIT(20), kSingular = BIT(21) } |
Protected Member Functions | |
virtual const TMatrixDBase & | GetDecompMatrix () const =0 |
Int_t | Hager (Double_t &est, Int_t iter=5) |
void | ResetStatus () |
Static Protected Member Functions | |
static void | DiagProd (const TVectorD &diag, Double_t tol, Double_t &d1, Double_t &d2) |
Protected Attributes | |
Int_t | fColLwb |
Double_t | fCondition |
Double_t | fDet1 |
Double_t | fDet2 |
Int_t | fRowLwb |
Double_t | fTol |
#include <TDecompBase.h>
|
protected |
Enumerator | |
---|---|
kWorkMax |
Definition at line 60 of file TDecompBase.h.
|
protected |
Enumerator | |
---|---|
kInit | |
kPatternSet | |
kValuesSet | |
kMatrixSet | |
kDecomposed | |
kDetermined | |
kCondition | |
kSingular |
Definition at line 49 of file TDecompBase.h.
TDecompBase::TDecompBase | ( | ) |
Default constructor.
Definition at line 130 of file TDecompBase.cxx.
TDecompBase::TDecompBase | ( | const TDecompBase & | another | ) |
Copy constructor.
Definition at line 143 of file TDecompBase.cxx.
|
inlinevirtual |
Definition at line 65 of file TDecompBase.h.
|
virtual |
Matrix condition number.
Reimplemented in TDecompSVD.
Definition at line 257 of file TDecompBase.cxx.
|
pure virtual |
Implemented in TDecompSparse, TDecompSVD, TDecompQRH, TDecompLU, TDecompBK, and TDecompChol.
|
virtual |
Matrix determinant det = d1*TMath::Power(2.,d2)
Reimplemented in TDecompSparse, TDecompSVD, TDecompQRH, TDecompLU, TDecompBK, and TDecompChol.
Definition at line 299 of file TDecompBase.cxx.
|
staticprotected |
Definition at line 209 of file TDecompBase.cxx.
|
inline |
Definition at line 74 of file TDecompBase.h.
|
inline |
Definition at line 70 of file TDecompBase.h.
|
protectedpure virtual |
Implemented in TDecompSparse, TDecompSVD, TDecompLU, TDecompQRH, TDecompBK, and TDecompChol.
|
inline |
Definition at line 68 of file TDecompBase.h.
|
inline |
Definition at line 69 of file TDecompBase.h.
|
pure virtual |
Implemented in TDecompSparse, TDecompSVD, TDecompLU, TDecompQRH, TDecompBK, and TDecompChol.
|
pure virtual |
Implemented in TDecompSparse, TDecompSVD, TDecompLU, TDecompQRH, TDecompBK, and TDecompChol.
|
inline |
Definition at line 73 of file TDecompBase.h.
|
inline |
Definition at line 67 of file TDecompBase.h.
|
protected |
Definition at line 150 of file TDecompBase.cxx.
|
virtual |
Solve set of equations with RHS in columns of B.
Definition at line 280 of file TDecompBase.cxx.
TDecompBase & TDecompBase::operator= | ( | const TDecompBase & | source | ) |
Assignment operator.
Definition at line 337 of file TDecompBase.cxx.
void TDecompBase::Print | ( | Option_t * | opt = "" | ) | const |
Print class members.
Definition at line 324 of file TDecompBase.cxx.
|
inlineprotected |
Definition at line 43 of file TDecompBase.h.
|
inline |
Definition at line 96 of file TDecompBase.h.
|
pure virtual |
Implemented in TDecompSparse, TDecompSVD, TDecompQRH, TDecompLU, TDecompBK, and TDecompChol.
Implemented in TDecompSparse, TDecompSVD, TDecompQRH, TDecompLU, TDecompBK, and TDecompChol.
|
pure virtual |
Implemented in TDecompSparse, TDecompSVD, TDecompQRH, TDecompLU, TDecompBK, and TDecompChol.
|
pure virtual |
Implemented in TDecompSparse, TDecompSVD, TDecompQRH, TDecompLU, TDecompBK, and TDecompChol.
Implemented in TDecompSparse, TDecompSVD, TDecompQRH, TDecompLU, TDecompBK, and TDecompChol.
|
pure virtual |
Implemented in TDecompSparse, TDecompSVD, TDecompQRH, TDecompLU, TDecompBK, and TDecompChol.
|
protected |
Definition at line 41 of file TDecompBase.h.
|
protected |
Definition at line 39 of file TDecompBase.h.
|
protected |
Definition at line 37 of file TDecompBase.h.
|
protected |
Definition at line 38 of file TDecompBase.h.
|
protected |
Definition at line 40 of file TDecompBase.h.
|
protected |
Definition at line 36 of file TDecompBase.h.