尝试绘制对数函数,
\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}
可以看出,该函数需要在 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}
另一种方法是将形式重写为参数化形式。然后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}
最后,两种方法可以结合起来得到平滑的曲线:
\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 处理。输出: