微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。