Добро пожаловать в удивительно дурацкий мир арифметики с плавающей точкой.MATLAB вычисляет определитель, используя разложение LU, то есть линейную алгебру.Это происходит потому, что определитель крайне неэффективен для массивов даже небольшого размера, если только он этого не сделал.
Следствием такого разложения LU является то, что определитель вычисляется как число с плавающей запятой.Это не проблема, ЕСЛИ ВЫ не ввели задачу, столь же простую, как у вас, - определитель матрицы 2x2, состоящей только из маленьких целых чисел.В этом случае сам определитель также будет (разумно) малым целым числом.Таким образом, вы можете решить проблему, просто вычислив определитель матрицы 2x2 самостоятельно, используя формулу из учебника.
D = A (1,1) * A (2,2) - A (1,2)* A (2,1);
Это будет точно верно для небольших целочисленных матриц A, хотя даже это может показать некоторую потерю точности для НЕКОТОРЫХ матриц.Например, рассмотрим простую матрицу 2x2 A:
>> A = [1e8 1;1 1e8];
Мы знаем, что определитель этой матрицы равен 1e16-1.
>> det(A)
ans =
1e+16
Конечно, MATLAB отображает это как 1e16.Но на самом деле число, сгенерированное функцией det в MATLAB, на самом деле равно 9999999999999998, поэтому 1e16-2.Как плохо, если бы я использовал формулу, которую я дал выше для определителя 2x2, он дал бы результат, который все еще неверен, 10000000000000000. Оба результата были отклонены на 1. Вы можете узнать больше об этих проблемах, обратившись к справке по eps.
Суть в том, что есть некоторые матрицы 2x2, в которых вычисление определителя будет просто проблематичным, даже если они являются целочисленными матрицами.
Как только ваши матрицы станут нецелыми, тогда вещи действительностановятся истинными числами с плавающей точкой, а не целыми числами.Это означает, что вы просто ДОЛЖНЫ использовать сравнения с допусками на них, а не тест на точное единство.Это хорошее правило в любом случае.Всегда используйте допуск при выполнении теста на равенство, по крайней мере, до тех пор, пока вы не научитесь достаточно знать, когда нарушать это правило!
Итак, вы можете выбрать такой тест:
if abs(det(A) - 1) < (10*eps(1))
warning('The sky is falling! det has failed me.')
end
Обратите внимание, что я использовал eps (1), так как мы сравниваем вещи с 1. Тот факт, что я умножил eps на 10, допускает небольшой скачок в вычислении определителя.
Наконец,Вы должны знать, что какой бы тест вы не использовали для этого здесь определителя, часто это BBBBBBBBBBAAAAAAAAAADDDDDDDD!Да, возможно, ваш учитель сказал вам сделать это, или вы нашли что-то в учебнике.Но детерминант просто плохо использовать для численных расчетов.Почти всегда есть альтернативы определителю.Опять же, это называется суждением, зная, что то, что вам говорят, на самом деле неправильно.