2017-01-06 10 views
1

Я наблюдал простое, но особое поведение при использовании функции детерминанта в MATLAB, и я хотел бы получить некоторые объяснения, так как я ничего не нашел в ней в справочной документации по функциям.Объяснение по конкретному результату детерминантной функции MATLAB

Я генерация случайной унитарной матрицы Q со следующим кодом:

[Q, R] = qr(randn(3)); 

После этого я оцениваю определитель Q с функцией det:

det(Q) 

Я бы ожидать, что результатом будет -1.000 или 1.000. Однако формат не является постоянным. Так что, когда я делаю что-то вроде этого:

detResults = zeros(100,1); 
for ii = 1:100 
    [Q, R] = qr(randn(3)); 
    detResults(ii,1) = det(Q); 
end 

detResults вектор содержит 1.000 и иногда 1. Это просто проблема с печатным форматом или вызвана чем-то другим?

ответ

3

Это связано с точностью с плавающей точкой. Каждый раз, когда вы повторяете этот цикл, хотя теоретически вы получите детерминант 1 для матрицы Q, числа в самих матрицах иррациональны, поэтому теоретически единственный способ получить значение 1 - это когда ваши числа представлены с бесконечная точность. Иногда есть достаточно цифр, чтобы MATLAB мог безопасно округлить до 1 с уверенностью. Кроме того, вы не получаете полную картину. Причина, по которой вы видите 1.0000 и 1, также связана с форматом печати. Формат печати по умолчанию показывает только до пяти знаков после запятой, но может быть разумным показывать больше десятичных знаков, чтобы оценить большую картину.

Вот небольшой пример с использованием только 10 итераций вместо 100.

Используя формат печати по умолчанию:

>> detResults 

detResults = 

    1.0000 
    1.0000 
    1.0000 
    1.0000 
    1.0000 
    1.0000 
    1.0000 
    1.0000 
    1.0000 
    1.0000 

Использование формата повышенной точности (только для отображения целей) с format long g:

>> format long g; 
>> detResults 

detResults = 

        1 
    0.999999999999999 
        1 
        1 
    0.999999999999999 
        1 
        1 
    0.999999999999999 
        1 
    0.999999999999999 

Внутренне, это действительно зависит от того, что такое матрица Q и что вы получаете из сумки, когда y ou порождают случайные матрицы. Однако, насколько точность для использования для дальнейших расчетов, 0.999... очень близка к 1, поэтому для всех целей и задач вы должны считать это равным 1.

2

Я считаю, что вы наблюдаете эффект конечной точности числа чисел с плавающей запятой. По умолчанию MATLAB использует 64-битные числа с плавающей запятой. Таким образом, именно эта система может быть представлена ​​только конечным множеством чисел с не более чем 2^64 уникальными элементами. Все остальные числа, возникающие при промежуточных вычислениях, округляются до ближайших представимых значений. Эти операции руления приводят к ошибкам, которые незначительны для большинства, но не для всех приложений.

Вы можете оценить ошибки в результатах, добавляя эту строку кода:

err = detResults - 1; 

Простой пример для наблюдения за конечной точности артефакт является:

2-(sqrt(2))^2 

Очевидно, что это должно должно быть ровно 0. Но MATLAB вернет ненулевое небольшое число из-за ошибок округления в квадратичном и квадратичном шагах.