Оценка погрешности добавления вектора
Кахан в " Кресте" на странице 14 показывает, что угол между истинным перекрестным произведением и углом, вычисленным с использованием арифметики с плавающей запятой, ухудшается, когда угол между двумя скрещенными векторами приближается к нулю или π, причем этот угол измеряет ошибку в вычислении с плавающей запятой нормаль к плоскости, натянутой на скрещенные векторы. По мере приближения к сингулярностям ортогональность нормали с плавающей точкой становится все более скомпрометированной. По словам Кахана, ошибка такова:
| sin (∠ (t_true, t_float)) | ≤ u + (2 / √3) u | csc (∠ (t_1, t_2)) |
где t_true - истинный ортогональный вектор после получения кросс-произведения t_1⊗t_2 с бесконечной точностью, тогда как t_float - результат кросс-произведения с использованием арифметики с плавающей запятой, а u - округление единицы.
Мой вопрос: существует ли подобное неравенство для суммы двух векторов. То есть, насколько далеко от истинного направления сумма векторов с плавающей запятой получается, когда угол между добавляемыми векторами приближается к нулю или π? В моем конкретном приложении векторы будут иметь единичную длину.
Редактировать: я должен добавить, что вектор, который является суммой двух векторов, будет нормализован.
1 ответ
Принимать c
быть вычисленным v-w
а также e
разница между c
и что вы хотели вычислить, а именно (v+deltav) - (w+deltaw)
, Вот, e
учитывает как ошибку округления в вычислениях, так и ошибку аппроксимации в ваших входных данных.
принимать r
быть отношением ||e|| / ||c||
, Это должно быть меньше единицы, иначе мы просто не знаем, где находится истинное решение.
По тригонометрии угол между c
а также c+e
является arccos(c^T (c+e) / sqrt(c^T c (c+e)^T (c+e))) = arccos((1 + alpha r) / sqrt(1 + 2 alpha r + r^2)
, где -1 <= alpha <= 1
это отношение e^T c
в sqrt(c^T c e^T e)
, Косинус угла между c
а также c+e
сворачивается когда alpha
это точно -r
в этот момент угол arccos(sqrt(1 - r^2)) = arcsin(r)
,
Вы можете получить тот же результат из закона синусов. Учитывая c
и обязанность ||e||/||c||
точки, которые могут быть обоснованно c+e
лежать на круге с центром в c
радиуса ||e||
, Худший c+e
будет на границе и линии от начала координат до худшего c+e
сделает прямой угол с линией от c+e
в c
, Таким образом, угол противоположный c
это прямой угол. По закону синусов, тогда, ||e|| / sin(theta) = ||c||
, из которого следует тот же результат.