Ошибка с плавающей точкой в ​​расчете матрицы Ruby

Используйте Path.GetFileName(fullPath) , чтобы получить только часть имени файла, например:

OpenFileDialog.ShowDialog()
PictureNameTextEdit.Text = System.IO.Path.GetFileName(OpenFileDialog.FileName)

24
задан rwp 11 February 2018 в 00:52
поделиться

1 ответ

1120 Нет, это не беспокоит. Эта матрица, вероятно, просто не работает с этой конкретной реализацией алгоритма собственного вектора. Эффективное и стабильное вычисление общего собственного вектора нетривиально , в конце концов.

Библиотека Matrix адаптирована из JAMA, матричного пакета Java , в котором говорится, что она выполняет численные вычисления , а не символьные вычисления :

Не охвачено. 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%, но я надеюсь, что теперь вы можете понять, как это могло произойти.

1
ответ дан Kache 11 February 2018 в 00:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: