Computes the generalized eigenexpansion of a system Ax = λBx. The matrices A and B are real and symmetric, and B is positive definite.
#include <imsl.h>
float *imsl_f_eig_symgen (int n, float *a, float *b, …, 0)
The type double procedure is imsl_d_eig_symgen.
int n
(Input)
Number of rows and columns in the matrices.
float *a
(Input)
Array of size n × n containing the
symmetric coefficient matrix A.
float *b
(Input)
Array of size n × n containing the
positive definite symmetric coefficient matrix B.
A pointer to the n eigenvalues of the symmetric matrix. To release this space, use free. If no value can be computed, then NULL is returned.
#include <imsl.h>
float
*imsl_f_eig_symgen (int
n,
float
*a,
float
*b,
IMSL_VECTORS, float
**evec,
IMSL_VECTORS_USER, float
evecu[],
IMSL_RETURN_USER, float
evalu[],
IMSL_RANGE, float
elow,
float
ehigh,
IMSL_A_COL_DIM, int
a_col_dim,
IMSL_B_COL_DIM, int
b_col_dim,
IMSL_EVECU_COL_DIM, int
evecu_col_dim,
0)
IMSL_VECTORS, float **evec
(Output)
The address of a pointer to an array of size n × n containing
eigenvectors of the problem. On return, the necessary space is allocated by the
function. Typically, float *evec is declared, and
&evec is
used as an argument.
IMSL_VECTORS_USER, float evecu[]
(Output)
Compute eigenvectors of the matrix. An array of size
n × n containing the
matrix of generalized eigenvectors is returned in the space evecu.
IMSL_RETURN_USER, float evalu[]
(Output)
Store the n eigenvalues in the space evalu.
IMSL_A_COL_DIM, int a_col_dim
(Input)
The column dimension of A.
Default: a_col_dim = n
IMSL_B_COL_DIM, int b_col_dim
(Input)
The column dimension of B.
Default: b_col_dim = n
IMSL_EVECU_COL_DIM, int
evecu_col_dim (Input)
The column dimension of evecu.
Default:
evecu_col_dim = n
The function imsl_f_eig_symgen computes the eigenvalues of a symmetric, positive definite eigenvalue problem by a three-phase process (Martin and Wilkinson 1971). The matrix B is reduced to factored form using the Cholesky decomposition. These factors are used to form a congruence transformation that yields a symmetric real matrix whose eigenexpansion is obtained. The problem is then transformed back to the original coordinates. Eigenvectors are calculated and transformed as required.
#include
<imsl.h>
main()
{
int n = 3;
float a[] = {1.1, 1.2,
1.4,
1.2, 1.3,
1.5,
1.4, 1.5, 1.6};
float
b[] = {2.0, 1.0,
0.0,
1.0, 2.0,
1.0,
0.0, 1.0, 2.0};
float
*eval;
/* Solve for eigenvalues */
eval = imsl_f_eig_symgen (n,
a, b,
0);
/* Print eigenvalues */
imsl_f_write_matrix
("Eigenvalues", 1, n, eval, 0);
}
Eigenvalues
1
2
3
1.386
-0.058 -0.003
This example is a variation of the first example. Here, the eigenvectors are computed as well as the eigenvalues.
#include
<imsl.h>
main()
{
int n = 3;
float a[] = {1.1, 1.2,
1.4,
1.2, 1.3,
1.5,
1.4, 1.5, 1.6};
float
b[] = {2.0, 1.0,
0.0,
1.0, 2.0,
1.0,
0.0, 1.0, 2.0};
float
*eval;
float
*evec;
/* Solve for eigenvalues and eigenvectors */
eval =
imsl_f_eig_symgen (n, a, b,
IMSL_VECTORS,
&evec,
0);
/* Print eigenvalues and eigenvectors */
imsl_f_write_matrix ("Eigenvalues", 1, n, eval, 0);
imsl_f_write_matrix ("Eigenvectors", n, n, evec, 0);
}
Eigenvalues
1
2
3
1.386
-0.058
-0.003
Eigenvectors
1
2
3
1 0.6431
-0.1147 -0.6817
2
-0.0224 -0.6872
0.7266
3 0.7655
0.7174 -0.0858
IMSL_SLOW_CONVERGENCE_SYM The iteration for an eigenvalue failed to converge in 100 iterations before deflating.
IMSL_SUBMATRIX_NOT_POS_DEFINITE The leading # by # submatrix of the input matrix is not positive definite.
IMSL_MATRIX_B_NOT_POS_DEFINITE Matrix B is not positive definite.
|
Visual Numerics, Inc. PHONE: 713.784.3131 FAX:713.781.9260 |