Source code for spectrum.eigen

import numpy
from . import toeplitz

__all__ = ["MINEIGVAL"]


[docs]def MINEIGVAL(T0, T, TOL): """Finds the minimum eigenvalue of a Hermitian Toeplitz matrix The classical power method is used together with a fast Toeplitz equation solution routine. The eigenvector is normalized to unit length. :param T0: Scalar corresponding to real matrix element t(0) :param T: Array of M complex matrix elements t(1),...,t(M) C from the left column of the Toeplitz matrix :param TOL: Real scalar tolerance; routine exits when [ EVAL(k) - EVAL(k-1) ]/EVAL(k-1) < TOL , where the index k denotes the iteration number. :return: * EVAL - Real scalar denoting the minimum eigenvalue of matrix * EVEC - Array of M complex eigenvector elements associated .. note:: * External array T must be dimensioned >= M * array EVEC must be >= M+1 * Internal array E must be dimensioned >= M+1 . * **dependencies** * :meth:`spectrum.toeplitz.HERMTOEP` """ M = len(T) eigval = 10 eigvalold = 1 eigvec = numpy.zeros(M+1, dtype=complex) for k in range(0,M+1): eigvec[k] = 1+0j it=0 #print 'initialisation',T0, T, eigval, eigvec maxit = 15 while abs(eigvalold-eigval)>TOL*eigvalold and it<maxit: it=it+1 eigvalold = eigval #print 'iteration ',it, 'eigvalold=',eigvalold, 'eigval=', eigval eig = toeplitz.HERMTOEP(T0, T, eigvec) SUM = 0 save =0.+0j for k in range(0, M+1): SUM = SUM + eig[k].real**2+eig[k].imag**2 save = save +eig[k]*eigvec[k].conjugate() SUM=1./SUM eigval = save.real*SUM for k in range(0,M+1): eigvec[k] = SUM * eig[k] if it==maxit: print('warning reached max number of iteration (%s)' % maxit) return eigval, eigvec