Python代码为解决特征值问题
Python code for solving the eigenvalue problem
''' lam,x = inversePower5(Bv,d,e,f,tol=1.0e-6).
Inverse power method for solving the eigenvalue problem
[A]{x} = lam[B]{x}, where [A] = [f\e\d\e\f] is
pentadiagonal and [B] is sparce. User must supply the
function Bv(v) that returns the vector [B]{v}.
'''
from numpy import zeros,dot
from LUdecomp5 import *
from math import sqrt
from random import random
def inversePower5(Bv,d,e,f,tol=1.0e-6):
n = len(d)
d,e,f = LUdecomp5(d,e,f)
x = zeros(n)
for i in range(n): # Seed {v} with random numbers
x[i] = random()
xMag = sqrt(dot(x,x)) # Normalize {v}
x = x/xMag
for i in range(30): # Begin iterations
xOld = x.copy() # Save current {v}
x = Bv(xOld) # Compute [B]{v}
x = LUsolve5(d,e,f,x) # Solve [A]{z} = [B]{v}
xMag = sqrt(dot(x,x)) # Normalize {z}
x = x/xMag
if dot(xOld,x) < 0.0: # Detect change in sign of {x}
sign = -1.0
x = -x
else: sign = 1.0
if sqrt(dot(xOld - x,xOld - x)) < tol:
return sign/xMag,x
print 'Inverse power method did not converge'
