我想在一个小域上绘制 $y = 2^x$。不幸的是,尽管 tikz (v 2.1) 似乎能够计算 2^{负数},但它无法正确绘制它们。
我的最小例子是:
\documentclass{minimal}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
The value of $2^{-1}$ is \pgfmathparse{pow(2,-1)}\pgfmathresult.
\begin{tikzpicture}
\draw[thick,->] (-2,0) -- (2,0) node[right]{$x$};
\draw[thick,->] (0,0) -- (0,5) node[above]{$y$};
\draw[blue,domain=-2:2] plot (\x,{exp(ln(2)*\x)});
\draw[red,domain=-2:2] plot (\x,{pow(2,\x)});
\end{tikzpicture}
\end{document}
红色和蓝色的图应该是相同的,它们代表第一个点(x = -2)和所有非负值,但绘图算法似乎存在一些问题,这意味着存在一个奇怪的扭结,使红色图几乎对称。
这是一个已知问题吗?如果是,它已在 tikz 的后续版本中修复吗?
答案1
是的,正如 Leo Liu 所说,这个问题在 CVS 版本中已经修复。更改是在pgfmathfunctions.basic.code.tex 修订版 1.5。
如果您不想安装 CVS 版本,您也可以exp
通过在序言中包含以下代码来包含有问题的功能的新版本:
% fixed exp function.
%
\makeatletter
\let\pgfmath@function@exp\relax % undefine old exp function
\pgfmathdeclarefunction{exp}{1}{%
\begingroup
\pgfmath@xc=#1pt\relax
\pgfmath@yc=#1pt\relax
\ifdim\pgfmath@xc<-9pt
\pgfmath@x=1sp\relax
\else
\ifdim\pgfmath@xc<0pt
\pgfmath@xc=-\pgfmath@xc
\fi
\pgfmath@x=1pt\relax
\pgfmath@xa=1pt\relax
\pgfmath@xb=\pgfmath@x
\pgfmathloop%
\divide\pgfmath@xa by\pgfmathcounter
\pgfmath@xa=\pgfmath@tonumber\pgfmath@xc\pgfmath@xa%
\advance\pgfmath@x by\pgfmath@xa
\ifdim\pgfmath@x=\pgfmath@xb
\else
\pgfmath@xb=\pgfmath@x
\repeatpgfmathloop%
\ifdim\pgfmath@yc<0pt
\pgfmathreciprocal@{\pgfmath@tonumber\pgfmath@x}%
\pgfmath@x=\pgfmathresult pt\relax
\fi
\fi
\pgfmath@returnone\pgfmath@x%
\endgroup
}
\makeatother
或者,使用pgfplots
该函数绘制图表可以完美地完成工作。