det определитель квадратной матрицы

## Синтаксис

                d = det(X)
                [e,m] = det(X)

## Аргументы

X
  квадратная матрица вещественных или комплексных чисел, полиномов или дробно-рациональных выражений. Принимаются разрежённо-кодированные матрицы.

d
  Скаляр типа `X`: определитель `X`. Если `X` является разрежённо-кодированной, то `d` является плотной.

m
  вещественное или комплексное число: определитель мантиссы по основанию 10 `abs(m) ∈ [1,10)`. Не поддерживается для полиномиального или дробно-рационального `X`.

e
  целое: определитель экспоненты по основанию 10, такой, что `d = m * 10e`. Не поддерживается для полиномиального или дробно-рационального `X`.

## Описание

d = det(X) выдаёт определитель матрицы `X`.

Для полиномиальной или дробно-рациональной матрицы `d=det(X)` использует `determ(..)`, чей алгоритм основан на БПФ. Альтернативно может использоваться `d=detr(X)`, основанный на алгоритме Леверье. Оба метода выдают одинаковые результаты. Для дробно-рациональных матриц может потребоваться отключение `simp_mode(%f)` для получения идентичных результатов.

[e, m] = det(X) может использоваться только для матрицы чисел. Этот синтаксис позволяет преодолеть переполнение снизу или сверху, когда `abs(d)` меньше, чем `number_properties("tiny")` ≈ 2,23 10-308 либо больше, чем `number_properties("huge")` ≈ 1,80 10308.

Для плотных матриц `det(..)` основан на процедуре из Lapack DGETRF для вещественных матриц и ZGETRF для комплексных.

Для разрежённых матриц определитель получается из LU-разложения, благодаря библиотеке umfpack.

## Примеры

    A = rand(3,3)*5;
    det(A)
    [e, m] = det(A)

    // Матрица комплексных чисел:
    // A = grand(3,3,"uin",0,10) + grand(3,3,"uin",0,10)*%i
    A = [3+%i, 9+%i*3, 9+%i ; 8+%i*8, 4+%i*3, 7+%i*7 ; 4, 6+%i*2, 6+%i*9]
    det(A)
    [e, m] = det(A)
    abs(m)  // in [1, 10)

    --> A = rand(3,3)*5;
    --> det(A)
     ans  =
      -10.805163

    --> [e, m] = det(A)
     e  =
       1.
     m  =
      -1.0805163

    --> // Matrix of complex numbers:
    --> A = [3+%i, 9+%i*3, 9+%i ; 8+%i*8, 4+%i*3, 7+%i*7 ; 4, 6+%i*2, 6+%i*9]
     A  =
       3. + i     9. + 3.i   9. + i
       8. + 8.i   4. + 3.i   7. + 7.i
       4. + 0.i   6. + 2.i   6. + 9.i

    --> det(A)
     ans  =
       745. - 225.i

    --> [e, m] = det(A)
     e  =
       2.
     m  =
       7.45 - 2.25i

    --> abs(m)  // in [1, 10)
     ans  =
       7.7823518

Очень большой или маленький определители: обработка переполнения снизу и сверху:

    // Очень большой определитель:
    n = 1000;
    A = rand(n, n);
    det(A)
    [e, m] = det(A)

    // Очень маленький определитель (разрежённой кодированной матрицы):
    A = (triu(sprand(n,n,1)) + diag(rand(1,n)))/1.5;
    det(A)
    prod(diag(A))
    [e, m] = det(A)
    A = A/2;
    det(A)
    [e, m] = det(A)

    --> // Very big determinant:
    --> A = rand(n, n);
    --> det(A)
     ans  =
      -Inf

    --> [e, m] = det(A)  // -3.1199e743
     e  =
       743.
     m  =
      -3.1198687

    --> // Very small determinant (of a sparse-encoded matrix):
    --> n = 1000;
    --> A = (triu(sprand(n,n,1)) + diag(rand(1,n)))/1.5;
    --> det(A)
     ans  =
       5.21D-236

    --> prod(diag(A))
     ans  =
       5.21D-236

    --> [e, m] = det(A)
     e  =
      -236.
     m  =
       5.2119757

    --> A = A/2;
    --> det(A)
     ans  =
       0.

    --> [e, m] = det(A)
     e  =
      -537.
     m  =
       4.8641473

Определитель полиномиальной матрицы:

    s = %s;
    det([s, 1+s ; 2-s, s^2])

    w = ssrand(2,2,4);
    roots(det(systmat(w))),trzeros(w)   //нули линейной системы

    --> det([s, 1+s ; 2-s, s^2])
     ans  =
      -2 -s +s² +s³

    --> w = ssrand(2,2,4);
    --> roots(det(systmat(w))),trzeros(w)
     ans  =
      -3.1907522 + 0.i
       2.3596502 + 0.i

     ans  =
       2.3596502 + 0.i
      -3.1907522 + 0.i

## Смотрите также

- detr
- determ
- simp_mode

## История

6.1.1 Синтаксис [e,m]=det(X) расширен до разрежённых матриц.