答案1
我假设您希望获得如下内容:
您的代码仅给出垂直虚线之间的部分,因此您的代码没有任何错误,只有选定的域没有显示sin(1/x)
x --> 0 出现的频率如何。
\documentclass[border=3mm,tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\draw[->] (-0.1, 0) -- + (5,0) node[below left] {$x$};
\draw[->] (0,-1.1) -- + (0,2.7) node[below left] {$\sin(1/x)$};
\draw[dashed] (1,-1) -- + (0,2) (2,-1) -- + (0,2);
\foreach \i in {0.5, 1,...,4}
{
\draw (\i,0) -- + (0,-0.1) node[below,font=\scriptsize,fill=white] {\i};
}
\draw[blue, samples=1000, domain=0.01:0.2] plot(\x, {sin(1/\x r)});
\draw[blue,smooth,samples=50, domain=0.2:5] plot(\x, {sin(1/\x r)});
\end{tikzpicture}
\end{document}
函数分为两部分绘制,因为这样可以节省样本数量并缩短计算时间。
附录:
如果您也想为负参数绘制此函数,则需要相应地采用域。我建议将函数分为两部分绘制:域中的样本数量较少$|x|>0.2$
,域 $|x|<0.2$ 中的样本数量较多。
如果您希望将函数域限制为 (-1,1) 并获得更大的图像,则可以按下面的 MWE 所示缩放它。
您还可以使用此功能进行绘制pgfplots
:
在这种情况下,您无需关心图像大小。它由图像宽度决定。但是,这里也可以像在纯 TikZ 中一样将函数分为两部分绘制。这样,您就可以节省绘制此函数所需的时间。
附录中图片的 MWE 为:
\documentclass[border=3mm,tikz]{standalone}
\usepackage{pgfplots}
\begin{document}
%with tikz
\begin{tikzpicture}[xscale=2.5]
\draw[->] (-1.1,0) -- + (2.2,0) node[below left] {$x$};
\draw[->] (0,-1.1) -- + (0,2.7) node[below left] {$\sin(1/x)$};
\foreach \i in {-1, -0.5,0.5,1}
{
\draw (\i,0.1) -- + (0,-0.2) node[below,font=\scriptsize,fill=white] {\i};
}
\draw[blue,samples=50,domain=-1:-0.2,smooth] plot(\x, {sin(1/(\x) r)});
\draw[blue,samples=1000,domain=-0.2:-0.01] plot(\x, {sin(1/(\x) r)});
\draw[blue,samples=1000,domain=0.01: 0.2] plot(\x, {sin(1/(\x) r)});
\draw[blue,samples=50,domain= 0.2: 1,smooth] plot(\x, {sin(1/(\x) r)});
\end{tikzpicture}
% with pgfplots
\begin{tikzpicture}
\begin{axis}[
width=6cm,
axis lines=middle,
ticklabel style={fill=white},
xmin=-1.2,xmax=1.2,
ymin=-1.2,ymax=1.5,,
xlabel=$x$,ylabel=$\sin(1/x)$,
]
\addplot[blue,samples=50,domain=-1:-0.2,smooth] {sin(1/\x r)};
\addplot[blue,samples=1000,domain=-0.2:-0.02] {sin(1/\x r)};
\addplot[blue,samples=1000,domain=0.02: 0.20] {sin(1/\x r)};
\addplot[blue,samples=50,domain= 0.2: 1,smooth] {sin(1/\x r)};
\end{axis}
\end{tikzpicture}
\end{document}