QR算法求特征值python实现--基于Householder变换

import numpy as np

 

#定义householder变换

def householder(x,i=0):

    x=x.reshape(len(x),1)

    ei=np.zeros((len(x),1))

    ei[i]=1

    y=np.linalg.norm(x,ord=2)*ei

    if x[i]>0:

        w=(x+y)/np.linalg.norm(x+y)

    else:

        w=(x-y)/np.linalg.norm(x-y)

    H=np.eye(len(x))-2*np.dot(w,w.T)

    return H

 

#进行QR分解

def QRFact(A):

    dim=len(A)

    Ri=A.copy()

    for i in range(dim-1):

        x=Ri[i:,i]

        Hi=householder(x)

        Ri[i:,i:]=np.dot(Hi,Ri[i:,i:])

        Qi=np.eye(dim)

        Qi[i:,i:]=Hi

        if i==0:

            Q=Qi

        else:

            Q=np.dot(Qi,Q)

    D=np.asmatrix(np.diag(np.where(np.diag(Ri)<0,-1,1)))

    R=D*np.asmatrix(Q.T)*D.T

    return Q,R

 

#定义迭代求特征值

def eig_QR(A,eps=1e-6):

    Ak=A.copy()

    flag=1

    n=0

    while flag:

        Ak0=Ak.copy()

        Qk,Rk=QRFact(Ak)

        Ak=Rk*Qk

        if(np.sum(np.diag(np.abs(Ak-Ak0)))

            flag=0

        n=n+1

    return np.diag(Ak),n

 

#主程序

if __name__=='__main__':

    A=np.array([[3,2],[4,5]],dtype='float')

    eig=eig_QR(A,1e-6)

    print('eig:',eig)

    eigval, vec = np.linalg.eig(A)

    print(eigval)


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部