幂交互法,求最新的特征值和向量?

问题描述

简述幂迭代法的算法,用以下归一化求实对称矩阵的最大特征值和对应的特征向量。

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)))