Matrix::EigSymGen Method

Overload List

#SignatureDescription
1void EigSymGen(TMtx *B, TVec *D, TMtx *V, TEigGenType EigGenType = TEigGenType::etAzBz) const;Computes all the eigenvalues, and optionally, the eigenvectors of a generalized symmetric-definite eigenproblem.
2void EigSymGen(TMtx *B, TVec *D, TEigGenType EigGenType = TEigGenType::etAzBz) const;
3void EigSymGen(TMtx *B, TVec *D, double Minimum, double Maximum, TMtx *V, DewArray<int> &VInfo, double Tolerance = 0, TEigGenType EigGenType = TEigGenType::etAzBz) const;Computes generalized eigenvalues with reduction of the symmetric-definite generalized eigenvalues/eigenvectors problem to the normal eigenvalue case.
4void EigSymGen(TMtx *B, TVec *D, double Minimum, double Maximum, double Tolerance = 0, TEigGenType EigGenType = TEigGenType::etAzBz) const;
5void EigSymGen(TMtx *B, TVec *D, int LowerRange, int UpperRange, TMtx *V, DewArray<int> &VInfo, double Tolerance = 0, TEigGenType EigGenType = TEigGenType::etAzBz) const;Computes generalized eigenvalues with reduction of the symmetric-definite generalized eigenvalues/eigenvectors problem to the normal eigenvalue case.
6void EigSymGen(TMtx *B, TVec *D, int LowerRange, int UpperRange, double Tolerance = 0, TEigGenType EigGenType = TEigGenType::etAzBz) const;

Overload 1: void EigSymGen(TMtx *B, TVec *D, TMtx *V, TEigGenType EigGenType = TEigGenType::etAzBz) const;

Computes all the eigenvalues, and optionally, the eigenvectors of a generalized symmetric-definite eigenproblem.

#NameTypeDescription
1BTMtx *
2DTVec *
3VTMtx *
4EigGenType = TEigGenType::etAzBzTEigGenType
Remarks:

It can find solution to either of the following problems:

A X = lambda B X, A B X = lambda X, or B A X = lambda X

Here A and B are assumed to be symmetric (Hermitian) and B is also positive definite. Eigenvector are stored within V in columns.

Examples
#include "MtxVec.h"
#include "Units.MtxVec.h"

using namespace Dew;
using namespace Dew::Math;
using namespace Dew::Math::Units::MtxVec;

void Example()
{
    TVec* D;
    TMtx *A, *B, *C;

    CreateIt(D);
    CreateIt(A, B, C);
    D->SetIt(false, DewArray<double>{0, 2}); // vector, length 2, real
    A->SetIt(2, 2, false, DewArray<double>{1, 2,
        2, 4});  // 2x2, real matrix
    // A must be symmetric
    B->SetIt(2, 2, false, DewArray<double>{1, 1,
        1, 2});  // 2x2, real matrix
    // B must be symmetric and positive definite
    A->EigSymGen(B, D); // Use A and B to find eigenvalues
    FreeIt(A, B, C);
    FreeIt(D);
}
See Also: Matrix::Eig
Declared in Dew::Math::Matrix · Dew.Math/MtxExpr.h · Cross-compiler

Overload 2: void EigSymGen(TMtx *B, TVec *D, TEigGenType EigGenType = TEigGenType::etAzBz) const;

#NameTypeDescription
1BTMtx *
2DTVec *
3EigGenType = TEigGenType::etAzBzTEigGenType
Declared in Dew::Math::Matrix · Dew.Math/MtxExpr.h · Cross-compiler

Overload 3: void EigSymGen(TMtx *B, TVec *D, double Minimum, double Maximum, TMtx *V, DewArray<int> &VInfo, double Tolerance = 0, TEigGenType EigGenType = TEigGenType::etAzBz) const;

Computes generalized eigenvalues with reduction of the symmetric-definite generalized eigenvalues/eigenvectors problem to the normal eigenvalue case.

#NameTypeDescription
1BTMtx *
2DTVec *
3Minimumdouble
4Maximumdouble
5VTMtx *
6VInfoDewArray<int> &
7Tolerance = 0double
8EigGenType = TEigGenType::etAzBzTEigGenType
Remarks:

The routine computes selected eigenvalues and optionally also eigenvectors. The problem is of type:

A X = lambda B X, A B X = lambda X, or B A X = lambda X

A and B are symmetric (Hermitian) and B is also positive definite. Eigenvalues and eigenvectors can be selected by specifying a range of values. Eigenvectors are not computed, if V is passed as nil. (NULL).

Tolerance parameter specifies the absolute error tolerance for the eigenvalues. An approximate eigenvalue is accepted as converged when it is determined to lie in an interval [a,b] of width less than or equal to

