【问题标题】:Listing all interesting sections of a tetrahedron列出四面体的所有有趣部分
【发布时间】:2010-09-20 05:42:07
【问题描述】:

答案更新,12/22: 使用 Peter Shor 的observation,即立方体上不同部分和对象排列之间存在同态,通过将一组立方体对称表示为 SymmetricGroup[8] 的子组并使用 GroupElements/Permute 列出所有此类排列,使用以下方法查找质心分配Mathematica 的 SAT 求解器,选择具有不同奇异值的点集,提供更多细节和完整代码 here

问题

一个有趣的 2D 截面是一个平面,它穿过常规 3D simplex 的中心和其他 2 个点,每个点都是一些非空顶点子集的质心。它由两个顶点子集定义。例如 {{1},{1,2}} 给出了一个由 3 个点定义的平面——四面体的中心、第一个顶点以及第一个和第二个顶点的平均值。

一组有趣的部分是一组没有两个部分在顶点重新标记下定义相同的平面。例如,设置 {{{1},{2}},{{3},{4}}} 并不有趣。有没有一种有效的方法来找到一组有趣的有趣部分?我需要一些可以推广到 7D 单纯形的 3D 部分的类似问题的东西,并在一夜之间完成。

我尝试的方法如下。一个问题是,如果你忽略几何,一些等效部分将被保留,所以我得到 10 个部分而不是 3 个。更大的问题是我使用了蛮力,它绝对不能缩放并且(需要 10^17 7D 单纯形的比较)


