Войти
ПрограммированиеФорумФизика

Символы Леви-Чивита , векторное произведение векторов

Advanced: Тема повышенной сложности или важная.

#0
(Правка: 7:41) 5:57, 14 янв. 2021

Нужно сделать векторное произведение для векторов N-размерности.
Использую символы Леви-Чивита, но осилил только для 3D.
Как мне брать CrossProduct в N-мерном пространстве, в частности нужно N = 27D 

P.S: Можно с помощью косиметричной матрицы

Как сделать пермутации по индексам , чтобы получить индексы Леви-Чивита в коде , по этой формуле?
Леви-Чивита | Символы Леви-Чивита , векторное произведение векторов

template <typename T, std::size_t N>
IVector<T, N> ICrossProduct(const std::initializer_list<IVector<T, N>>& values)
{
    IVector<T, N> res;
    if(N == 3)
    {
        int i=0;
        IVector<T, N> V[N];
        for (auto it: values) V[i++] = it;

        for (std::size_t i = 0; i < N; ++i)
        {
            for (std::size_t j = 0; j < N; ++j)
            {
                for (std::size_t k = 0; k < N; ++k)
                {
                   int LiveChivitaSymbol = ((i-j)*(j-k)*(k-i));
                   res[i] += (LiveChivitaSymbol / 2) * V[0][j] * V[1][k];
                }
            }
        }
    }
    else if(N == 4)
    {
//        int i=0;
//        IVector<T, N> V[N];
//        for (auto it: values) V[i++] = it;

//        for (std::size_t i = 0; i < N; ++i)
//        {
//            for (std::size_t j = 0; j < N; ++j)
//            {
//                for (std::size_t k = 0; k < N; ++k)
//                {
//                   for (std::size_t c = 0; c < N; ++c)
//                   {
//                       int LiveChivitaSymbol = ((i-j)*(j-k)*(k-c)*(c-i));
//                       res[i] += (LiveChivitaSymbol / 2) * V[0][j] * V[1][k] * V[2][c];
//                   }
//                }
//            }
//        }
    }
    else if ........27D

    return res;
}

#1
8:26, 14 янв. 2021

дай угадаю: ты опять понятия не имеешь, зачем оно тебе сдалось?

#2
9:21, 14 янв. 2021

Suslik
> дай угадаю: ты опять понятия не имеешь, зачем оно тебе сдалось?
Надо решить одну видуманою мной же мат-задачу , для этого надо обобщить векторное произведение !
Ну и в целом , это же очень интересно !  Это просто игра в математику !

#3
(Правка: 10:09) 10:09, 14 янв. 2021

werasaimon
это такая же "игра в математику", как разбивание витрин магазина клюшкой — хоккей.

векторное произведение двух векторов определено только для трёх- и семимерного пространства:
https://en.wikipedia.org/wiki/Cross_product
> But if the product is limited to non-trivial binary products with vector results, it exists only in three and seven dimensions

#4
11:35, 14 янв. 2021

Suslik
Ну очевидно же, что речь о векторном произведении, как (N-1)-арной функции:
https://en.wikipedia.org/wiki/Cross_product#External_product .

#5
11:53, 14 янв. 2021

FordPerfect
> Ну очевидно же, что речь о векторном произведении, как (N-1)-арной функции:
кому очевидно? в 43-х предыдущих темах про векторное произведение, созданных ОП'ом, ему во что бы то ни стало было нужно именно векторное произведение двух векторов.

#6
11:59, 14 янв. 2021

Suslik
> очевидно?
Ну
> const std::initializer_list<IVector<T, N>>& values
намекает, что векторов не обязательно 2.

> в 43-х предыдущих темах про векторное произведение, созданных ОП'ом, ему во что бы то ни стало было нужно именно векторное произведение двух векторов.
Точно? Вроде когда как.

#7
(Правка: 22:29) 22:28, 14 янв. 2021

Вроде так:

template<int N,typename T>
void cross_product(T inputs[][N],T output[])
{
    T m[N][N];
    for(int i=0;i<N-1;++i)
        for(int j=0;j<N;++j)
            m[i][j]=inputs[i][j];
    for(int i=0;i<N;++i)
    {
        for(int j=0;j<N;++j)
            m[N-1][j]=T(i==j);
        output[i]=determinant(m);
    }
}

#8
(Правка: 10:43) 1:47, 15 янв. 2021

Suslik
Но я не знаю что тут сказать! Очевидно что векторное произведение для векторов N-1.
Для этого достаточно было глянуть на код!

FordPerfect
Inputs[][N] это что вектора в тезорном произведении?

#9
4:27, 15 янв. 2021

werasaimon
> Inputs[][N] это
2-мерный массив - матрица (размера (N-1) x N), строки которой - входные векторы для функции векторного произведения.

#10
10:42, 15 янв. 2021

FordPerfect
> werasaimon
> > Inputs[][N] это
> 2-мерный массив - матрица (размера (N-1) x N), строки которой - входные векторы
> для функции векторного произведения.
попробовал в 4D и 3D! ouput - не равно CrossProduct ...?

#11
22:04, 15 янв. 2021

werasaimon
> и 3D
Вроде работает:
https://rextester.com/KZEX45006

ПрограммированиеФорумФизика