Неверные собственные векторы, но правильные собственные значения с помощью QR-алгоритма с кусочком питона - PullRequest
0 голосов
/ 03 июня 2019

Я сделал очень простой код QR-алгоритма, который возвращает собственные значения и собственные векторы.Во многих случаях это работает хорошо.Однако в некоторых случаях он возвращает неправильные собственные векторы, хотя собственные значения верны.

Например, матрица из: [[52,30,49,28],[30,50,8,44],[49,8,46,16],[28,44,16,22]], процесс возвращает правильные собственные значения и собственные векторы.Но, в случае: [[1,-2,0,5],[0,7,1,5],[0,4,4,0],[0,0,0,2]], он возвращает неправильные собственные векторы с правильными собственными значениями.Я проверил правильные значения с помощью функции 'восемь', и все правильные собственные значения и собственные векторы являются действительными числами.Таким образом, это не проблема комплексных чисел.Я не могу понять, почему это происходит.

import numpy as np 

def process(self, mat: List[List[float]]):
    check = True
    a = mat[:]
    residual = 0.00001
    eigenValues = []
    eigenVectors = np.eye(len(mat))

    while check:
        check = False
        q, r = np.linalg.qr(a)
        a = np.dot(r, q)
        eigenVectors = np.dot(eigenVectors, q)

        for i in range(len(mat)):
            for j in range(i):
                if abs(a[i][j]) > residual: check = True

    for i in range(len(a)): eigenValues.append(a[i][i])

    print(eigenValues) #[1.0, 8.000000054834647, 2.9999999451653365, 2.0]
    print(eigenVectors) #[[1.0, 0.0, 0.0, 0.0], 
                          [0.0, 0.7071067941112008, -0.7071067682618934, 0.0], 
                          [0.0, 0.7071067682618939, 0.7071067941112008, 0.0], 
                          [0.0, 0.0, 0.0, 1.0]]
    # The correct eigenvectors are 
       [[ 1.         -0.19802951  0.23570226  0.90744251],
        [ 0.          0.69310328 -0.23570226 -0.1814885 ],
        [ 0.          0.69310328  0.94280904  0.362977  ],
        [ 0.          0.          0.          0.1088931 ]]

Это проблема, возникающая из алгоритма рефлексии домохозяйства, который принимает файл numpy.linalg.qr?Нужно ли применять вращение Гивенса?Или дело в коде моего алгоритма QR?

1 Ответ

0 голосов
/ 04 июня 2019

Алгоритм QR, как известно, способен получить как собственное значение, так и собственный вектор, когда входная матрица симметрична, но для асимметричного случая такого обещания нет.

Следовательно, ваша первая входная матрица работает, потому что онасимметрично.

Ваша вторая матрица ввода не симметрична.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...