eig_symgen


   more...

Computes the generalized eigenexpansion of a system Ax = λBx. The matrices A and B are real and symmetric, and B is positive definite.

Synopsis

#include <imsl.h>

float *imsl_f_eig_symgen (int n, float *a, float *b, , 0)

The type double function is imsl_d_eig_symgen.

Required Arguments

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.

Return Value

A pointer to the n eigenvalues of the symmetric matrix. To release this space, use imsl_free. If no value can be computed, then NULL is returned.

Synopsis with Optional Arguments

#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_A_COL_DIM, int a_col_dim,

IMSL_B_COL_DIM, int b_col_dim,

IMSL_EVECU_COL_DIM, int evecu_col_dim,

0)

Optional Arguments

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

Description

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.

Examples

 

Example 1

 

#include <imsl.h>

 

int 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);

}

Output

 

Eigenvalues

1 2 3

1.386 -0.058 -0.003

Example 2

This example is a variation of the first example. Here, the eigenvectors are computed as well as the eigenvalues.

 

#include <imsl.h>

 

int 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);

}

Output

 

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

Warning Errors

IMSL_SLOW_CONVERGENCE_SYM

The iteration for an eigenvalue failed to converge in 100 iterations before deflating.

Fatal Errors

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.