Matrix.LUSolve Method

Overload List

#SignatureDescription
1function LUSolve(const B: TMtx; const X: TMtx; MtxType: TMtxType; Operation: TMtxOperation): TMtx;Desc Matrix version of LUSolve. Perfroms a LUSolve for each B and X matrices columns in single pass.
2function LUSolve(const B: TMtx; const X: TMtx; MtxType: TMtxType; Operation: TMtxOperation; const Mtx: TMtx; const OrigMtx: TMtx; const pipiv: TVecInt): TMtx;Finds solution with an already precomputed factorzation.
3function LUSolve(MtxType: TMtxType; const Mtx: TMtx; const OrigMtx: TMtx; const pipiv: TVecInt): TMtx;Performs factorization for LUSolve.
4function LUSolve(const B: TVec; const X: TVec; MtxType: TMtxType; Operation: TMtxOperation): TMtx;Solves system of linear equations by using LU factorization.
5function LUSolve(const B: TVec; const X: TVec; MtxType: TMtxType; Operation: TMtxOperation; const Mtx: TMtx; const OrigMtx: TMtx; const pipiv: TVecInt): TMtx;Finds solution with an already precomputed factorization.

Overload 1: function LUSolve(const B: TMtx; const X: TMtx; MtxType: TMtxType; Operation: TMtxOperation): TMtx;

Desc Matrix version of LUSolve. Perfroms a LUSolve for each B and X matrices columns in single pass.

#NameTypeDescription
1BTMtx
2XTMtx
3MtxTypeTMtxType
4OperationTMtxOperation

Result: stored in self (calling object), returns self for chaining

Examples
aXY =   (X Row Index, Y Column Index)

[a11,  a12,  a13,      0,     0,     0]
[a21,  a22,  a23,  a24,     0,     0]
[a31,  a32,  a33,  a34,  a35,     0]
[0,      a42,  a43,  a44,  a45, a46]
[0,          0,  a53,  a54,  a55, a56]
[0,          0,      0,  a64,  a65, a66]

A.SubDiag := 2;
A.SuperDiag := 2;
A.Size(5,6);

[0   ,  0,  a13, a24 ,a35, a46]    second upper diagonal
[0   , a12, a23, a34, a45, a56]     first upper diagonal
[a11 , a22, a33, a44, a55, a66]      main diagonal
[a21 , a32, a43, a54, a65,   0]     first lower diagonal
[a31 , a42, a53, a64,   0,   0]     second lower diagonal

Overload 2: function LUSolve(const B: TMtx; const X: TMtx; MtxType: TMtxType; Operation: TMtxOperation; const Mtx: TMtx; const OrigMtx: TMtx; const pipiv: TVecInt): TMtx;

Finds solution with an already precomputed factorzation.

#NameTypeDescription
1BTMtx
2XTMtx
3MtxTypeTMtxType
4OperationTMtxOperation
5MtxTMtx
6OrigMtxTMtx
7pipivTVecInt

Result: stored in self (calling object), returns self for chaining

Remarks:

Mtx, origMtx and ipiv contain result of factorization on exit. The factorization was obtained with a previous call to LUSolve, which did not require B and X params.

Overload 3: function LUSolve(MtxType: TMtxType; const Mtx: TMtx; const OrigMtx: TMtx; const pipiv: TVecInt): TMtx;

Performs factorization for LUSolve.

#NameTypeDescription
1MtxTypeTMtxType
2MtxTMtx
3OrigMtxTMtx
4pipivTVecInt

Result: stored in self (calling object), returns self for chaining

Remarks:

Mtx, origMtx and ipiv contain result of factorization on exit. This result is again to be passed to the LUSolve together with B to obtain solution for X.

Examples
var LU,A, W1, W2: TMtx;
    P: TVecInt;
    B,X: TVec;
