“samples”选项使用addplot3和gnuplot contour(tikz)产生空图

“samples”选项使用addplot3和gnuplot contour(tikz)产生空图

以下代码绘制所需的水平集:

\documentclass{minimal}
\usepackage{tikz}
\usepackage{pgfplots}

\begin{document}

\begin{tikzpicture}
\pgfplotsset{mystyle/.style={%
    ylabel={$y$},
    xlabel={$x$},
    xmin=-400,xmax=400,
    ymin=-.2,ymax=.2,
    view={0}{90},
    }}

\begin{axis}[mystyle]
  \addplot3[contour gnuplot={levels={.5},labels=false},domain=-400:400] {.5*y^2-cos(x)};
\end{axis}

\end{tikzpicture}
\end{document}

输出

samples=100尽管如此,输出结果还是非常粗糙。因此,我尝试通过以下方式添加选项来优化级别集:

  \addplot3[contour gnuplot={levels={.5},labels=false},domain=-400:400,samples=100] 
      {.5*y^2-cos(x)};

不幸的是,这样做会导致水平集消失。

您知道为什么吗?更重要的是,如何细化曲线?

附言:由于我的名誉,我无法上传代码输出。

答案1

不确定这里发生了什么。当您使用偶数个样本时,输出为空。如果您使用奇数个样本,则会得到结果。但是结果会根据所用样本的数量而有所不同。

样本=25

二十五

样本=45

四十五

样本=65

65

我猜这些问题与您使用的巨大范围有关。在 x 的域 [-400,400] 中,函数有很多周期cos(x),因此如果您没有足够的采样点,则会出现混叠伪影。此外,默认情况下,y 的域也将是 [-400,400],并且在此范围内,函数 y^2 会取非常大的值,这将导致浮点舍入误差。

如果为 y 指定一个较短的范围,则可以获得更好、更一致的结果。但它们也与使用 y 域 [-400:400] 获得的结果非常不同。事实上,我不得不将 y 轴更改为从 -5 到 5 来适应结果,但我猜这些结果比以前的结果更正确。

这些是y domain=-10:10

样本=25

25 好

样本=45

四十五 好

样本=65

65 好

这是我用来生成最后三个图形的代码:

\documentclass{article}
\usepackage{nopageno}
\usepackage{tikz}
\usepackage{pgfplots}

\begin{document}

\pgfplotsset{mystyle/.style={%
    ylabel={$y$},
    xlabel={$x$},
    xmin=-400,xmax=400,
    ymin=-5,ymax=5,
    view={0}{90},
    }}

\begin{tikzpicture}

\begin{axis}[mystyle]
\addplot3[contour gnuplot={levels={.5},labels=false},
      domain=-400:400, y domain=-10:10, samples=25 ] {.5*y^2-cos(x)};
\end{axis}
\end{tikzpicture}

\begin{tikzpicture}
\begin{axis}[mystyle]
\addplot3[contour gnuplot={levels={.5},labels=false},
      domain=-400:400, y domain=-10:10, samples=45 ] {.5*y^2-cos(x)};
\end{axis}
\end{tikzpicture}

\begin{tikzpicture}
\begin{axis}[mystyle]
\addplot3[contour gnuplot={levels={.5},labels=false},
      domain=-400:400, y domain=-10:10, samples=65 ] {.5*y^2-cos(x)};
\end{axis}
\end{tikzpicture}
\end{document}

答案2

据 JLDiaz 了解,

y 的定义域也是 [-400,400],在这个范围内,函数 y^2 取非常大的值,这将导致浮点舍入误差。

我使用的解决方案是手动将度数转换为弧度。结果变得有意义。当然刻度标签也发生了变化,如果需要,可以进行调整。

\documentclass{minimal}
\usepackage{tikz}
\usepackage{pgfplots}

\begin{document}

\begin{tikzpicture}
\pgfplotsset{mystyle/.style={%
 ylabel={$y$},
xlabel={$x$},
xmin=-400*pi/180,xmax=400*pi/180,
ymin=-4,ymax=4,
view={0}{90},
}}

\begin{axis}[mystyle]
\addplot3[,contour gnuplot={levels={.5},labels=false},domain=-400*pi/180:400*pi/180,samples=50] {.5*y^2-cos(x*180/pi)};
\end{axis}

\end{tikzpicture}
\end{document}

相关内容