Pgfplots 和舍入误差

Pgfplots 和舍入误差

我有一张图表,它必须显示数值方案的能量振荡。问题是能量是这样的:

-9.99999994950000e-01

8 位数字后出现振荡。目前,图表是一条直线,因此我看不到振荡。

pgfplots 可以使用多少位数字?有什么方法可以查看这些振荡吗?

答案1

这里的问题是你想要显示数据范围比如说, -9.99999994950000e-01 到 -9.99999995000000e-01 。pgfplots抱歉,此处提供有意义结果所需的相对精度超出了 的能力。

但是,如果你手头有数学工具,你可以协助它。“数学工具”可以是 LuaLaTeX...假设你LuaLaTeX,那么以下可能是一个解决方案:

\documentclass{standalone}

\usepackage{pgfplots}

\begin{document}

\begin{tikzpicture}
\def\SHIFT{-0.99999999}
\def\EXPONENT{9}%
    \begin{axis}[
        y coord trafo/.code={%
            \edef\pgfmathresult{\directlua{tex.print( (#1 - (\SHIFT))*10^(\EXPONENT) )}}%
            \message{#1 -> \pgfmathresult^^J}%
        },
        y coord inv trafo/.code={%
            \edef\pgfmathresult{\directlua{tex.print( #1*10^(-\EXPONENT) + (\SHIFT) )}}%
            \message{inv: #1 -> \pgfmathresult^^J}%
        },
        yticklabel style={
            /pgf/number format/precision=11,
            /pgf/number format/fixed zerofill,
        },
    ]
    \addplot table {
    0 -9.99999994950000e-01
    1 -9.99999995000000e-01
    2 -9.99999995010000e-01
    };
    \end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

它利用 Lua 的数学功能将输入数据转换为pgfplots可以应用其算法的范围。之后,它再次使用 Lua 将中间结果转换回来。数字打印机是无损的(因为它只对符号进行操作)。

请注意,这种由移位和指数组成的仿射变换与 pgfplots 内部执行的操作非常相似。它只是无法应对如此高的相对精度。

如果您没有 LuaLaTeX,您仍然可以尝试准备数据。显然,能量是通过某种数字算法计算的。如果您手动应用这种转换,则可以显示它。您需要获得有意义的刻度标签,这不如我的第一种方法优雅,但仍然可行(例如通过手动提供它们)。

相关内容