我试图在 Mathematica 中绘制一个在单位单纯形上定义的函数。举一个随机的例子,假设我想在所有 x1、x2、x3 上绘制 sin(x1*x2*x3) 使得 x1、x2、x3 >= 0 和 x1 + x2 + x3 = 1。
有没有一种巧妙的方法可以做到这一点,除了明显的写作方式

Plot3D[If[x+y<=1,Sin[x y(1-x-y)]],{x,0,1},{y,0,1}]

?

理想情况下,我想要的是一种在单纯形上仅绘制 的方法。我发现网站 http://octavia.zoology.washington.edu/Mathematica/ 有一个旧包,但它不适用于我的最新版本的 Mathematica。

最佳答案

如果你想获得像你链接的那个包一样的对称图,你需要找出将单纯形放入 x/y 平面的旋转矩阵。您可以在下面使用此功能。它有点长,因为我留在计算中以找出单纯形居中。具有讽刺意味的是,4d 单纯形图的转换要简单得多。修改 e 变量以获得不同的边距

simplexPlot[func_, plotFunc_] :=
 Module[{A, B, p2r, r2p, p1, p2, p3, e, x1, x2, w, h, marg, y1, y2,
   valid},
  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];

  (* map 3d probability vector into 2d vector *)
  p2r[{x_, y_, z_}] := Most[A.{x, y, z}];

  (* map 2d vector in 3d probability vector *)
  r2p[{u_, v_}] := B.{u, v, Sqrt[1/3]};

  (* Bounds to center the simplex *)
  {p1, p2, p3} = Transpose[A];

  (* extra padding to use *)
  e = 1/20;

  x1 = First[p1] - e/2;
  x2 = First[p2] + e/2;
  w = x2 - x1;
  h = p3[[2]] - p2[[2]];
  marg = (w - h + e)/2;
  y1 = p2[[2]] - marg;
  y2 = p3[[2]] + marg;

  valid =
   Function[{x, y}, Min[r2p[{x, y}]] >= 0 && Max[r2p[{x, y}]] <= 1];
  plotFunc[func @@ r2p[{x, y}], {x, x1, x2}, {y, y1, y2},
   RegionFunction -> valid]
  ]

这是如何使用它
simplexPlot[Sin[#1 #2 #3] &, Plot3D]

wolfram-mathematica - 如何在 Mathematica 中绘制在单位单纯形上定义的函数?-LMLPHP
(来源: yaroslavvb.com )
simplexPlot[Sin[#1 #2 #3] &, DensityPlot]

wolfram-mathematica - 如何在 Mathematica 中绘制在单位单纯形上定义的函数?-LMLPHP
(来源: yaroslavvb.com )

如果您想在原始坐标系中查看域,可以将绘图旋转回单纯形
t = AffineTransform[{{{-(1/Sqrt[2]), -(1/Sqrt[6]), 1/Sqrt[3]}, {1/
      Sqrt[2], -(1/Sqrt[6]), 1/Sqrt[3]}, {0, Sqrt[2/3], 1/Sqrt[
      3]}}, {1/3, 1/3, 1/3}}];
graphics = simplexPlot[5 Sin[#1 #2 #3] &, Plot3D];
shape = Cases[graphics, _GraphicsComplex];
Graphics3D[{Opacity[.5], GeometricTransformation[shape, t]},
 Axes -> True]

wolfram-mathematica - 如何在 Mathematica 中绘制在单位单纯形上定义的函数?-LMLPHP
(来源: yaroslavvb.com )

这是另一个单纯形图,使用来自 hereMeshFunctions->{#3&} 的传统 3d 轴,完整代码 here

wolfram-mathematica - 如何在 Mathematica 中绘制在单位单纯形上定义的函数?-LMLPHP
(来源: yaroslavvb.com )

10-06 01:57