Вздох.Вычисление детерминанта для определения сингулярности - это совершенно нелепая вещь.Особенно это касается большой матрицы.Извините, но это так.Зачем?Да, некоторые книги говорят вам сделать это.Может быть, даже ваш инструктор.
Аналитическая особенность - это одно.Но как насчет численного определения сингулярности?Если вы не используете символический инструмент, MATLAB использует арифметику с плавающей запятой.Это означает, что он хранит числа как числа с плавающей запятой и значения двойной точности.Эти числа не могут быть меньше по величине, чем
>> realmin
ans =
2.2251e-308
(На самом деле, MATLAB немного ниже, чем в терминах денормализованных чисел, которые могут снизиться примерно до 1e-323.)Чтобы сохранить число меньше этого, MATLAB считает, что оно равно нулю.
>> A = 1e-323
A =
9.8813e-324
>> A = 1e-324
A =
0
Что происходит с большой матрицей?Например, является ли эта матрица единственной:
M = eye(1000);
Поскольку M - единичная матрица, она довольно явно неособа.Фактически, det предполагает, что это не единственное число.
>> det(M)
ans =
1
Но, умножьте это на некоторую константу.Это делает это не единственное число?НЕТ !!!!!!!!!!!!!!!!!!!!!!!!Конечно, нет.Но все равно попробуйте.
>> det(M*0.1)
ans =
0
Хмм.Это странно.MATLAB говорит мне, что определитель равен нулю.Но мы знаем, что определителем является 1e-1000.О да.Черт возьми, 1e-1000 меньше, на значительную сумму, чем наименьшее число, которое я только что показал вам, что MATLAB может хранить как двойное число.Таким образом, определитель теряет значение, даже если он явно не равен нулю.Является ли матрица единственной?Конечно, нет.Но использование det терпит неудачу здесь?Конечно, будет, и это вполне ожидаемо.
Вместо этого используйте хороший инструмент для определения сингулярности.Используйте такой инструмент, как cond или rank.Например, можем ли мы обмануть ранг?
>> rank(M)
ans =
1000
>> rank(M*.1)
ans =
1000
Видим, что ранг знает, что это матрица полного ранга, независимо от того, масштабируем мы ее или нет.То же самое верно и для cond, вычисляющего число условия M.
>> cond(M)
ans =
1
>> cond(M*.1)
ans =
1
Добро пожаловать в мир арифметики с плавающей запятой.И, кстати, забудьте о det как о инструменте практически для любых вычислений, использующих арифметику с плавающей запятой.Это плохой выбор почти всегда.