(来源:yaroslavvb.com

这是上面生成图片的Mathematica代码。

entropy[vec_] := Total[Table[p Log[p], {p, vec}]];
hadamard = KroneckerProduct @@ Table[{{1, 1}, {1, -1}}, {2}];
(* rows of hadamard matrix give simplex vertex coordinates *)

vertices = hadamard;
invHad = Inverse[hadamard];
m = {m1, m2, m3, m4};
vs = Range[4];

(* take a set of vertex averages, generate all combinations arising \
from labeling of vertices *)
vertexPermutations[set_] := (
   newSets = set /. Thread[vs -> #] & /@ Permutations[vs];
   Map[Sort, newSets, {2}]
   );
(* anchors used to define a section plane *)

sectionAnchors = Subsets[{1, 2, 3, 4}, {1, 3}];
(* all sets of anchor combinations with centroid anchor always \
included *)
anchorSets = Subsets[sectionAnchors, {2}];
anchorSets = Prepend[#, {1, 2, 3, 4}] & /@ anchorSets;
anchorSets = Map[Sort, anchorSets, {2}];
setEquivalent[set1_, set2_] := MemberQ[vertexPermutations[set1], set2];
equivalenceMatrix = 
  Table[Boole[setEquivalent[set1, set2]], {set1, anchorSets}, {set2, 
    anchorSets}];
Needs["GraphUtilities`"];
(* Representatives of "vertex-relabeling" equivalence classes of \
ancher sets *)
reps = First /@ StrongComponents[equivalenceMatrix];

average[verts_] := Total[vertices[[#]] & /@ verts]/Length[verts];
makeSection2D[vars_, {p0_, p1_, p2_}] := Module[{},
   v1 = p1 - p0 // Normalize;
   v2 = p2 - p0;
   v2 = v2 - (v1.v2) v1 // Normalize;
   Thread[vars -> (p0 + v1 x + v2 y)]
   ];

plotSection2D[f_, pointset_] := (
   simplex = 
    Graphics3D[{Yellow, Opacity[.2], 
      GraphicsComplex[Transpose@Rest@hadamard, 
       Polygon[Subsets[{1, 2, 3, 4}, {3}]]]}];
   anchors = average /@ pointset;
   section = makeSection2D[m, anchors];
   rf = Function @@ ({{x, y, z, u, v}, 
       And @@ Thread[invHad.{1, x, y, z} > 0]});
   mf = Function @@ {{p1, p2, p3, x, y}, f[invHad.m /. section]};
   sectionPlot = 
    ParametricPlot3D @@ {Rest[m] /. section, {x, -3, 3}, {y, -3, 3}, 
      RegionFunction -> rf, MeshFunctions -> {mf}};
   anchorPlot = Graphics3D[Sphere[Rest[#], .05] & /@ anchors];
   Show[simplex, sectionPlot, anchorPlot]
   );
plots = Table[
   plotSection2D[entropy, anchorSets[[rep]]], {rep, reps}];
GraphicsGrid[Partition[plots, 3]]

【问题讨论】:

  • 你能解释一下为什么 {{1,2},{3,4}} 不“有趣”吗?给出相同部分的重新标记是什么?
  • 您将顶点 1 映射到 3 并将顶点 2 映射到 4。这并不有趣,因为部分看起来相同。在我的图片中,您可以看到只有两种不同的形状——三角形和正方形。其他一切都是这些形状的某种旋转/反射
  • 我已经尝试了几次来弄清楚 {{1},{1,2}} 和 {{{1},{2}},{{3},{4} 的符号}},但就是不能。你能提供一个解释它的链接吗?
  • 每个部分由一组质心定义。每个质心由一组顶点定义。因此,部分集合 {{{1},{2}},{{3},{4}}} 具有 3 个嵌套级别——部分、质心、顶点。顺便说一句,这个问题由 Peter Shor 回答了 7 维单纯形 mathoverflow.net/questions/39429/…
  • 所以,如果我理解这个问题,您需要找到顶点的超集并获取其中每个集合的质心。然后创建与其中每两个相交的每个平面以及单纯形的质心……对吗?

标签: algorithm wolfram-mathematica geometry


【解决方案1】:

正确的编程解决方案大致是:

  • 观察中心以射影对出现 - 因此识别并仅保留中心集的一个或另一个半球形覆盖中的一半中心。对是彼此的集合互补。一个示例规则:所有包含顶点 1 的子集,“赤道”上的子集,包含顶点 2 的子集,以及该集合的“赤道”上的子集,包含顶点 3 的子集,依此类推,递归地保持边界一半与最小索引相邻顶点。
  • 观察到对于每个子单纯形,子单纯形要么与顶点 1 相邻,要么与单纯形的距离为 1。 (原因:四面体中的每个新顶点都连接到四面体的每个先前顶点 - 因此每个子单纯形要么入射在顶点 1 上,要么顶点 1 连接到单纯形中的每个顶点。)因此,每个子单纯形只有两个种群一种子单纯形(相对于指定的顶点)。 (我们可以用只保留每个投影对的较小成员的决定来代替这个观察,但是标记顶点的规则会更复杂。)
  • 四面体在顶点标签的排列下是完全对称的。因此,任何“有趣的部分”都等同于仅包含顶点的前导部分的另一个部分 - 即可以在某些 n 的顶点 Range[1,n] 中识别。

  • 综合以上,我们发现从有趣的部分到一组图之间存在一个凸出。对于每个图,我们必须枚举一致的顶点成员(稍后描述)。除了一个顶点,图的顶点成对出现

    • 该对包含给定基数的所有中心(给定维度的所有子单纯形)。
    • 该对中的一个成员包含入射在顶点 1 上的中心。
    • 该对中的另一个成员包含未在顶点 1 上入射的中心。
    • 特殊顶点是包含所有顶点的中心或其投影对(“空中心”)。
    • 如果图包含一对中的任何成员,则它必须(至少)包含包含在 1 上的中心的成员(或者可以重新标记顶点以实现这一点)。
  • 图的边缘被加权。权重是两个中心共享的顶点数。基于两端中心的基数以及两个顶点是否都是第一个成员、两个第二个成员或两者中的一个,对权重有限制。 (例如,“One of each”不能共享顶点 1。)
  • 图是一组顶点的完整子图,包含特殊的顶点。例如,对于四面体,图是上面确定的一组顶点上的 K_{3},其中一个顶点是特殊的顶点,并且具有边权重。
  • 一个部分是一个图形,其标签在每条边的末端的中心具有一致的应用(即一致地标记以尊重由边的权重指示的共享顶点的数量,并且一组图形顶点中的每个子集包含顶点 1)。因此,给定的图可以表示多个部分(通过不同的标签)。 (没有听起来那么多的选项,好像一秒钟就有意义。)
  • 如果由其中心坐标组成的矩阵的行列式为零,则该部分不感兴趣。

在具有四个顶点的三个维度的情况下,我们得到以下集合(我们使用短射影对,因为在此示例中具有足够的可见性,不需要更简单的顶点标记拒绝规则):
0:{1,2,3,4}的射影对
1:{1}
1':{2}、{3}、{4}
2:{1,2},{1,3},{1,4}
2':到 2 的投影对(因此省略)
3: 到 1' 的射影对(所以省略)
3': 到 1 的射影对(所以省略)

标签限制:
{0->x,x}
{0->x',x}
{1->1,1} - 不允许:中心不包含两次
{1->1',0}
{1->2,1}
{2->2,1}
这些图顶点不可能有其他权重。

图是 0 上的 K_{3} 事件,以下图在图选择规则中仍然存在:
答:{0->1,1},{0->1',1},{1->1',0}
B:{0->2,2},{0->2,2},{2->2,1}

A 只有一个标签:{1}、{2}、{},是您的三角形有趣集。此标签的行列式不为零。
B 只有一个标签:{1,2}、{1,3}、{},是您的正方形有趣集。此标签的行列式不为零。

将转换为代码作为练习留给读者(因为我必须离开工作)。

【讨论】:

  • 有趣的观察,虽然我没有直接看到它们对应的算法
  • (1) 生成加权截面图并删除不允许的图。 (2) 对于每个幸存的截面图,生成所有可行的四面体顶点标记并删除那些体积为零的。这个问题的三维版本非常简单,生成所有可能的加权图,然后说服自己除了上面的 A 和 B 之外的所有图都是不允许的或多余的,这是很有启发性的。对于标记,有两部分 - 迭代落在同一中心的边缘之间的重叠程度,然后通过贪心算法应用标签。
  • 我找到了使用新版本的群论函数更直接的方法,但感谢您的努力
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-17
  • 1970-01-01
  • 2011-11-19
  • 2018-01-04
  • 2012-01-07
相关资源
最近更新 更多