детерминант матрицы

Maxpol2

Помнится, была некая формула (универсальная) для вычисления субжа через тензор Леви-Чивита. Может, кто вспомнит?

Maxpol2

up

Sanych

det(a_ij)=e^ijk a_i1a_j2a_k3,
сумма по i,j,k в правой части подразумевается
Это для размерности 3 и с 3 индексами
Аналогично для размерности n, только индексов n, и соответственно матрица nXn.
координаты "тензора Леви Чевита" от символов e^ijk отличается на константу, но это я уж так, на всякий случай напоминаю

Maxpol2

А есть какой-нить способ (легко программируемый) вычисления e^ijkl (у меня матрица 4*4)?

Sanych

e^ijkl это знак перестановки 1234 в ijkl, или ноль - если есть совпадающие индексы.
Считать знак перестановки на 4 элементах можно как (-1) в степени число инверсий. Инверсия это пара с неправильным порядком, например i>k. Вроде это несложно программируется. Если бы я еще понял зачем оно может быть надо... но это скорее проблемы метода
Формулой можно записать
e^ijkl= sgn(j-i)sgn(k-i)sgn(l-i)sgn(k-j)sgn(l-j)sgn(l-k)
sgn это знак (-1,0 или 1)

Maxpol2

Спасибо.
[просьба не сносить в программинг!]
А суть вот в чём. Надо написать прогу (на уровне 1 курса которая считает det
для 4*4 матрицы с помощью циклов.
Первой идеей было сделать "вычёркиванием", но это получалось шибко
сложным (т.е. обещающим много глюков).
Потом, решая задачку по квантам, вспомнил формулу и решил попробовать.

maxxl

Хмм... Много глюков, говоришь?
double det (matrix &A)
{
if (A.GetHeight!=A.GetWidth
{
cerr << "Matrix should be square!" << endl;
exit (1);
}

double d=0.0;
matrix B(A.GetHeight-1, A.GetWidth-1);
div_t div_result;
if (A.GetHeight>2)
{
for(int i=1; i<=A.GetHeight; i++)
{
for(int j=1; j<=A.GetHeight-1;j++)
{
for(int n=1; n<=A.GetHeight-1;n++)
{
if(i==1) {B(n,j)=A(n+1,j+1);}
if (j<i) B(n,j)=A(n+1,j);
if (j>i) B(n,j)=A(n+1,j+1);
}
}
div_result=div(i, 2);
if (div_result.rem==1)
{
d=d+A(1,i)*det(B);
}
if (div_result.rem==0)
{
d=d-A(1,i)*det(B);
}
}
}
if (A.GetHeight==1) d=d+A(1,1);
if (A.GetHeight==2) d=d+A(1,1)*A(2,2)-A(2,1)*A(1,2);
return d;
}
как раз с помощью миноров ("вычёркивание").
P.S. Класс матриц самописный, вернее, PANZER'описный.

yurimedvedev

Если привести матрицу к треугольному виду (напр. методом Гаусса то детерминант будет равен произведению членов на главной диагонали.
Можешь воспользоваться моей прогой, выкинуть немного придется...

spiritmc

Вычисление детерминантов уже давно запрограммировали.
---
...Я работаю антинаучным аферистом...
Оставить комментарий
Имя или ник:
Комментарий: