使用 TikZ 绘制带有渐近线的图形的最简单方法是什么?

使用 TikZ 绘制带有渐近线的图形的最简单方法是什么?

我有一张带有一些额外图形的图表: 函数图

\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[
    declare function={ f(\x) = 4/(1+pow(\x/5, 2)); }]
% partitions
\foreach \x in {1, ..., 8} {
    \filldraw [fill=gray!20!white, draw=gray] (\x, 0) -- (\x, {f(\x)}) -- (\x + 1, {f(\x)}) -- (\x + 1, 0) -- cycle;
    \filldraw [fill=gray!40!white, draw=gray] (\x, 0) -- (\x, {f(\x + 1)}) -- (\x + 1, {f(\x + 1)}) -- (\x + 1, 0) -- cycle;
}
\draw [help lines] (9, 0) -- (9, {f(9)});
% axes
\draw [->] (-0.3, 0) -- (10, 0) node[right] {$n$};
\draw [->] (0, -0.3) -- (0, 4.5) node[above] {$y$};
\foreach \x in {1, ..., 9} {
    \draw [font=\footnotesize] (\x, 0) -- (\x, -0.1) node[below] {\x};
}
% curve
\draw [thick, domain=0:10] plot(\x, {f(\x)});
\end{tikzpicture}
\end{document}

但是,我想用 替换该函数f(\x) = 4/(1+pow(\x/5, 2))f(\x) = 4*(1+pow(tan(180*\x), 2)/10)/(1+pow(\x/5, 2))除了在每个半整数(0.5、1.5、2.5 等)处有一条指向正无穷大的垂直渐近线外,其余都相同。问题是 TikZ 似乎不擅长处理这个问题。(它会因“维度太大”错误而崩溃。)我想

  1. 使视图框架保持与当前显示相同,
  2. 裁剪当前视图框架中未显示的图形部分,以及
  3. 使渐近线附近的图线均在同一垂直高度处切断。

我尝试用以下代码切断渐近线附近的绘图:

\foreach \x in {1, ..., 10} {
    \draw [thick, domain=\x-0.4:\x+0.4] plot(\x, {f(\x)});
}

但这不符合我上面列出的所有三个条件。

我也尝试过使用pgfplots,但很难重现我在这里遇到的问题。由于其他一切都是纯的TikZ,我想用纯的来解决这个剩余的问题TikZ。(除非绝对必要,否则我不想学习一个全新的软件包。)

那么,绘制满足我的三个条件的渐近线图形的最佳方法是什么?

答案1

您可以使用已经尝试过的方法,稍微靠近渐近线,即\x-0.46:\x+0.46,然后用它\clip来切断曲线过高的部分。

在此处输入图片描述

\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[
   declare function={ f(\x) = 4*(1+pow(tan(180*\x), 2)/10)/(1+pow(\x/5, 2)); }]
% partitions
\foreach \x in {1, ..., 8} {
    \filldraw [fill=gray!20!white, draw=gray] (\x, 0) -- (\x, {f(\x)}) -- (\x + 1, {f(\x)}) -- (\x + 1, 0) -- cycle;
    \filldraw [fill=gray!40!white, draw=gray] (\x, 0) -- (\x, {f(\x + 1)}) -- (\x + 1, {f(\x + 1)}) -- (\x + 1, 0) -- cycle;
}
\draw [help lines] (9, 0) -- (9, {f(9)});
% axes
\draw [->] (-0.3, 0) -- (10, 0) node[right] {$n$};
\draw [->] (0, -0.3) -- (0, 4.5) node[above] {$y$};
\foreach \x in {1, ..., 9} {
    \draw [font=\footnotesize] (\x, 0) -- (\x, -0.1) node[below] {\x};
}
% curves
\begin{scope}
\clip (0,0) rectangle (10,4.5);
\foreach \x in {1, ..., 10} {
    \draw [thick, domain=\x-0.46:\x+0.46] plot(\x, {f(\x)});
}
\end{scope}
\end{tikzpicture}
\end{document}

相关内容