我正在使用以下代码绘制函数:
\documentclass[]{article}
\usepackage{tikz, pgfplots}
\begin{document}
\newcommand{\F}{(x-5)*(x-4)*(x-2)*(x+1)*(x+2)*(x+4)}
\newcommand{\G}{(x-3)*(x-3)*(x-1)*(x+3)}
\begin{tikzpicture}
\begin{axis}[
axis lines*=middle,
enlarge y limits=true,
enlarge x limits=false,
restrict x to domain=-5:5,
restrict y to domain=-60:60]
\addplot [thick, samples=50, smooth] {(\F)/(\G)};
\end{axis}
\end{tikzpicture}
\end{document}
我特别想强调这个函数的垂直渐近线,就像下面的例子一样。(最好,我想添加没有刻度的轴。)我该怎么做?我已经花了几个小时研究这些域,但没有得到令人满意的结果。
答案1
如果以下示例适合您,请尝试一下:
\documentclass[border=3mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.12}
\begin{document}
\newcommand{\F}{(x-5)*(x-4)*(x-2)*(x+1)*(x+2)*(x+4)}
\newcommand{\G}{(x-3)*(x-3)*(x-1)*(x+3)}
\begin{tikzpicture}
\begin{axis}[
axis lines = middle,
enlarge y limits = false,
enlarge x limits = true,
restrict x to domain = -5:5,
restrict y to domain = -60:60,
xtick = \empty,
ytick = \empty
]
\addplot [very thick, draw=blue, samples=400, smooth] {(\F)/(\G)};
\draw[dashed] ( 1,-60) -- ( 1,+60);
\draw[dashed] ( 3,-60) -- ( 3,+60);
\draw[dashed] (-3,-60) -- (-3,+60);
\end{axis}
\end{tikzpicture}
\end{document}
通过它我得到了以下图表:
编辑:我在上面的图表中添加了缺失的渐近线。此外,渐近线坐标的书面记录也从 1.11 版开始采用到“pgfplots”版本,即从
\draw[dashed] (axis cs: 1,-50) -- (axis cs: 1,+50);
到
\draw[dashed] ( 1,-50) -- ( 1,+50);
正如汤姆·邦巴迪尔在他的评论中所建议的那样。
编辑(2):考虑到 Jens Polz 在他的回答中的建议,这个图片变得更有吸引力了。
答案2
您的样本数量太少。选择
\addplot [thick, samples=500, smooth] {(\F)/(\G)};
这应该已经有帮助了。
答案3
这是一个元帖子解决问题的方法。
prologues := 3;
outputtemplate := "%j%c.eps";
beginfig(1);
vardef fg(expr x) =
(x-5)/(x-3)*(x-4)/(x-3)*(x-2)/(x-1)*(x+1)/(x+3)*(x+2)*(x+4)
enddef;
u = 1.618cm;
v = 1mm;
path seg[]; s = 1/16;
a := -5; b := -3-s; seg1 = (a,fg(a)) for x=a+s step s until b: -- (x,fg(x)) endfor;
a := -3+s; b := +1-s; seg2 = (a,fg(a)) for x=a+s step s until b: -- (x,fg(x)) endfor;
a := +1+s; b := +3-s; seg3 = (a,fg(a)) for x=a+s step s until b: -- (x,fg(x)) endfor;
a := +3+s; b := +5; seg4 = (a,fg(a)) for x=a+s step s until b: -- (x,fg(x)) endfor;
path xx, yy;
xx = (left--right) scaled 5u;
yy = (down--up) scaled 60v;
drawoptions(withcolor .5 white);
draw xx; draw yy;
drawoptions(withcolor .67 red);
for i=1 upto 4:
draw seg[i] xscaled u yscaled v ;
endfor
drawoptions(withcolor .7 white);
for $=-3,1,3:
draw yy shifted ($*u,0) dashed evenly;
endfor
clip currentpicture to unitsquare shifted -(1/2,1/2)
xscaled arclength xx yscaled arclength yy;
endfig;
end.
笔记
在函数中交错分子和分母的项有助于避免普通的 Metapost 溢出;如果您使用“mpost -numbersystem=double”来处理输入,则没有必要这样做。
u
为水平单位,v
为垂直单位。由于函数中存在不连续性,我分别绘制了输出函数的四个部分。
s = 1/16
在这种情况下,步长给出的增量足够小,可以获得平滑的曲线。使用负 2 的幂有助于避免 MP 特殊算法中的舍入误差。渐近线是通过重新使用 y 轴路径并沿适当量移动来绘制的。
最后的语句
clip currentpicture ...
将曲线剪裁成所需的大小。我使用轴的大小作为所需大小。