让我们考虑一个超球面半径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=4
d=6
d<2
d>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}
输出如下所示: