wilkinson移位的QR算法给出正确的特征值,但给出错误的特征向量

2024-04-24 01:31:31 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我尝试了这个QR算法,试图找到对称三对角矩阵的特征向量和特征值。它完美地找到了所有的特征值,但我得到了错误的特征向量。有什么建议吗? 我也知道QR_分解函数是正确的,因为当我设置uk=0时,我得到了正确的特征值和特征向量

def QR_desc_wilkinson(matriz):
    n, m = np.shape(matriz)
    converg = []
    eigenvalues = np.zeros((n,))
    V_ident = np.eye(n)
    k = 0
    uk = 0
    n -= 1
    while n > 1:
        print('@@@@@@@@@@@@@@@@@@@@@@@@')
        print(k)
        if k == 0:
            Q, R = QR_factorization(matriz)
            converg.append(abs(matriz[n, n - 1]))
            if converg[-1] < pow(10, -6):
                eigenvalues[n] = matriz[n, n]
                n -= 1
            matriz = np.matmul(R, Q)
            V_ident = np.matmul(V_ident, Q)
        else:

            delta = (matriz[n-1, n-1] - matriz[n, n]) / 2

            if delta == 0:
                delta_l = 1
            else:
                delta_l = delta

            uk = matriz[n, n] + delta - np.sign(delta_l) * math.sqrt(delta ** 2 + matriz[n, n-1] ** 2)  # delta + np.sign(delta_l)*  delta matriz[n, n]
            uk_matriz = uk * np.eye(m)


            Q, R = QR_fatorizacao(matriz - uk_matriz)
            converg.append(abs(matriz[n, n-1]))

            if converg[-1] < pow(10, -6):
                print(n)
                eigenvalues[n] = matriz[n][n]
                n -= 1
                if n == 1:
                    break

            V_ident = np.matmul(V_ident, Q)
            matriz = np.matmul(R, Q) + uk_matriz

        k = k + 1

    eigenvalues[0] = matriz[0][0]
    eigenvalues[1] = matriz[1][1]

    return eigenvalues, converg, V_ident

Tags: ifnpqrdeltaeyeprintukappend