绘制极点位于 (0,0) 处的函数 ℝ² →ℝ 的平滑图形

绘制极点位于 (0,0) 处的函数 ℝ² →ℝ 的平滑图形

我想绘制函数 f: ℝ² →ℝ,定义为f(x,y)=(xy)/(x^2+y^2)。但出现了以下问题:

在此处输入图片描述

由于(0,0)函数不连续,因此看起来有点锯齿状。为了解决这个问题,我可以强制函数输入特定点,但我找不到任何地方,也不知道这是否可行。

代码:

\begin{tikzpicture}[]
\begin{axis}[axis lines=center,
axis on top,
xtick=\empty,
ytick=\empty,
ztick=\empty,
xrange=-2:2,
yrange=-2:2
]
% function
\addplot3[domain=-2:2,y domain=-2:2,colormap/viridis,surf,opacity=0.5,samples = 55]
{(x*y)/(x^2+y^2)};
\end{axis}
\end{tikzpicture}

如何让这个功能看起来流畅?任何帮助都将不胜感激 :)

(仅仅增加样本并没有起到太大的作用,而且我遇到了以下错误:TeX 容量超出,抱歉 [主内存大小=3000000])

答案1

对于是否可以在特殊点指定特殊值这一问题的技术部分,答案是肯定的。一种可能的方法是绘制如下图所示

ifthenelse(x^2+y^2>0.05,(x*y)/(x^2+y^2),0.5*sin(2*atan2(y,x)))

0.5*sin(2*atan2(y,x))如果您接近原点,则会将表达式切换为。

也许更有趣的问题是应该放什么在那里,或者为什么放在那里0.5*sin(2*atan2(y,x))。我在 LaTeX 中添加了解释。

\documentclass[tikz,border=3mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.17}
\begin{document}
\begin{tikzpicture}[]
\begin{axis}[axis lines=center,
axis on top,
xtick=\empty,
ytick=\empty,
ztick=\empty,
xrange=-2:2,
yrange=-2:2
]
% function
\addplot3[domain=-2:2,y domain=-2:2,colormap/viridis,surf,opacity=0.5,samples = 55]
{ifthenelse(x^2+y^2>0.05,(x*y)/(x^2+y^2),0.5*sin(2*atan2(y,x)))};
\end{axis}
\node[align=left,above,text width=10cm] at (current axis.north) 
{In polar coordinates,
\[x=r\,\cos\varphi\quad\mbox{and}\quad y=r\,\sin\varphi\;,\]
such that
\[\frac{x\,y}{x^2+y^2}=\frac{r^2\,\cos\varphi\,\sin\varphi}{r^2}=\cos\varphi\,\sin\varphi\]
with $\varphi=\arctan(y/x)$. So we can replace
\[\frac{x\,y}{x^2+y^2}\to \sin(2\arctan(y/x))/2\;.\]
};
\end{tikzpicture}

\begin{tikzpicture}[]
\begin{axis}[axis lines=center,
axis on top,
xtick=\empty,
ytick=\empty,
ztick=\empty,
xrange=-2:2,
yrange=-2:2
]
% function
\addplot3[domain=-2:2,y domain=-2:2,colormap/viridis,surf,opacity=0.5,samples = 55]
{0.5*sin(2*atan2(y,x))};
\end{axis}

\end{tikzpicture}
\end{document}

在此处输入图片描述

正如您从下图所看到的,您x*y/(x^2+y^2)根本不需要,您可以0.5*sin(2*atan2(y,x))在整个域上绘图并获得非锯齿状的结果。

答案2

当我通过名为 SAGE 的计算机代数系统 (CAS) 运行该图时,图形会有一些锯齿状,因此您应该在 pgfplots 中看到一些锯齿状在此处输入图片描述

为了提高结果的精度,您可以让 SAGE 生成 x 和 y 坐标,也可以自己生成。我使用了命令,xcoords = [i for i in srange(-2,2,.06)]但您也可以轻松指定xcoords = [-2,-.75,-.1,.1,.36,1,2]。通过强制 pgfplots 通过 SAGE,您可以更好地控制绘图。(编辑:虽然鼠尾草软件包是 LaTeX 发行版的一部分,而 SAGE 不是。最简单的使用方法是通过可钙。如果您正在研究数学主题,这是一个值得熟悉的好工具。

\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
\usepackage{sagetex}
\pgfplotsset{compat=1.15} 
\begin{document}
\begin{sagesilent}
xcoords = [i for i in srange(-2,2,.06)]
ycoords = [i for i in srange(-2,2,.05)]

output = ""
output += r"\begin{tikzpicture}[scale=1.0]"
output += r"\begin{axis}[view={30}{45},xmin=%d, xmax=%d, ymin=%d, ymax=%d]"%(-2,2,-2,2)
output += r"\addplot3[colormap/viridis,surf,opacity=0.5,mesh/rows=%d] coordinates {"%(len(ycoords))
# the length of ycoords is the number of y values
for y in ycoords:
    for x in xcoords:
        output += r"(%f, %f, %f) "%(x,y,x*y/(x^2+y^2))

output += r"};"
output += r"\end{axis}"
output += r"\end{tikzpicture}"
\end{sagesilent}
\sagestr{output}
\end{document}

看起来像这样:

在此处输入图片描述

我认为只要冲浪,剧情就更好了

在此处输入图片描述

SAGE 3d 图的文档为这里

答案3

我知道它并不完美但是......

在@Schrödinger's cat 的帮助下我想到了以下内容:

输入空间中导致问题的行由 x=y 定义。因此,使用我制作的“ifthenelse”函数:

如果 |xy|< 小值,则将输出设置为 0.5

\begin{tikzpicture}[]
\begin{axis}[axis lines=center,
axis on top,
xtick=\empty,
ytick=\empty,
ztick=\empty,
xrange=-2:2,
yrange=-2:2
]
% function
\addplot3[domain=-2:2,y domain=-2:2,colormap/viridis,surf,opacity=0.5,
samples = 55]
{ifthenelse(abs(x-y)<0.1,0.5,0.5*sin(2*atan2(y,x)))};
\end{axis}
\end{tikzpicture}

因此,如果输入点靠近线,它只会将输出设置为 0.5。它仍然看起来不完美,但如果我现在增加分辨率,图表应该看起来至少有点平滑:

在此处输入图片描述

相关内容