使用 TiKZ,我想绘制具有双点的三次曲线。我尝试使用此程序执行此操作,并在结果的左侧边缘得到此间隙。
\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{tick style={draw=none}}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
xmin=-3,
xmax=3,
xticklabels={},
ymin=-3,
ymax=3,
yticklabels={},
axis lines=middle,
domain=-3:3,
samples=250,
smooth,
% use same unit vectors on the axis
axis equal image=true,
]
\addplot [thick] {sqrt(x^3-3*x+2) };
\addplot [thick] {-sqrt(x^3-3*x+2) };
\end{axis};
\end{tikzpicture}
\end{document}
x^3-3*x+2
我认为 TiKZ 在绘制非常接近切线垂直于 的位置的平方根时遇到了麻烦 x=-2
。我可以手动添加一条短垂直线来填补空白。但看起来不太好。有没有更直接的方法让 TiKZ 将该平方根一直绘制到 0?
答案1
按照以下方式更改域名另一个答案是这种情况下正确的做法。不过,我也遇到过类似的情况,以下做法通常对我有效:
调整
samples=
设置。在此特定情况下samples=301
有效。在问题区域上单独绘制一个图来填补缺失的部分。在这个特殊情况下,包括以下两行似乎有效
\addplot [thick, domain=-3:0] {sqrt(x^3-3*x+2) }; \addplot [thick, domain=-3:0] {-sqrt(x^3-3*x+2)};
答案2
为了好玩:它可以很好地运行pstricks
:
\documentclass[11pt,svgnames, border=3pt]{standalone}
\usepackage{pst-func}
\begin{document}
\begin{pspicture*}(-2.9,-2.9)(3,3)
\psaxes[ticksize=2pt, labelFontSize=\scriptstyle color{SteelBlue},%
showorigin=false, arrows=->,arrowinset=0.12, linecolor=SteelBlue]%
(0,0)(-2.95,-2.9)(3,3)[$x$, -120][$y$,-135]
\uput[dl](0,0){$ O $}
\psset{linewidth=1pt,linecolor=IndianRed,algebraic, plotpoints=500}
\psplot{-2}{3}{sqrt(x^3-3*x + 2)}
\psplot{-2}{3}{-sqrt(x^3-3*x + 2)}
\end{pspicture*}
\end{document}
答案3
您的“问题”在于您在绘图时没有显示轴刻度标签。如果您这样做了,您会注意到下限是-2
,因此给出较低的domain
值-3
并没有多大意义。因此,只需将其更改为-2
就足以解决您的问题。然后,您可以调整数字samples
以获得适当的“平滑度”。
但您也可以使用非线性间距来绘制该函数,默认数字为samples
25,以获得几乎相同的结果,尤其是当您使用该函数的因式分解版本时,该版本已由Ruixi Zhang 在问题下方的评论中。
如果您认为这还不够好,您可以使用“非线性因子”a
或数量samples
。
希望这和代码中的注释足以让您了解发生了什么。
% used PGFPlots v1.17
\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
\usepgfplotslibrary{colorbrewer}
\pgfplotsset{
% use this `compat` level or higher to make use of Lua computation engine
compat=1.12,
% (only used for proper displaying. The `cycle list` is from the `colorbrewer` library)
cycle list/Dark2,
cycle multiindex* list={
[1 of]mark list\nextlist
Dark2\nextlist
},
}
\begin{document}
\begin{tikzpicture}[
% declare functions
declare function={
% function to plot
% f(\x) = sqrt(\x^3 - 3*\x + 2);
% can be rewritten (as stated by Ruixi Zhang) as
f(\x) = (\x-1)*sqrt(\x+2);
% state lower and upper boundaries
lb = -2;
ub = 3;
% -----------------------------------------------------------------
%%% non-linear spacing:
%%% adapted from <https://tex.stackexchange.com/a/443731/95441>
% "non-linearity factor"
a = 1;
% function to use for the nonlinear spacing
Y(\x) = exp(a*\x);
% rescale to former limits
X(\x) = (Y(\x) - Y(lb))/(Y(ub) - Y(lb)) * (ub - lb) + lb;
},
]
% -------------------------------------------------------------------------
\begin{axis}[
xmin=-3,
xmax=3,
ymin=-3,
ymax=3,
axis lines=middle,
smooth,
axis equal image=true,
% adjusted to proper limits
% (as variables given above)
domain=lb:ub,
mark size=1pt,
]
% ("usual" attempt only corrected for the lower domain bound)
\addplot+ [samples=201,no markers,thick] { sqrt(\x^3 - 3*\x + 2)};
\addplot+ [samples=201,no markers,thick] {-sqrt(\x^3 - 3*\x + 2)};
% here plotting with 25 points with non-linear spacing
\addplot+ ({X(x)}, { f(X(x))});
% \addplot+ [no markers]({X(x)}, {-f(X(x))});
\end{axis};
\end{tikzpicture}
\end{document}