我需要绘制一个呈现某种可移除奇点的函数,但我无法将图分成两个区间,因为我以编程方式设置域,并且奇点可能会超出域。我考虑过使用该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
以下是使用math
tikzlibrary 的一种可能性:
\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}