![在 tikz 中绘制三维曲面,极限为无穷大](https://linux22.com/image/342275/%E5%9C%A8%20tikz%20%E4%B8%AD%E7%BB%98%E5%88%B6%E4%B8%89%E7%BB%B4%E6%9B%B2%E9%9D%A2%EF%BC%8C%E6%9E%81%E9%99%90%E4%B8%BA%E6%97%A0%E7%A9%B7%E5%A4%A7.png)
我想绘制函数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}
如果你不介意 MetaPost 的输出,函数绘图器可以轻松做类似的事情: