何时使用 `pgfplots` 在 `tikzpicture` 环境中评估自定义数学函数

何时使用 `pgfplots` 在 `tikzpicture` 环境中评估自定义数学函数

我想使用绘制自定义函数pgfplots,并添加注释节点:

\begin{tikzpicture}[
    >=stealth,
    evaluate={
        function f(\x) {
            return cos(2*\x);
        };
    }
    ]
    \begin{axis}[
        axis lines=middle,
        xtick=\empty,
        ytick=\empty,
        xmin=-200,
        xmax=200,
        ymin=-1.5,
        ymax=1.5
        ]
        \addplot[
            domain=-180:180,
            samples=361
            ]{f(x)};
        % \node[coordinate,pin=above right:{$\cos 2x$}] at (axis cs:45,{f(45)}) {};
        \node[coordinate,pin=above right:{$\cos 2x$}] at (axis cs:45,0) {};
    \end{axis}
\end{tikzpicture}

结果是:

样本

我的问题是关于上面注释的行,它无法正确编译。在我看来,原因可能与函数求值过程有关(例如f上面的函数)。我不太了解它的机制,所以有什么办法可以解决这个问题吗?如果能多加解释就更好了!

顺便说一句:除了evaluate,我还尝试了declare function,它在这种情况下工作得很好;但实际的自定义函数涉及一个复杂的表达式(以递归方式定义), 可能无法处理declare function

答案1

你评论的代码只要你加载math库就可以工作。

\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{math}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\begin{document}
\begin{tikzpicture}[
    >=stealth,
    evaluate={
        function f(\x) {
            return cos(2*\x);
        };
    }
    ]
    \begin{axis}[
        axis lines=middle,
        xtick=\empty,
        ytick=\empty,
        xmin=-200,
        xmax=200,
        ymin=-1.5,
        ymax=1.5
        ]
        \addplot[
            domain=-180:180,
            samples=361
            ]{f(x)};
        \node[coordinate,pin=above right:{$\cos 2x$}] at (axis cs:45,{f(45)}) {};
        %\node[coordinate,pin=above right:{$\cos 2x$}] at (axis cs:45,0) {};
    \end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

但请注意,与在图中充分利用的库math结合可能并非易事。也就是说,如果您想使用处理整数的递归函数,您可能需要在本地关闭。fpupgfplotsfpu

至于评论中的问题:包含此代码并使用的文档存在问题xelatexlualatex运行问题beamermetropolis。讨论了一个可能相关的问题这里。除其他事项外,metropolis将的版本设置pgfplots为值1.9。这是该星座的临时解决方法。您需要为该函数选择一个不同的变量(当然,这只是一个占位符,但这绝对不是必要的)。也就是说,使用

evaluate={
    function f(\t) {
        return cos(2*\t);
    };
}

其中\x被 替换\t。完整代码:

\documentclass{beamer}
\usetheme{metropolis} 
\usepackage{pgfplots}
\usetikzlibrary{math}
\begin{document}
\pgfplotsset{compat=1.17}

\begin{frame}[t,fragile]
\frametitle{}
\begin{tikzpicture}[
    >=stealth,
    evaluate={
        function f(\t) {
            return cos(2*\t);
        };
    }
    ]
    \begin{axis}[
        axis lines=middle,
        xtick=\empty,
        ytick=\empty,
        xmin=-200,
        xmax=200,
        ymin=-1.5,
        ymax=1.5
        ]
        \addplot[%variable=\t,
            domain=-180:180,
            samples=361
            ]{f(x)};
        \node[coordinate,pin=above right:{$\cos 2x$}] at (axis cs:45,{f(45)}) {};
        %\node[coordinate,pin=above right:{$\cos 2x$}] at (axis cs:45,0) {};
    \end{axis}
\end{tikzpicture}
\end{frame}

\end{document}

在此处输入图片描述

相关内容