有没有办法处理大于 \maxdimen 的数字?

有没有办法处理大于 \maxdimen 的数字?

我想用 tikz 绘制多项式近似值。不幸的是,当我使用 5 阶多项式近似值时,tikz 无法计算结果。这是一个例子:

\draw[domain=1:10] plot (\x, {\x^5*(-0.0011577) + \x^4*(0.037895) + \x^3*(-0.48193) + \x^2*(2.9977) + \x^1*(-9.4071) + \x^0*(13.951)});

结果是一个异常Dimensions too large。我知道这是因为 10^5 超过了\maxdimen。但这不是大小问题,因为经过计算,这个数字大约是 7。是否有可能以\maxdimen某种方式处理大于的数字,或者有什么解决方法?我真的很想在 tikz 中做到这一点,以避免使用像素图形(放大时看起来更漂亮)。

答案1

在此处输入图片描述

tikz这是仅使用(和库)获得的结果math。通过以不同的方式计算多项式,避免了大乘法的问题。请参阅dfiveP代码中的函数;这是评估多项式的​​算法方法。但即便如此,结果也不是很好,因为值(在计算过程中)对于 来说太小了tikz!下图显示了 的图形dfiveP

在此处输入图片描述

第一个图是bdfiveP计算同一个多项式,但变量 x=10*t 发生变化后得到的。现在,作为 t 中的多项式,系数将更大,从而产生更准确的结果。

由于函数正在减少,您可以进一步研究域......

代码

\documentclass[11pt, margin=5mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{math}

\begin{document}

\tikzmath{
  \a{0} = -0.0011577;
  \a{1} = 0.037895;
  \a{2} = -0.48193;
  \a{3} = 2.9977;
  \a{4} = -9.4071;
  \a{5} = 13.951;
  function dfiveP(\t) {
    real \s;
    \s = \a{0};
    int \i;
    for \i in {1, ..., 5}{
      \s = \s*\t +\a{\i};
    };
    return \s;
  };
  \b{0} = -115.77;
  \b{1} = 378.95;
  \b{2} = -481.93;
  \b{3} = 299.77;
  \b{4} = -94.071;
  \b{5} = 13.951;
  function bdfiveP(\t) {
    real \s;
    \s = \b{0};
    int \i;
    for \i in {1, ..., 5}{
      \s = \s*\t +\b{\i};
    };
    return \s;
  };
}

\begin{tikzpicture}[xscale=10]
  \draw[->] (-.1, 0) -- (1.1, 0) node[below right] {$x$};
  \draw[->] (0, -1) -- (0, 8) node[left] {$y$};
  \draw[blue!70!black, thick, domain=.1:1, samples=200] plot (\x, {bdfiveP(\x)});
\end{tikzpicture}
% \begin{tikzpicture}
%   \draw[gray!40, very thin] (-.5, -.5) grid (10.5, 7.5);
%   \draw[->] (-1, 0) -- (11, 0) node[above right] {$x$};
%   \draw[->] (0, -1) -- (0, 8) node[left] {$y$};
%   \draw[blue, thick, domain=1:10, samples=100] plot (\x, {dfiveP(\x)});
% \end{tikzpicture}
\end{document}

相关内容