我正在尝试声明sinc
-function 以供使用tikz
。我尝试了两种不同的方法:
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{math}
\begin{document}
\begin{tikzpicture}
\tikzmath{
function sincm(\x) {
if abs(\x) < 0.001 then {
return 1.0;
} else {
return sin(\x r)/\x;
};
};
}
\pgfmathdeclarefunction{sinc}{1}{%
\pgfmathparse{%
abs(#1)<0.001 ? 1 : sin(#1 r)/#1%
}%
}
\draw (-1,0) -- (1,0);
\draw[domain=0:0.5, samples=1000] plot (\x, {sincm(\x*20)});
\draw[domain=0:0.5, samples=1000, red, dotted] plot (\x,{sinc(\x*20)});
\end{tikzpicture}
\end{document}
两种方法都会产生相同的结果。首先,我想使用\pgfmathdeclarefunction
variante 来全局声明这个函数,甚至可能针对多张tikz
图片。但是,如果我将绘图域的起始设置为零:
\draw[domain=0:0.5, samples=1000, red, dotted] plot (\x,{sinc(\x*20)});
我得到了错误Package PGF Math Error: You've asked me to divide '0,0' by '0.0'
。不知何故,在这种情况下,ifthenelse
我声明的 -structuresinc
似乎不起作用?
答案1
不幸的是,当遇到 if-then 语法时,PGF 会评估两个分支,然后选择,因此无论 #1 的值是什么,它都会进行除法。相反,您可以使用它来分支
\begin{tikzpicture}
\pgfmathdeclarefunction{sinc}{1}{%
\pgfmathparse{abs(#1)<0.01 ? int(1) : int(0)}%
\ifnum\pgfmathresult>0 \pgfmathparse{1}\else\pgfmathparse{sin(#1 r)/#1}\fi%
}
\draw (-1,0) -- (1,0);
\draw[domain=0:0.5, samples=250] plot (\x,{sinc(20*\x)});
\end{tikzpicture}
答案2
当我需要用 绘制 sinc 函数时,我遇到了这个问题pgfplots
。我花了一段时间才弄清楚,原始问题的可接受答案在这种情况下不起作用,因为pgfplots
(例如,参见绘制用 \pgfmathdeclarefunction 定义的函数)。
因此,如果有人需要它,这里有一个适用于 TikZ\draw plot
和的解决方案\addplot
:
\begin{tikzpicture}
\pgfmathdeclarefunction{sinc}{1}{%
\pgfmathparse{(#1==0 ? 1: sin(#1 r))/(#1==0 ? 1: #1)}%
}
\begin{axis}
\addplot+[no markers] {sinc(x)};
\end{axis}
\end{tikzpicture}
编辑:我根据@user202729 的评论改进了我的答案。