在 tikz 中声明 sinc

在 tikz 中声明 sinc

我正在尝试声明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}

两种方法都会产生相同的结果。首先,我想使用\pgfmathdeclarefunctionvariante 来全局声明这个函数,甚至可能针对多张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 的评论改进了我的答案。

相关内容