我可以改进这个三次方图吗?

我可以改进这个三次方图吗?

使用 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

按照以下方式更改域名另一个答案是这种情况下正确的做法。不过,我也遇到过类似的情况,以下做法通常对我有效:

  1. 调整samples=设置。在此特定情况下samples=301有效。

  2. 在问题区域上单独绘制一个图来填补缺失的部分。在这个特殊情况下,包括以下两行似乎有效

    \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以获得适当的“平滑度”。

但您也可以使用非线性间距来绘制该函数,默认数字为samples25,以获得几乎相同的结果,尤其是当您使用该函数的因式分解版本时,该版本已由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}

该图显示了上述代码的结果

相关内容