问题描述
简述幂迭代法的算法,用以下归一化求实对称矩阵的最大特征值和对应的特征向量。
Vn = V/√(V .V) (Vn = 归一化特征向量)
解决方法
'''
Findung highest eigenvector and eigenvalue of a real symmetric matrix
'''
import numpy as np
def eigen_vect_and_value(A,u_initial,step,accuracy):
u = u_initial
u = u / np.sqrt(u.dot(u))
while True:
Au = A.dot(u)
k = u.dot( Au )
Au_ku = Au - k*u
if Au_ku.dot(Au_ku) < accuracy**2:
return u,k
u = u + step * Au_ku
u = u / np.sqrt(u.dot(u))
'''
2D test:
'''
'''
Rotation Matrix Generation,given angle
'''
def U(angle):
cos_ = np.cos(angle)
sin_ = np.sin(angle)
return np.array([[cos_,-sin_],[sin_,cos_]])
'''
Egienvalue Diagonal Matrix Generation,given eigenvalues
'''
def D(k):
return np.diag(k)
'''
Symmetric Matrix SymMtrx generation,with eigenvector matrix W
and diagonal egienvalue matrix D(k)
'''
def Make_2D_Sym_Mtrx(angle,egenvalues):
W = U(angle)
return W.dot( D(egenvalues).dot(W.T) ),W
'''
Test input:
'''
rot_angle = np.pi/7
egenvalue_max = 3
egenvalue_min = 0.8
step = 0.3
accuracy = 5e-10
'''
Creating a 2D test symmetric matrix and egienvector matrix
'''
k = np.array([egenvalue_max,egenvalue_min])
SymMtrx,W = Make_2D_Sym_Mtrx(rot_angle,k)
'''
Applying iterative algorithm on the 2D test symmetric matrix
'''
u_max,k_max = eigen_vect_and_value(SymMtrx,np.array([1,0]),accuracy)
print('calculated egienvalue')
print(k_max)
print('')
print('actual eigenvalue')
print(k[0])
print('')
print('calculated eigenvector')
print(u_max)
print('')
print('actual eigenvector')
print(W[:,0])
print('')
print('error')
print(min(np.linalg.norm(W[:,0] - u_max),np.linalg.norm(W[:,0] + u_max)))