以下代码绘制所需的水平集:
\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
我猜这些问题与您使用的巨大范围有关。在 x 的域 [-400,400] 中,函数有很多周期cos(x)
,因此如果您没有足够的采样点,则会出现混叠伪影。此外,默认情况下,y 的域也将是 [-400,400],并且在此范围内,函数 y^2 会取非常大的值,这将导致浮点舍入误差。
如果为 y 指定一个较短的范围,则可以获得更好、更一致的结果。但它们也与使用 y 域 [-400:400] 获得的结果非常不同。事实上,我不得不将 y 轴更改为从 -5 到 5 来适应结果,但我猜这些结果比以前的结果更正确。
这些是y domain=-10:10
样本=25
样本=45
样本=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}