How to compute interior eigenvectors that exclude certain eigenvalues?

I have a FEM matrix equation of the form:
(K - T)*x = T*b
Where T is a mass matrix and K is a stiffness matrix. I am using matlab's eigs function to compute the eigenvalues and eigenvectors of this system in a generalized eigenvalue problem where A = K-T and B = T.
The expected eigenspectrum is a flat line at and then a linearly increasing slope for . It seems as if avoiding the computation of eigenvectors siginificantly increases the speed of the eigs function. I currently try to avoid the computation by using the sigma option for eigs. Is there a better way to exclude certain eigenvalues from the eigs computation?

댓글 수: 6

Matt J
Matt J 2021년 11월 12일
편집: Matt J 2021년 11월 12일
What sigma option setting are you using? And what is 'b' in your equation?
I was using sigma=30, I figure if I know the slope of the eigenplot I can extrapolate a line and center point from lambda=-1.
Seems like a good idea. I assume you're using eigs(A<B,k,30) with k>1. What isn't working well with that approach?
Lucas Banting
Lucas Banting 2021년 11월 12일
편집: Lucas Banting 2021년 11월 12일
The issue is the computation speed is extremely slow when the lambda=-1 eigenvectors are computed, but if I shift the spectrum enough to avoid them it is much faster to compute eigenvectors.
But once you've done your piecewise linear fit to the spectrum, you should be able to avoid processing lambda=-1. Just set sigma and k to include only lambda>-1. Isn't that what you are already doing, and if so what's wrong with it?
I was basically wondering if there was an eigenvalue algorithm where I could just specify as inputs (a, b) to compute all eigen values within the range (a, b).

댓글을 달려면 로그인하십시오.

 채택된 답변

Matt J
Matt J 2021년 11월 14일
편집: Matt J 2021년 11월 14일
I was basically wondering if there was an eigenvalue algorithm where I could just specify as inputs (a, b) to compute all eigen values within the range (a, b).
It doesn't appear that there is, however, a faster way to compute the lambda=-1 eigenvectors might be to recognize that they are the null vectors of K, and so you can do,
[~,S,nullVectors]=svds(K,800,'smallest');
Not only should this find you the lambda=-1 eigenvectors, but also inspection of diag(S) should also tell you were the up-slope in your attached figure begins.
Together with the maximum eigenvectors,
eigmax=eigs(A,B,10,'largestabs')
you should be able to fit the slope more accurately than with sigma=30.

댓글 수: 1

Thanks for your help. The solution I ended up using was limiting the MaxIterations and SubspaceDimension parameters, the eigenvectors associated with the nullspace of K converge last so they are just not computed in this case.

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Matt J
Matt J 2021년 11월 12일

0 개 추천

If you'll be computing the majority of the eigenvalues anyway, it would be faster to use eig() than eigs().

댓글 수: 1

The image I shared was only a portion of the eigen spectrum, the size of the matrices are practically one to two orders of magnitude larger than the number of needed eigenvectors.

댓글을 달려면 로그인하십시오.

카테고리

도움말 센터File Exchange에서 Linear Algebra에 대해 자세히 알아보기

제품

릴리스

R2020b

질문:

2021년 11월 12일

댓글:

2021년 11월 15일

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by