Ответ 1
Нет, это не беспокоит. Эта матрица, вероятно, просто не работает с этой конкретной реализацией алгоритма собственного вектора. Эффективное и стабильное вычисление общего собственного вектора, в конце концов, нетривиально.
Библиотека Matrix
адаптирована из Java-пакета JAMA, в котором говорится, что она выполняет числовые вычисления, а не символьные вычисления:
Не распространяется. JAMA ни в коем случае не является полной средой линейной алгебры... она сосредоточена на принципе математической функциональности, необходимой для выполнения числовой линейной алгебры
Алгоритм QR: численные расчеты
Глядя на исходный код Matrix::EigenvalueDecomposition
, я обнаружил, что он называет использование алгоритма QR. Я не до конца понимаю тонкости математики, но думаю, что могу понять, почему это вычисление не удается. Механизм вычислений работает следующим образом:
На k-м шаге (начиная с k = 0) мы вычисляем QR-разложение A k= Q k R k... При определенных условиях [4] матрицы A k сходятся к треугольной матрице, форме Шура A. Собственные значения треугольной матрицы перечислены на диагонали, и задача на собственные значения решена.
В "псевдо" Ruby это концептуально означает:
working_matrix = orig_matrix.dup
all_q_matrices = []
loop do
q, r = working_matrix.qr_decomposition
all_q_matrices << q
next_matrix = r * q
break if difference_between(working_matrix, next_matrix) < accuracy_threshold
end
eigenvalues = working_matrix.diagonal_values
Для собственных векторов это продолжается:
при сходимости AQ = QΛ, где Λ - диагональная матрица собственных значений, к которым сходится A, и где Q - это совокупность всех ортогональных преобразований подобия, требуемых для ее получения. Таким образом, столбцы Q являются собственными векторами.
В "псевдо" Ruby, продолжение:
eigenvectors = all_q_matrices.inject(:*).columns
Ошибка с плавающей точкой в численных расчетах
Мы можем видеть, что итерация численных вычислений выполняется для вычисления приближенных собственных значений, и в качестве побочного эффекта собирается группа приближенных Q
матриц. Затем эти аппроксимированные Q
матрицы составляются вместе для формирования собственных векторов.
Сложность аппроксимаций - это то, что, вероятно, вызвало крайне неточные результаты. Пример катастрофической отмены в Math StackExchange показывает простое квадратичное вычисление с относительной ошибкой 400%. Вы могли бы представить, как алгоритм итеративной матрицы с повторяющимися арифметическими операциями может работать намного хуже.
Зерно соли
Опять же, у меня нет глубокого понимания математики алгоритма и его реализации, поэтому я не знаю точно, какие части вычисления вызвали вашу конкретную ошибку 85110032990182200%, но я надеюсь, что теперь вы можете понять, как это может иметь получилось.