绘制指数图是 TikZ 中已知的错误来源吗?

绘制指数图是 TikZ 中已知的错误来源吗?

我想在一个小域上绘制 $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 2.1、texlive 2010 输出上述代码

这是一个已知问题吗?如果是,它已在 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该函数绘制图表可以完美地完成工作。

答案2

我使用 TeX Live 2011 和 CVS 版本的pgf软件包。结果没问题。因此我认为该错误已得到修复。

tlcontribpgf在 TeX Live 中获取 CVS 版本。

对于 MiKTeX,你可以去源码查看最新的pgf

相关内容