Smallest non-zero eigenvalue for a generalized eigenvalue problem
16 views (last 30 days)
I have two matrices, A and B, for which I want to solve the generalized eigenvalue problem Ax=lambda* Bx. In fact I only need the smallest non-zero eigenvalue. The properties of the matrices:
A is symmetric, singular with known nullity (but no a-priori known kernel), sparse
B is symmetric, singular, positive semi-definite with known kernel, sparse, even the linearly independent part is ill-conditioned
The smallest non-zero eigenvalue (due to ill-conditioning) would numerically result something like 1e-15. However, I know that the eigenvalue I am interested in is not near the round-off plateau. If I knew this value approximately, I could use
lambda = eigs(A, B, k, guess);
where k is the number of eigenvalues I request and guess is close to the smallest non-zero eigenvalue I am looking for.
Since I have no information about the guess, currently I convert A and B to full matrices and call eig on it:
lambda = eig(full(A), full(B));
However, this is very slow. Any ideas?
Andrew Knyazev on 12 Aug 2018
Since both matrices A and B are singular, it is not an easy problem numerically. Even eig(full(A), full(B)) may give you wrong answers. EIGS in the call eigs(A, B, k, guess) is not probably going to work, since it relies on computing the inverse of the matrix A - guess B, which is singular in your case.
If the kernel of B is a subset of the kernel of A, and the difference in dimensions is not too large, you may want to try https://www.mathworks.com/matlabcentral/fileexchange/48-lobpcg-m with the constraint blockVectorY being the set of vectors spanning the known kernel of B. LOBPCG gives you k smallest, no matter zeros, or not, however, so you may need to choose k large enough to get to where you need. The value of k in LOBPCG is the number of the linearly independent initial approximate eigenvectors. If k is too large, relative to the matrix size, it will not work well...