我使用 tikzpicture 绘制了一张图表,尽管我提高了分辨率,但图表本身仍然存在间隙。
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[domain=-{sqrt(2)}:{sqrt(2)}]
\draw[very thin,color=gray] (-1.2,-1.2) grid (1.2,1.2);
\draw[<->] (-1.7,0) -- (1.7,0) node[right] {$x$};
\draw[<->] (0,-1.3) -- (0,1.3) node[above] {$y$};
\draw[color=red] plot [samples=100](\x,{abs(\x)*sqrt(2 - \x*\x)});
\draw[color=green] plot [samples=100] (\x,{-abs(\x)*sqrt(2 - \x*\x)});
\end{tikzpicture}
\end{document}
得出的结果为:
您可以看到,在右侧 x 轴的任意一侧,图表的绿色部分与红色部分不相交。我允许程序包计算域边界。如果这是问题所在,那么首先由于域的性质,我无法超越它们。
奇怪的是,当我将分辨率从 100 增加到 1000 时,差距变得更大。
答案1
如果使用曲线的参数表示(即[sqrt(2)*sin(x), sin(2*x)]
),则可以将其精确地绘制到极值。
在这里我使用了 PGFPlots,并在参数表示下方以灰色绘制了原始方程:
\documentclass{article}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
domain=-pi/2:pi/2, % The range over which to evaluate the functions
xtick={-1,...,1}, ytick={-1,...,1}, % Tick marks only on integers between -1 and 1
axis lines=middle, % Axis lines go through (0,0)
enlargelimits=true, % Make the axis lines a bit longer than required for the plots
samples=101, % Number of samples for evaluating the functions (use an odd number to capture the (0,0) point
xlabel=$x$, ylabel=$y$, % Axis labels
clip=false % So the labels aren't cut off
]
\addplot [thick, red]
( {sqrt(2) * sin(deg(x))},
{abs(sin(deg(x*2)))} )
node [pos=0.8, anchor=south] {$f(x) = |x|\sqrt{2-x^2}$}; % Add a text node at 80% of the plot length
\addplot [thick, blue]
( {sqrt(2) * sin(deg(x))},
{-abs(sin(deg(x*2)))} )
node [pos=0.8, anchor=north] {$f(x) = -|x|\sqrt{2-x^2}$};
\end{axis}
\end{tikzpicture}
\end{document}
关于根本问题:使用 PGFPlots 无法解决问题(但我仍然建议使用 PGFPlots 来绘制此类图)。此外,虽然对此类函数使用参数方程通常会产生更好的结果,因为沿图的采样更均匀,但这也不是根本原因。问题是由于在决定从何处采样域时出现数值错误而发生的,这导致最后一个采样点(sqrt(2)
跳过最后一个采样点()。从本质上讲,这是在为什么 TikZ 的 \foreach 不迭代列表的最后一个元素?。在这种情况下,一个好的解决方案是修补生成采样表达式的函数,以明确包含域的上边缘。通过在序言中(在之后\usepackage{tikz}
)添加以下内容,您的原始代码将无间隙地运行:
\makeatletter
\def\tikz@plot@samples@recalc#1:#2\relax{%
\pgfmathsetmacro\tikz@temp@start{#1}%
\pgfmathsetmacro\tikz@temp@end{#2}%
\pgfmathsetmacro\tikz@temp@step{(\tikz@temp@end-\tikz@temp@start)/(\tikz@plot@samples-1)}%
\pgfmathsetmacro\tikz@temp@second{\tikz@temp@start+\tikz@temp@step}%
\pgfmathsetmacro\tikz@temp@penultimate{\tikz@temp@end-\tikz@temp@step}
\ifdim\tikz@temp@penultimate pt<\tikz@temp@second pt
\edef\tikz@plot@samplesat{\tikz@temp@start,\tikz@temp@second,...,\tikz@temp@end}%
\else%
\edef\tikz@plot@samplesat{\tikz@temp@start,\tikz@temp@second,...,\tikz@temp@penultimate,\tikz@temp@end}%
\fi%
}
\makeatother