## module sturmSeq ''' p = sturmSeq(c,d,lam). Returns the Sturm sequence {p[0],p[1],...,p[n]} associated with the characteristic polynomial |[A] - lam[I]| = 0, where [A] = [c\d\c] is a n x n tridiagonal matrix. numLam = numLambdas(p). Returns the number of eigenvalues of a tridiagonal matrix [A] = [c\d\c] that are smaller than 'lam'. Uses the Sturm sequence {p} obtained from 'sturmSeq'. ''' from numarray import ones, Float64 def sturmSeq(d,c,lam): n = len(d) + 1 p = ones((n),type=Float64) p[1] = d[0] - lam for i in range(2,n): ## if c[i-2] == 0.0: c[i-2] = 1.0e-12 p[i] = (d[i-1] - lam)*p[i-1] - (c[i-2]**2)*p[i-2] return p def numLambdas(p): n = len(p) signOld = 1 numLam = 0 for i in range(1,n): if p[i] > 0.0: sign = 1 elif p[i] < 0.0: sign = -1 else: sign = -signOld if sign*signOld < 0: numLam = numLam + 1 signOld = sign return numLam