防止 TikZ 中某些值的表达式求值

防止 TikZ 中某些值的表达式求值

我需要绘制一个呈现某种可移除奇点的函数,但我无法将图分成两个区间,因为我以编程方式设置域,并且奇点可能会超出域。我考虑过使用该ifthenelse函数,但它没用,因为无论如何都会评估两个分支中的表达式。看看下面的代码(这只是一个例子):

\documentclass{standalone}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture} [declare function={%
  y(\x)= \x!=0 ? sin(\x)/\x : 1;}]
\draw plot [domain=0:1] (\x,{y(\x)});
\end{tikzpicture}
\end{document}

我预期,当 x=0 时,表达式的第一个分支会被跳过,而只计算第二个分支,但事实并非如此,我得到了除以零的错误。作为一种解决方案,我想到声明一个中间函数来正确设置独立变量,如以下工作示例所示:

\documentclass{standalone}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture} [declare function={%
  t(\x)= \x!=0 ? \x : 1;
  y(\x)= \x!=0 ? sin(\x)/t(\x) : 1;}]
\draw plot [domain=0:1] (\x,{y(\x)});
\end{tikzpicture}
\end{document}

但我正在寻找一种更优雅、更紧凑的解决方案。

答案1

与 Kpym 相同回答但无需加载额外的库。

\documentclass{standalone}
\usepackage{tikz}

\makeatletter
\def\ifabsgreater #1#2{\ifpdfabsnum 
    \dimexpr#1pt>\dimexpr#2pt\relax
    \expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi }
\makeatother

\begin{document}
\begin{tikzpicture} [declare function={%
          sinc(\x)= \ifabsgreater{\x}{0.001}{sin(\x r)/\x}{1};}]
 \draw[help lines] (-3.5,-1.5) grid (3.5,1.5);
 \draw[red, very thick] plot [domain=-pi:pi, samples=100] (\x,{sinc(5*\x)});
\end{tikzpicture}
\end{document}

正弦基数

答案2

以下是使用mathtikzlibrary 的一种可能性:

\documentclass[border=7mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{math}
\tikzmath{
  function sinc(\x) {
    if  abs(\x) < .001 then {
      return 1;
    } else {
      return sin(\x r)/\x;
    };
  };
}

\begin{document}
\begin{tikzpicture}
  \draw[help lines] (-3.5,-1.5) grid (3.5,1.5);
  \draw[red, very thick] plot [domain=-pi:pi, samples=100] (\x,{sinc(5*\x)});
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容