TikZ 绘制函数错误。-如何使代码更好?

TikZ 绘制函数错误。-如何使代码更好?

我们得到了这个 TikZ 代码,据说这给出了与 geogebra 不同的结果(https://artofproblemsolving.com/community/c68h3228155_need_help_with_tikz):

\begin{tikzpicture}[scale=.5]
\draw[->] (-3,0)--(5,0) node[below]{$x$};
\draw[->] (0,-7)--(0,3) node[left]{$y$};
\draw[thick, domain=-1.5:2] plot(\x, {2.8*\x^4+4.77*\x^3-5.47*\x^2-7.61*\x});
\end{tikzpicture}

渐近线还给出了另一个结果作为 TikZ,请参阅上面链接中的帖子#2。

TikZ 有哪些地方可以改进?

答案1

问题在于-扩展 时的扩展/优先级\x。您可以使用@Skillmon 的解决方案或添加括号:

\documentclass[border=3.14,tikz]{standalone}

\begin{document}

\begin{tikzpicture}[scale=.5]
\draw[->] (-3,0)--(5,0) node[below]{$x$};
\draw[->] (0,-7)--(0,3) node[left]{$y$};
\draw[thick, red, domain=-1.5:2] plot(\x, {2.8*(\x)^4+4.77*(\x)^3-5.47*(\x)^2-7.61*(\x)});
\draw[thick, dotted, domain=-1.5:2] plot(\x, {2.8*\x*\x*\x*\x+4.77*\x*\x*\x-5.47*\x*\x-7.61*\x});
\end{tikzpicture}

\end{document}

在此处输入图片描述

如果你这样做,符号优先问题会更加明显:

\documentclass[border=3.14,tikz]{standalone}

\begin{document}

\begin{tikzpicture}[scale=.5]
\draw[->] (-3,0)--(5,0) node[below]{$x$};
\draw[->] (0,-7)--(0,3) node[left]{$y$};
\draw[thick, red, domain=-1.5:2] plot(\x, {\x^2});
\draw[thick, dotted, domain=-1.5:2] plot(\x, {(\x)^2});
\end{tikzpicture}

\end{document}

在此处输入图片描述

看起来,当\x^2展开并且值为负数(比如 -2)时,会得到-2^2,这被解释为-4

答案2

Z 在指数函数方面存在问题,使用\x*\x*\x*\x而不是\x^4等:

\documentclass[border=3.14,tikz]{standalone}

\begin{document}

\begin{tikzpicture}[scale=.5]
\draw[->] (-3,0)--(5,0) node[below]{$x$};
\draw[->] (0,-7)--(0,3) node[left]{$y$};
\draw[thick, domain=-1.5:2] plot(\x, {2.8*\x*\x*\x*\x+4.77*\x*\x*\x-5.47*\x*\x-7.61*\x});
\end{tikzpicture}

\end{document}

在此处输入图片描述

为了进一步改善这一点:减少domain(在 x=2 处求值的函数等于 45.86),增加samples,或者使用smooth


\documentclass[border=3.14,tikz]{standalone}

\begin{document}

\begin{tikzpicture}[scale=.5]
\draw[->] (-3,0)--(5,0) node[below]{$x$};
\draw[->] (0,-7)--(0,3) node[left]{$y$};
\draw[thin, red, domain=-1.5:1.5, samples=101, smooth] plot(\x, {2.8*\x*\x*\x*\x+4.77*\x*\x*\x-5.47*\x*\x-7.61*\x});
\end{tikzpicture}

\end{document}

如果您的函数仍然有数字问题(此函数不是这种情况,但可能会发生),您可能需要使用该pgfmath-xfp包。它会稍微减慢您的绘图速度,但使用它定义的函数可以提供更好的分辨率:

\documentclass[border=3.14,tikz]{standalone}

\usepackage{pgfmath-xfp}

\begin{document}

\begin{tikzpicture}[scale=.5]
\draw[->] (-3,0)--(5,0) node[below]{$x$};
\draw[->] (0,-7)--(0,3) node[left]{$y$};
\draw[red, domain=-1.5:1.5, samples=101, smooth] plot(\x, {2.8*\x*\x*\x*\x+4.77*\x*\x*\x-5.47*\x*\x-7.61*\x});
\pgfmxfpdeclarefunction{myfunction}{1}
  {2.8*(#1)^4+4.77*(#1)^3-5.47*(#1)^2-7.61*(#1)}
\draw[very thin, blue, domain=-1.5:1.5, samples=101,smooth] plot(\x, {myfunction(\x)});
\end{tikzpicture}

\end{document}

在此处输入图片描述

相关内容