如何在 pgfplots 中绘制具有恒定部分的周期多部分函数?

如何在 pgfplots 中绘制具有恒定部分的周期多部分函数?

我需要绘制一个包含两个不同部分的周期函数。第一部分是实际函数,第二部分是最后一个值的平线。在尝试使用 pgfplots 实现此功能时,我看到了一种奇怪的行为:如果我在平线部分使用 function(CONST) 定义函数,结果不是常数。我认为 pgfplots 正在用 x 替换 CONST,然后仅绘制正常函数。

这是我的最小工作示例:

\documentclass{standalone}

\usepackage{pgfplots}
\pgfplotsset{trig format plots=rad, compat=1.14}

\begin{document}

\begin{tikzpicture}[%
    declare function={%
        funco(\x)= (x+sin(x));
        output(\x)= %
            and(\x >= 0*pi, \x < 1*pi) * (funco(x)) +
            and(\x >= 1*pi, \x < 2*pi) * (funco(1*pi)) +
            and(\x >= 2*pi, \x < 3*pi) * (funco(x)) +
            and(\x >= 3*pi, \x < 4*pi) * (funco(3*pi)) +
            and(\x >= 4*pi, \x < 5*pi) * (funco(x))
            ;
    }
]
\begin{axis}[]
    \addplot[domain=0:5*pi, samples=260]{output(x)};
\end{axis}
\end{tikzpicture}

\end{document}

结果如下: 在此处输入图片描述

这是我期望的结果: 在此处输入图片描述

我的问题是:

  • 为什么结果不如预期?
  • 我需要改变什么才能获得预期的结果?
  • 有没有更简单的方法来声明这样的函数?

谢谢你!

答案1

x你只是在 Ti 中定义函数时忘记在 es 前面加上反斜杠Z(!)。

\documentclass{standalone}

\usepackage{pgfplots}
\pgfplotsset{trig format plots=rad, compat=1.14}

\begin{document}

\begin{tikzpicture}[%
    declare function={%
        funco(\x)= (\x+sin(\x));
        output(\x)= %
            and(\x >= 0*pi, \x < 1*pi)* (funco(\x))) +
            and(\x >= 1*pi, \x < 2*pi) * (funco(1*pi)) +
            and(\x >= 2*pi, \x < 3*pi) * (funco(\x)) +
            and(\x >= 3*pi, \x < 4*pi) * (funco(3*pi)) +
            and(\x >= 4*pi, \x < 5*pi) * (funco(\x))
            ;
    }
]
\begin{axis}[]
    \addplot[domain=0:5*pi, samples=260]{output(x)};
\end{axis}
\end{tikzpicture}

\end{document}

在此处输入图片描述

至于是否有更优雅的方式来定义此类函数的问题。答案是肯定的,有,但坏消息是,截至目前,像 这样的函数iseven还不能与 配合使用fpu,因此不能在 中使用pgfplots。好消息是添加此功能很容易。

\documentclass{standalone}

\usepackage{pgfplots}
\pgfplotsset{trig format plots=rad, compat=1.14}
\makeatletter
\pgfmathdeclarefunction{isevenFPU}{1}{%
\pgfkeys{/pgf/fpu,/pgf/fpu/output format=fixed}%
  \begingroup
    \pgfmathsetcount\c@pgfmath@counta{abs(int(#1))}%
    \ifodd\c@pgfmath@counta
      \def\pgfmathresult{0}%
    \else
      \def\pgfmathresult{1}%
    \fi
    \pgfmath@smuggleone\pgfmathresult
  \endgroup}
\makeatother
\begin{document}

\begin{tikzpicture}[%
    declare function={%
        funco(\x)= (\x+sin(\x));
        soutput(\x)= %
            ifthenelse(isevenFPU(int(\x/pi)),funco(\x),funco(int(\x/pi)*pi));
    }
]
\begin{axis}[]
    \addplot[domain=0:5*pi, samples=260]{soutput(x)};
\end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

对于附加请求1:

\documentclass{standalone}

\usepackage{pgfplots}
\pgfplotsset{trig format plots=rad, compat=1.14}
\begin{document}

\begin{tikzpicture}[%
    declare function={%
        funco(\x)= (\x+sin(\x));
        soutput(\x)= %
            ifthenelse(\x-4*int(\x/4)<=2.5,funco(\x),funco(4*int(\x/4)+2.5));
    }
]
\begin{axis}[]
    \addplot[domain=0:24, samples=260]{soutput(x)};
\end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容