预计阅读

用 tikz 绘制一个凸锥





2023年我想用 tikz 绘制一个凸锥(凸锥优化),遇到一个问题,这个问题Maybe a bug in addplot3,最终发现不是软件的BUG,而是遇到了浮点数计算溢出的问题,这个问题是绘图者自己应该考虑的。本文将 TikZ 绘图的代码和问题暂记于此。

方程 \[x^2+y^2+z^2-2xyz=1,\quad x,y,z\in[-1,1]\] 是一个闭合的曲面,见下图。


\begin{tikzpicture}
\begin{axis}
[ 
  view/h=-30,
  colormap/viridis, % 调色板
  colorbar,   % 图例
  3d box,     % 前景的框
  samples=25, % 分割数
  axis equal image,
  z buffer=sort, 
  grid=major, % 网格线
  title={$x^2+y^2+z^2-2xyz=1$}, % 标题
  % opacity=0.7,   % 透明度
  % shader=interp, % 插值
]
\addplot3 [surf,domain=-1:1] (
 {x},
 {y},
 {x*y - sqrt((x^2-1)*(y^2-1))}
);
\addplot3 [surf,domain=-1:1] (
 {x},
 {y},
 {x*y + sqrt((x^2-1)*(y^2-1))}
);
\end{axis}
\end{tikzpicture}
TikZ 绘制三维图

图 1: TikZ 绘制三维图

用 tikz 绘制此图形的办法是绘制两个曲面,它们合在一起就是目标曲面,从数学上 \(x*y + \sqrt{x^2*y^2 - x^2 - y^2 + 1}\)\(x*y + \sqrt{(x^2-1)*(y^2-1)}\) 是一样的,但是,在计算机的世界要考虑浮点数溢出的问题,数学上等价与计算机等价不同,因为计算机所能表示的实数和数学课本里的实数域不是等价的。


\begin{tikzpicture}
\begin{axis}
[ 
  view/h=-30,
  colormap/viridis,
  colorbar,
  3d box,
  samples=25,
  axis equal image,
  z buffer=sort,
  grid=major,
  title={$x^2+y^2+z^2-2xyz=1$},
  % opacity=0.7,
  shader=interp,
]
\addplot3 [surf,domain=-1:1] (
 {x},
 {y},
 {x*y - sqrt((x^2-1)*(y^2-1))}
);
\addplot3 [surf,domain=-1:1] (
 {x},
 {y},
 {x*y + sqrt((x^2-1)*(y^2-1))}
);
\end{axis}
\end{tikzpicture}
TikZ 绘制三维图

图 2: TikZ 绘制三维图