我想使用 绘制 tikz 中的连续分段线性函数declare function
。我可以手动构建函数,但我想定义一个新命令来简化此操作。新命令的参数应为函数在 x=0、1 和 2 处的 y 值。
这是我的尝试,后面是输出:
\documentclass{article}
\usepackage{pgfplots,tikz}
\newcommand{\build}[3]{declare function={f(\x)=(\x<=1)*((#2-#1)*\x+#1)+and(\x>1,\x<=2)*((#3-#2)*(\x-1)+#2);}}
\pgfplotsset{compat=1.17}
\begin{document}
\begin{tikzpicture}[declare function={f(\x)=(\x<=1)*(2*\x)+ and(\x>1,\x<=2)*(-2*\x+4);}]
\begin{axis}[samples at={0,1,2}, ymin=0, ymax=2, ytick={1,2}, xmin=0, xmax=2, xtick={1,2}]
\addplot{f(x)};
\end{axis}
\end{tikzpicture}
\begin{tikzpicture}[\build{0}{2}{0}]
\begin{axis}[samples at={0,1,2}, ymin=0, ymax=2, ytick={1,2}, xmin=0, xmax=2, xtick={1,2}]
\addplot{f(x)};
\end{axis}
\end{tikzpicture}
\end{document}
第一个分段函数是手工构建的,第二个是我尝试使用新命令绘制相同的函数build
。我对的微妙之处理解newcommand
不够,几次搜索并没有让我发现明显的错误。我该如何修复我的新命令build
以实现我想要的效果?
答案1
你只需要将你的宏转换成一种样式。或者定义一个有多个参数的函数。
\documentclass{article}
\usepackage{pgfplots,tikz}
\tikzset{build/.style n args={3}{declare
function={f(\x)=(\x<=1)*((#2-#1)*\x+#1)+and(\x>1,\x<=2)*((#3-#2)*(\x-1)+#2);}}}
\tikzset{declare function={mypiecewise(\x,\a,\b,\c)=(\x<=1)*((\b-\a)*\x+\a)+and(\x>1,\x<=2)*((\c-\b)*(\x-1)+\b);}}
\pgfplotsset{compat=1.17}
\begin{document}
\begin{tikzpicture}[declare function={f(\x)=(\x<=1)*(2*\x)+ and(\x>1,\x<=2)*(-2*\x+4);}]
\begin{axis}[samples at={0,1,2}, ymin=0, ymax=2, ytick={1,2}, xmin=0, xmax=2, xtick={1,2}]
\addplot{f(x)};
\end{axis}
\end{tikzpicture}
\begin{tikzpicture}[build={0}{2}{0}]
\begin{axis}[samples at={0,1,2}, ymin=0, ymax=2, ytick={1,2}, xmin=0, xmax=2, xtick={1,2}]
\addplot{f(x)};
\end{axis}
\end{tikzpicture}
\begin{tikzpicture}
\begin{axis}[samples at={0,1,2}, ymin=0, ymax=2, ytick={1,2}, xmin=0, xmax=2, xtick={1,2}]
\addplot{mypiecewise(x,0,2,0)};
\end{axis}
\end{tikzpicture}
\end{document}