-
Notifications
You must be signed in to change notification settings - Fork 200
/
Copy pathlamRange.py
33 lines (32 loc) · 1.1 KB
/
lamRange.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
## module lamRange
''' r = lamRange(d,c,N).
Returns the sequence {r[0],r[1],...,r[N]} that
separates the N lowest eigenvalues of the tridiagonal
matrix [A] = [c\d\c]; that is, r[i] < lam[i] < r[i+1].
'''
from numarray import ones,Float64
from sturmSeq import *
from gerschgorin import *
def lamRange(d,c,N):
lamMin,lamMax = gerschgorin(d,c)
r = ones((N+1),type=Float64)
r[0] = lamMin
# Search for eigenvalues in descending order
for k in range(N,0,-1):
# First bisection of interval(lamMin,lamMax)
lam = (lamMax + lamMin)/2.0
h = (lamMax - lamMin)/2.0
for i in range(1000):
# Find number of eigenvalues less than lam
p = sturmSeq(d,c,lam)
numLam = numLambdas(p)
# Bisect again & find the half containing lam
h = h/2.0
if numLam < k: lam = lam + h
elif numLam > k: lam = lam - h
else: break
# If eigenvalue located, change the upper limit
# of search and record it in [r]
lamMax = lam
r[k] = lam
return r