begin
    CreateIt(LU, A, W1, W2);
    CreateIt(P);
    CreateIt(B,X);
    try
        A.RefineSolution := True; //it is False by default
        A.SetIt(2,2,False,[1,2,
            3,4]);

        B.SetIt(2,false, [1,
            0 ]);

        //Perform factorization:
        A.LUSolve(mtGeneral, W1, W2, P);  //OrigMtx param can be nil, if A.RefineSolution = false

        //Perform solution with given factorization:
        A.LUSolve(B, X, mtGeneral, opNone, W1, W2, P);  //X now holds solution
    finally
        FreeIt(LU,A, W1, W2);
        FreeIt(B,X);
        FreeIt(P);
    end;
end;

Overload 4: function LUSolve(const B: TVec; const X: TVec; MtxType: TMtxType; Operation: TMtxOperation): TMtx;

Solves system of linear equations by using LU factorization.

#NameTypeDescription
1BTVec
2XTVec
3MtxTypeTMtxType
4OperationTMtxOperation

Result: stored in self (calling object), returns self for chaining

Remarks:

Uses the LU factorization to solve the system of linear equations. AX = B. The matrix must be full rank. If there are more rows than columns use the least square solver Matrix.LQRSolve and if the matrix is also rank deficient use the Matrix.SVDSolve method. MtxType allows the selection of an optimized algorithm and Op defines the operation to be performed on the calling matrix prior to solve.

LUSolve also supports banded matrices. The banded matrix storage is defined with the help of two additional properties: Matrix.SubDiag and Matrix.SuperDiag. SubDiag defines the number of non-zero subdiagonals and the SuperDiag the number of non-zero super diagonals. An example of the storage format for the first sub and super diagonal:

A.SubDiag := 1;
A.SuperDiag := 1;
A.Size(3,6);
// ...
[0 , ud2, ud3, ud4 ,ud5 ,ud6]   first upper diagonal
[md1, md2, md3, md4, md5, md6]      main diagonal
[ld1, ld2, ld3, ld4, ld5,  0] first lower diagonal

The columns must be aligned. All the diagonals between the SubDiag and SuperDiag diagonals including the main diagonal must always be included. Similarly you can define two sub/super diagonal storage format :

aXY =   (X Row Index, Y Column Index)

[a11,  a12,  a13,      0,     0,     0]
[a21,  a22,  a23,  a24,     0,     0]
[a31,  a32,  a33,  a34,  a35,     0]
[0,      a42,  a43,  a44,  a45, a46]
[0,          0,  a53,  a54,  a55, a56]
[0,          0,      0,  a64,  a65, a66]

A.SubDiag := 2;
A.SuperDiag := 2;
A.Size(5,6);

[0   ,  0,  a13, a24 ,a35, a46]    second upper diagonal
[0   , a12, a23, a34, a45, a56]     first upper diagonal
[a11 , a22, a33, a44, a55, a66]      main diagonal
[a21 , a32, a43, a54, a65,   0]     first lower diagonal
[a31 , a42, a53, a64,   0,   0]     second lower diagonal

If you would like to solve X for several different B vectors (from the formula AX= B), you can pass TMtx objects to LUSolve method. With one call you solve the system for several different B vectors and save time.

Examples
A.SubDiag := 1;
A.SuperDiag := 1;
A.Size(3,6);
// ...
[0 , ud2, ud3, ud4 ,ud5 ,ud6]   first upper diagonal
[md1, md2, md3, md4, md5, md6]      main diagonal
[ld1, ld2, ld3, ld4, ld5,  0] first lower diagonal
See Also: Matrix.LU, Matrix.MtxError, Matrix.RefineSolution, Matrix.ForwError, Matrix.BackError, Matrix.ConditionNr, Matrix.ConditionNumber

Overload 5: function LUSolve(const B: TVec; const X: TVec; MtxType: TMtxType; Operation: TMtxOperation; const Mtx: TMtx; const OrigMtx: TMtx; const pipiv: TVecInt): TMtx;

Finds solution with an already precomputed factorization.

#NameTypeDescription
1BTVec
2XTVec
3MtxTypeTMtxType
4OperationTMtxOperation
5MtxTMtx
6OrigMtxTMtx
7pipivTVecInt

Result: stored in self (calling object), returns self for chaining

Remarks:

Mtx, origMtx and ipiv contain result of factorization on exit. The factorization was obtained with a previous call to LUSolve, which did not require B and X params.