在 tikz 中绘制三维曲面,极限为无穷大

在 tikz 中绘制三维曲面,极限为无穷大

我想绘制函数1/(x²+y²),但由于它在中趋于无穷大(0,0),我得到了一个可怕的绘图:

\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
  \begin{axis}[grid=both]
    \addplot3 [surf] {1 / (x^2 + y^2)};
  \end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

通过限制 z 的范围,我得到的图无论如何都不太好:

\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
  \begin{axis}[grid=both,restrict z to domain=0:1]
    \addplot3 [surf] {1 / (x^2 + y^2)};
  \end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

我想要得到一些平滑的东西,以一个圆圈结束(例如,该函数与平面 z=1 相交的圆)。

像这样的事情就很棒了:

在此处输入图片描述

答案1

经过几个小时(至少一个小时)尝试实现第一个图中写的内容后,我想到极坐标。它有效。

\documentclass{scrartcl}
    \usepackage{tikz}
    \usepackage{pgfplots}

\begin{document}
    \begin{tikzpicture}
    \begin{axis}[width=\textwidth,
    axis equal,
    xmin=-0.1,xmax=5,ymin=-0.5,ymax=3,zmin=-0.4,zmax=7,
    xtick=\empty,ytick=\empty,ztick=\empty,
    axis lines=center]

    \addplot3[surf,opacity=0.5,domain=0.4:2.2,y domain=0:360,samples=40]
    ({x*cos(y)+3}, {x*sin(y)+2}, {1/(x^2)});
    \end{axis}
    \end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

pgfplots支持“带星号”的版本restrict z to domain*,该版本将所有较大的值剪辑到规定的域中。结果是顶部有一个封闭的盖子:

\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.14}

\begin{document}
\begin{tikzpicture}
  \begin{axis}[grid=both,restrict z to domain*=0:10]
    \addplot3 [surf,samples=51,
        domain=-2:2,miter limit=1] {1 / (x^2 + y^2)};
  \end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

这与 71 个样本的情况相同:

在此处输入图片描述

答案3

sagetex以下是使用该软件包和(免费)的可能性思杰云让你访问计算机代数系统的帐户智者适用于您的 LaTeX 文档。其思想是生成数据点,并针对“大”z 值将该点重新定义为图表上的最大 z 值。

\documentclass[11pt,border={10pt 10pt 10pt 10pt}]{standalone}
\usepackage{pgfplots}
\usepackage{sagetex}
\begin{document}
\begin{sagesilent}
x = var('x')
y = var('y')
step = .10
x1 = -2
x2 = 2
y1 = -2
y2 = 2
output = ""
output += r"\begin{tikzpicture}[scale=1.0]"
output += r"\begin{axis}[xmin=%d, xmax=%d, ymin=%d, ymax=%d]"%(x1,x2,y1,y2-step)
output += r"\addplot3[surf,mesh/rows=%d] coordinates {"%((y2-step-y1)/step+1)
# rows is the number of y values
for y in srange(y1,y2,step):
    for x in srange(x1,x2,step):
        if (1/(x^2+y^2))<10:
            output += r"(%f, %f, %f) "%(x,y,1/(x^2+y^2))
        else:
            output += r"(%f, %f, %f) "%(x,y,10)
output += r"};"
output += r"\end{axis}"
output += r"\end{tikzpicture}"
\end{sagesilent}
\sagestr{output}
\end{document}

在 SagemathCloud 中运行你会得到以下输出: 在此处输入图片描述

如果你不介意 MetaPost 的输出,函数绘图器可以轻松做类似的事情:

在此处输入图片描述

相关内容