Проектирование точек от 4D-пространства в 3D-пространстве в Mathematica

StackOverflow https://stackoverflow.com/questions/3506982

Вопрос

Предположим, что у нас есть набор точек с ограничением, что для каждой точки все координаты являются неотрицательными, а сумма координат равна 1. Это ограничивает точки, чтобы лежать в 3-мерном простоте, поэтому имеет смысл попытаться карту Он обратно в 3 -го размера пространства для визуализации.

Карта, которую я ищу, примет крайние точки (1,0,0,0), (0,1,0,0), (0,0,1,0) и (0,0,1) к вершинам «красиво позиционированного» регулярного тетраэдра. В частности, центр тетраэдра будет в начале происхождения, одна вершина будет лежать на оси Z, одно лицо к параллельному плоскости x, y и одному краю, чтобы быть параллельной оси x.

Вот код, который делает похожие вещи для точек в 3 измерениях, но не кажется очевидным, как расширить его до 4. В основном я ищу 4-D эквиваленты функций Tosimplex (который занимает 4 измерения на 3), и это обратно от Ssimplex

A = Sqrt[2/3] {Cos[#], Sin[#], Sqrt[1/2]} & /@ 
    Table[Pi/2 + 2 Pi/3 + 2 k Pi/3, {k, 0, 2}] // Transpose;
B = Inverse[A];
tosimplex[{x_, y_, z_}] := Most[A.{x, y, z}];
fromsimplex[{u_, v_}] := B.{u, v, Sqrt[1/3]};

(* checks *)
extreme = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}};
Graphics[Polygon[tosimplex /@ extreme]]
fromsimplex[tosimplex[#]] == # & /@ extreme

Отвечать:

Простые переформуляции ответа Деинста с точки зрения матриц дает следующее. (1 / SQRT [4] подходит как 4-я координата, потому что это расстояние до Simplex Center)

A = Transpose[{{-(1/2), -(1/(2 Sqrt[3])), -(1/(2 Sqrt[6])), 
     1/Sqrt[4]}, {1/2, -(1/(2 Sqrt[3])), -(1/(2 Sqrt[6])), 
     1/Sqrt[4]}, {0, -(1/(2 Sqrt[3])) + Sqrt[3]/2, -(1/(2 Sqrt[6])), 
     1/Sqrt[4]}, {0, 0, Sqrt[2/3] - 1/(2 Sqrt[6]), 1/Sqrt[4]}}];
B = Inverse[A];
tosimplex[{x_, y_, z_, w_}] := Most[A.{x, y, z, w}];
fromsimplex[{t_, u_, v_}] := B.{t, u, v, 1/Sqrt[4]};

(* Checks *)
extreme = Table[Array[Boole[# == i] &, 4], {i, 1, 4}];
Graphics3D[Sphere[tosimplex[#], .1] & /@ extreme]
fromsimplex[tosimplex[#]] == # & /@ extreme
Это было полезно?

Решение

Вы хотите

   (1,0,0,0) -> (0,0,0)
   (0,1,0,0) -> (1,0,0)
   (0,0,1,0) -> (1/2,sqrt(3)/2,0)
   (0,0,0,1) -> (1/2,sqrt(3)/6,sqrt(6)/3))

И это линейное преобразование, поэтому вы преобразуете

   (x,y,z,w) - > (y + 1/2 * (z + w), sqrt(3) * (z / 2 + w / 6), sqrt(6) * w / 3)

Редактировать Вы хотите, чтобы центр в начале происхождения - просто вычесть среднее значение четырех баллов. Извини

(1/2, sqrt(3)/6, sqrt(6) / 12)

Другие советы

Одна возможность:

  1. Генерировать четыре (нертоганальные) 3-векторы, \vec{v}_i от центра тетраэдра к каждой вершине.
  2. Для каждой четырех позиций x = (x_1 .. x_4) сформировать векторную сумму \Sum_i x_i*\vec{v}_i.

Конечно, это отображение не является уникальным в целом, но вы условием, что x_iСумма до 1 ограничивает вещи.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top