对数函数的错误绘图

对数函数的错误绘图

尝试绘制对数函数,

\begin{tikzpicture}
    \draw [->,>=latex] (-2,0) -- (5,0) node [below]  {$x$};
    \draw [->,>=latex] (0,-3) -- (0,3) node [left]  {$y$};
    \clip (-2,-3) rectangle (5,3);
    \draw [very thick,blue,domain=0.01:4.5,smooth] plot (\x, {ln(\x)});
 \end{tikzpicture}

我得到了蓝线的这种波浪行为:

图片

你能注意到吗?

有办法解决吗?

答案1

plot函数默认使用 25 个样本,均匀分布在 x 值中:

\documentclass{article}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}
  \draw [->,>=latex] (-2,0) -- (5,0) node [below]  {$x$};
  \draw [->,>=latex] (0,-3) -- (0,3) node [left]  {$y$};
  \clip (-2,-3) rectangle (5,3);
  \draw [very thick,
         blue,
         domain=0.01:4.5,
         smooth,
         samples=25,% default 
         variable=\x,
  ] plot[mark=x] (\x, {ln(\x)});
\end{tikzpicture}
\end{document}

25 个样本和分数的结果

可以看出,该函数需要在 y 轴附近有更高的样本密度,一种方法是增加样本数量,绘图使用:

\documentclass{article}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}
  \draw [->,>=latex] (-2,0) -- (5,0) node [below]  {$x$};  
  \draw [->,>=latex] (0,-3) -- (0,3) node [left]  {$y$};  
  \clip (-2,-3) rectangle (5,3);  
  \draw [very thick,
         blue,
         domain=0.01:4.5,
         smooth,
         samples=100,
         mark=x,
  ] plot (\x, {ln(\x)});
\end{tikzpicture}
\end{document}

100 个样本和标记的结果

另一种方法是将形式重写为参数化形式。然后plot函数使用该参数来获取分布更好的样本。下一个示例用 t 平方替换 x(选项的值也domain需要转换):

\documentclass{article}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}
  \draw [->,>=latex] (-2,0) -- (5,0) node [below]  {$x$};
  \draw [->,>=latex] (0,-3) -- (0,3) node [left]  {$y$};
  \clip (-2,-3) rectangle (5,3);
  \draw [very thick,
         blue,
         domain=sqrt(0.01):sqrt(4.5),
         smooth,
         samples=25,
         variable=\t,
  ] plot[mark=x] (\t*\t, {ln(\t*\t)});
\end{tikzpicture}
\end{document}

二次参数和 25 个样本的结果

最后,两种方法可以结合起来得到平滑的曲线:

\documentclass{article}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}
  \draw [->,>=latex] (-2,0) -- (5,0) node [below]  {$x$};
  \draw [->,>=latex] (0,-3) -- (0,3) node [left]  {$y$};
  \clip (-2,-3) rectangle (5,3);
  \draw [very thick,
         blue,
         domain=sqrt(0.01):sqrt(4.5),
         smooth,
         samples=100,
         variable=\t,
  ] plot (\t*\t, {ln(\t*\t)});
\end{tikzpicture}
\end{document}

两种方法的结果

答案2

这是pgfplots为了学术目的而进行的补充。

\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.12}

\begin{document}
\begin{tikzpicture}
  \begin{axis}[
         axis lines=middle,
         xmin=-2,xmax=5,
         ymin=-3,ymax=3,
         ticks=none
  ]
  \addplot[very thick,blue,domain=0.01:4.5,smooth,samples=100] {ln(x)};
  \end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案3

[已解决] 添加更多样本后,问题解决了

\draw [very thick,blue,domain=0.01:4.5,smooth,samples=500] plot (\x, {-ln(\x)});

答案4

出于学术目的,这也是mfpic解决这个问题的方法。它的\function宏将细分长度作为(第三个)参数,这里是 0.01,而不是样本数量。

\documentclass[border=5mm]{standalone}
\usepackage[metapost, clip]{mfpic}
  \setlength{\mfpicunit}{1cm}
  \opengraphsfile{\jobname}
\begin{document}
\begin{mfpic}[1]{-2}{5}{-3}{3}
    \doaxes{xy}
    \draw[blue]\function{0.01, \xmax, 0.01}{ln x}
\end{mfpic}
\closegraphsfile
\end{document}

先用 LaTeX 处理,再用 MetaPost 处理,最后再用 LaTeX 处理。输出:

在此处输入图片描述

相关内容