我需要绘制一个包含两个不同部分的周期函数。第一部分是实际函数,第二部分是最后一个值的平线。在尝试使用 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}