Численная проблема при вычислении дополнительной проекции
Я использую Matlab для вычисления следующей проблемы:
A
, B
два m
от n
ортогональные матрицы, A'*A = I
а также B'*B = I
где I
это единичная матрица. А также m
намного больше чем n
, Я вычисляю C = (2B*B'-I)*A
, который также является ортогональной матрицей.
Но в Matlab точность числа приводит к следующей проблеме:
max(max(abs(A'*A-I))) = e0 > 0
max(max(abs(B'*B-I))) = e0 > 0
И вычислил C
имеет max(max(abs(C'*C-I))) = e1 > e0
,
Если я повторю вышеупомянутый процесс, вычисляя D = (2C*C'-I)*B
эта ошибка связана поднять на D
С увеличением числа таких итераций эта ошибка взрывается.
Есть ли способ вычислить без увеличения этой ошибки?
Спасибо!
1 ответ
Как правило, чем больше вычислений и преобразований вы выполняете, тем больше вам нужно беспокоиться об ошибке с плавающей запятой.
Чтобы смягчить последствия, есть несколько возможностей:
1) Используйте программное обеспечение, такое как Maple или Mathematica, которое поддерживает точную арифметику, что в основном устранит проблему за счет большей вычислительной нагрузки. Насколько я понимаю, Matlab не поддерживает точную арифметику (но я могу ошибаться в этом...)
2) Используйте более высокую точность, чем Double, чтобы уменьшить ошибку с плавающей запятой. Например, отправка FEX Multiple Precision Toolbox для MATLAB утверждает, что поддерживает произвольно большие форматы точности. Я никогда не использовал его сам, поэтому я не могу комментировать, насколько хорошо это работает.
3) В зависимости от относительных величин чисел в ваших матрицах, могут быть некоторые числовые приемы или преобразования, которые вы можете использовать для уменьшения ошибки с плавающей запятой. Это большая тема, но в целом идея состоит в том, чтобы попытаться масштабировать вашу проблему так, чтобы все числа были как можно ближе друг к другу в порядке величины.
Могут быть и другие возможности, о которых я не знаю. Я, конечно, не эксперт в этой области. Мне будет интересно посмотреть, что предлагают другие респонденты.
О, еще одна вещь, я просто наткнулся на тесно связанный вопрос ТАК.