Tolerance + EPS / max( |a|,|b| ) ,

where EPS is the machine precision. If Tolerance is less than or equal to zero, then EPS*|T| will be used in its place, where |T| is the 1-norm of the tridiagonal matrix obtained by reducing A to tridiagonal form.

Eigenvalues will be computed most accurately when Tolerance is set to twice the underflow threshold, not zero. If this routine returns fails , indicating that some eigenvectors did not converge, try setting Tolerance to 2*UnderflowThreshold.

If V is assinged, VInfo contains values equal to 0 at indices for which eigenvector calculation converged. Eigenvector are stored within V in columns. The returned column count may vary between calls depending on the number of eigenvectors that converged. The eigenvectors are normalized as follows:

etAzBz, etBAz, Z**T*B*Z = I;
etABz        , Z**T*inv(B)*Z = I.

[Lapack Users Guide](Lapack Users Guide)

Examples
#include "MtxExpr.h"

using namespace Dew;
using namespace Dew::Math;

void Example()
{
    Vector D;
    Matrix A, B, C;

    D = {0, 2}; // vector, length 2, real
    A = {{1, 2}, {2, 4}}; // 2x2, real matrix
    // A must be symmetric
    B = {{1, 1}, {1, 2}}; // 2x2, real matrix
    // B must be symmetric and positive definite
    A.EigSymGen(B, D); // Use A and B to find eigenvalues
}
Declared in Dew::Math::Matrix · Dew.Math/MtxExpr.h · Cross-compiler

Overload 4: void EigSymGen(TMtx *B, TVec *D, double Minimum, double Maximum, double Tolerance = 0, TEigGenType EigGenType = TEigGenType::etAzBz) const;

#NameTypeDescription
1BTMtx *
2DTVec *
3Minimumdouble
4Maximumdouble
5Tolerance = 0double
6EigGenType = TEigGenType::etAzBzTEigGenType
Declared in Dew::Math::Matrix · Dew.Math/MtxExpr.h · Cross-compiler

Overload 5: void EigSymGen(TMtx *B, TVec *D, int LowerRange, int UpperRange, TMtx *V, DewArray<int> &VInfo, double Tolerance = 0, TEigGenType EigGenType = TEigGenType::etAzBz) const;

Computes generalized eigenvalues with reduction of the symmetric-definite generalized eigenvalues/eigenvectors problem to the normal eigenvalue case.

#NameTypeDescription
1BTMtx *
2DTVec *
3LowerRangeint
4UpperRangeint
5VTMtx *
6VInfoDewArray<int> &
7Tolerance = 0double
8EigGenType = TEigGenType::etAzBzTEigGenType
Remarks:

The routine computes selected eigenvalues and optionally also eigenvectors. The problem is of type:

A X = lambda B X, A B X = lambda X, or B A X = lambda X

A and B are symmetric (Hermitian) and B is also positive definite. Eigenvalues and eigenvectors can be selected by specifying a range of indexes of values. Eigenvectors are not computed, if V is passed as nil (NULL).

Tolerance parameter specifies the absolute error tolerance for the eigenvalues. An approximate eigenvalue is accepted as converged when it is determined to lie in an interval [a,b] of width less than or equal to

Tolerance + EPS / max( |a|,|b| ) ,

where EPS is the machine precision. If Tolerance is less than or equal to zero, then EPS*|T| will be used in its place, where |T| is the 1-norm of the tridiagonal matrix obtained by reducing A to tridiagonal form.

Eigenvalues will be computed most accurately when Tolerance is set to twice the underflow threshold, not zero. If this routine returns fails , indicating that some eigenvectors did not converge, try setting Tolerance to 2*UnderflowThreshold.

If V is assinged, VInfo contains values equal to 0 at indices for which eigenvector calculation converged. Eigenvector are stored within V in columns. The returned column count may vary between calls depending on the number of eigenvectors that converged. The eigenvectors are normalized as follows:

etAzBz, etBAz, Z**T*B*Z = I;
etABz        , Z**T*inv(B)*Z = I.
Declared in Dew::Math::Matrix · Dew.Math/MtxExpr.h · Cross-compiler

Overload 6: void EigSymGen(TMtx *B, TVec *D, int LowerRange, int UpperRange, double Tolerance = 0, TEigGenType EigGenType = TEigGenType::etAzBz) const;

#NameTypeDescription
1BTMtx *
2DTVec *
3LowerRangeint
4UpperRangeint
5Tolerance = 0double
6EigGenType = TEigGenType::etAzBzTEigGenType
Declared in Dew::Math::Matrix · Dew.Math/MtxExpr.h · Cross-compiler