超立方体内刻超球面

超立方体内刻超球面

让我们考虑一个超球面半径r刻在超立方体边长为2r。然后取半径为 的超球面的体积r与边长为 的超立方体的体积之比l = 2r。我们观察到以下趋势。

在二维中我们有

在此处输入图片描述

在三维中我们有

在此处输入图片描述

对于一般情况,随着维数d渐近增加,我们得到

在此处输入图片描述

这意味着随着维数的增加,超立方体的大部分体积都在角落,而中心基本上是空的。在非常高的维度上,这个图形看起来像豪猪,如下图所示(图片取自扎基,2013)。

在此处输入图片描述

子图 (a) 表示二维空间中内接超立方体的超球面。子图 (b) 和 (c) 分别表示三维和四维空间中的相同概念。在d维度中,有2^d角和2^(d - 1)对角线。内接圆的半径反映了超立方体和内接超球面在d维度上的体积差异。

我的问题:如何开始复制此图?我应该使用 Metapost 还是 TiKZ?提前感谢任何指示或建议?

答案1

这是 Metapost 中的一次尝试。

在此处输入图片描述

图片显示d=2,,,和。计算和存储比率比每次在 MP 中摆弄它们更d=3容易。显然它不适用于,并且对于你基本上会得到一个完全黑色的光盘。d=4d=6d<2d>8

prologues := 3;
outputtemplate := "%j%c.eps";

ratio2  = 0.78540 ; 
ratio3  = 0.52360 ; 
ratio4  = 0.30843 ; 
ratio5  = 0.16449 ; 
ratio6  = 0.08075 ; 
ratio7  = 0.03691 ; 
ratio8  = 0.01585 ; 
ratio9  = 0.00644 ; 

vardef hs_in_hc(expr d, r) = % d = dimensions, r = outer radius 
   save s, inner_circle, outer_circle;
   s = 8/(2**d); % there are 8 points on a fullcircle path
   path outer_circle, inner_circle;
   outer_circle = fullcircle scaled 2r;
   inner_circle = outer_circle rotated 22.5s scaled (0.9*ratio[d]);
   image(
     fill inner_circle withcolor .8 white;
     draw inner_circle;
     draw point 0 of outer_circle -- point 0 of inner_circle
        for i=s step s until 8-eps: 
          -- point i of outer_circle 
          -- point i of inner_circle 
        endfor
        -- cycle;
     for i=0 step s until 8-eps: 
       draw origin -- point i of outer_circle dashed withdots scaled .5;
     endfor
    ) enddef;

beginfig(1);

  draw hs_in_hc(2,50);
  draw hs_in_hc(3,50) shifted 100 right;
  draw hs_in_hc(4,50) shifted 200 right;
  draw hs_in_hc(6,50) shifted 300 right;

endfig;
end.

笔记

eps在普通的 Metapost 中被定义为一个小的正数。该值实际上是 0.00049。我在上面使用它是为了确保循环在达到 8 之前停止。Metapost 中最小的可能正数是epsilon,其定义为1/256/256

答案2

将内圆半径改为 的函数并不难\N。我将其保留为常数,因为我现在懒得去寻找这样的函数。

静态版本

\documentclass[pstricks,border=12pt]{standalone}
\usepackage{multido}

\begin{document}
\makeatletter
\def\N{12}\degrees[\N]
\begin{pspicture}[dimen=m,linejoin=1](-5,-5)(5,5)
    \pscustom
    {
        \moveto(!5 0)
        \multido{\i=0+1}{\numexpr\N-1}{\lineto(!3 \i\space .5 add \pst@angleunit PtoC)\lineto(!5 \i\space 1 add \pst@angleunit PtoC)}
        \lineto(!3 \N\space 0.5 sub \pst@angleunit PtoC)
        \closepath
    }
    \pscircle{3}
\end{pspicture}
\end{document}

在此处输入图片描述

动画版

它只是为了好玩而已。

\documentclass[pstricks,border=12pt]{standalone}
\usepackage{multido}

\begin{document}
\makeatletter
\multido{\ic=4+1}{10}{%
\def\N{\ic}\degrees[\N]
\begin{pspicture}[dimen=m,linejoin=1](-5,-5)(5,5)
    \pscustom
    {
        \moveto(!5 0)
        \multido{\i=0+1}{\numexpr\N-1}{\lineto(!3 \i\space .5 add \pst@angleunit PtoC)\lineto(!5 \i\space 1 add \pst@angleunit PtoC)}
        \lineto(!3 \N\space 0.5 sub \pst@angleunit PtoC)
        \closepath
    }
    \pscircle{3}
    \rput(0,0){$N=\N$}
\end{pspicture}}
\end{document}

在此处输入图片描述

答案3

这是一个纯 TikZ/pgf 解决方案。我正在使用我自己关于伽马函数和双阶乘的问题在这里

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{math}
\usetikzlibrary{calc} 

\tikzmath{
  function doublefactorial(\x) {
    if (\x > 1) then {
      return \x * doublefactorial(\x-2);
    } else {
      return 1;
    };
  };
  % this definition only works for positive integers and half integers
  function gamma(\x) {
    if isodd(int(2*\x)) then {
      return doublefactorial(int(2*\x-2))* sqrt(pi) / 2^(\x-0.5);
    } else {
      return factorial(int(\x-1));
    };
  };
}

\newcommand\hyperintersection[3][(0,0)]{
  \pgfmathparse{360/2^#2}
  \let\stepsize\pgfmathresult
  \pgfmathparse{2^(#2)/pi *#3* pi^(0.5*#2) / (2^(#2) * gamma(#2/2+1))  * sin(180 / 2^#2)}
  \let\radfrac\pgfmathresult
  \begin{scope}[shift={#1}]
    \draw[fill=lightgray] (0,0) circle (\radfrac*#3);
    \foreach \x in {0,\stepsize,...,360} {
      \draw (\x:#3) -- (\x+.5*\stepsize:\radfrac*#3) -- (\x+\stepsize:#3);
      \draw[very thin,densely dashed] (\x:#3) -- (0,0);
    }
  \end{scope}
}

\begin{document}
\begin{tikzpicture}[x=1cm,y=1cm]
  \hyperintersection[(0,0)]{2}{1}
  \hyperintersection[(2.5,0)]{3}{1}
  \hyperintersection[(5,0)]{4}{1}
  \hyperintersection[(7.5,0)]{5}{1}
  \hyperintersection[(10,0)]{6}{1}
\end{tikzpicture}
\end{document}

输出如下所示:

输出

相关内容