Почему обратное равенство не удовлетворяет в MATLAB? - PullRequest
0 голосов
/ 30 октября 2011

MATLAB не удовлетворяет матричной арифметике для обратного, то есть;

(ABC)-1 = C-1 * B-1 * A-1

в MATLAB,

if inv(A*B*C) == inv(C)*inv(B)*inv(A)
   disp('satisfied')
end

Это не соответствует требованиям. Когда я сделал это format long, я понял, что есть разница в баллах, но это даже не удовлетворяет, когда я делаю это format rat.

Почему это так?

Ответы [ 2 ]

2 голосов
/ 30 октября 2011

Очень вероятно ошибка с плавающей запятой .Обратите внимание, что функция format влияет только на отображение чисел, а не на то, как MATLAB вычисляет или сохраняет их. Так что установка rat не поможет исправить ошибку.t проверено, но вы можете попробовать Fractions Toolbox для точной арифметики рациональных чисел, которая должна дать равенство выше.

1 голос
/ 31 октября 2011

Учитывайте это (MATLAB R2011a):

a = 1e10;
>> b = inv(a)*inv(a)
b =
  1.0000e-020
>> c = inv(a*a)
c =
  1.0000e-020
>> b==c
ans =
     0
>> format hex
>> b
b =
   3bc79ca10c924224
>> c
c =
   3bc79ca10c924223

Когда MATLAB вычисляет промежуточные величины inv(a) или a*a (является ли a скалярной или матрицей), он по умолчанию сохраняетони как ближайшее число с плавающей запятой двойной точности - что не точно.Поэтому, когда эти немного неточные промежуточные результаты используются в последующих вычислениях, возникает ошибка округления.

Вместо сравнения чисел с плавающей запятой для прямого равенства, например inv(A*B*C) == inv(C)*inv(B)*inv(A), часто лучше сравнивать абсолютную разницудо порога, такого как abs(inv(A*B*C) - inv(C)*inv(B)*inv(A)) < thresh.Здесь thresh может быть произвольным небольшим числом или некоторым выражением, включающим eps, что дает вам наименьшее различие между двумя числами с точностью, с которой вы работаете.

Только команда formatуправляет отображением результатов в командной строке, а не способом внутреннего хранения результатов.В частности, format rat не заставляет MATLAB выполнять вычисления символически.Для этого вы можете взглянуть на Symbolic Math Toolbox .format hex часто даже более полезен, чем format long, для диагностики проблем точности с плавающей запятой, например той, с которой вы столкнулись.

...