Tikz錯誤計算繪製指數函數

Tikz錯誤計算繪製指數函數

先感謝您的幫助:)

我在 tikz 計算/列印函數值時遇到問題。

該功能是f(x) = (ax³+bx²+cx)*e^(dx)a=-3.01718 b=11.8804 c=0.753323 d=-0.790569

tikz 圖看起來非常好x=0 to x=11.2

該圖的錯誤來自x > 11.4

您可以將 tikz 圖與 geogebra 中的圖表進行比較。

在此輸入影像描述

在此輸入影像描述

這是代碼:

\documentclass[a4paper,11pt]{scrartcl}
\usepackage[ngerman]{babel}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}%[scale=0.5]
\draw[thin,color=gray,xstep=1,ystep=1, solid] (0,-3) grid (13,7);
\draw[->,line width=0.8mm] (0,0) -- (13,0);
\draw[->,line width=0.8mm] (0,-3) -- (0,7);
\foreach \x/\xtext in {1/1, 2/2, 3/3, 4/4, 5/5, 6/6, 7/7, 8/8, 9/9, 10/10, 11/11, 12/12}
\draw[shift={(\x,0)}] (0pt,2pt) -- (0pt,-2pt) node[below] {$\xtext$};
\foreach \y/\ytext in {-2/-2, -1/-1, 0/0, 1/1, 2/2, 3/3, 4/4, 5/5, 6/6}
\draw[shift={(0,\y)}] (2pt,0pt) -- (-2pt,0pt) node[left] {$\ytext$};

\draw[line width=0.4mm, domain=0:12.8,smooth,variable=\x,black] plot ({\x},{((-3.017180* 
(\x)^3+11.88040*(\x)^2+0.753323*(\x))*e^(-0.790569*(\x))) });
\end{tikzpicture}

\end{document}

感謝您的幫忙!

答案1

這是由 pgf 數學函數的exp實作方式所引起的。一個簡化的例子:

\documentclass{article}
\usepackage{pgfmath, pgffor}

\begin{document}
\foreach \i in {8.9, 9.0, 9.1} {
  \pgfmathparse{exp(-\i)}exp(-\i) = \pgfmathresult\par
}
\end{document}

輸出是

exp(-8.9) = 0.00012
exp(-9.0) = 0.00012
exp(-9.1) = 0.00002  % <<< see the jump from 1.2e-4 to 2e-5

OP的例子和我的例子之間的關係是,當x ~= 11.384,-0.790569*(\x)接近時-9,那麼就e^x變成e^{-9}

目前的實施exp(x)當(1/65536 ~= 0.00002x < -9犯罪29a3525e6f5f2008 年,從pgf2.10 開始),這導致跳躍值接近-9

使用較小的跳躍點反而-9會更頻繁地觸發錯誤dimension too large,因此不是一個巧妙的解決方案。例如,對於-10,繪製 OP 的函數將在dimension too large附近升高x = 12.3

使用一些浮點計算實用程式會更好。最新的程式碼庫tikz-pgf引入了一個新金鑰/pgf/fpu/install only={<math function list>},可用於將特定數學函數的實作本地切換到其fpu版本。

以下範例使用install onlykey,並將產生與中相同的輸出戴爾夫的回答。我猜想pgfplots在繪圖時使用類似的技巧來執行浮點計算。

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{fpu}

\begin{document}

\begin{tikzpicture}[declare function={
    f(\x) = (-3.017180*(\x)^3+11.88040*(\x)^2+0.753323*(\x))*e^(-0.790569*(\x));
  }]
  \draw[thin,color=gray]
    (0,-3) grid (13,7);
  \draw[->,line width=0.8mm]
    (0,0) -- (13,0)
    (0,-3) -- (0,7);
  \foreach \x in {1, 2, ..., 12}
    \draw[shift={(\x,0)}] (0pt,2pt) -- (0pt,-2pt) node[below] {$\x$};
  \foreach \y in {-2, -1, ..., 6}
    \draw[shift={(0,\y)}] (2pt,0pt) -- (-2pt,0pt) node[left] {$\y$};
  
  % use "/pgf/fpu/install only={exp}"
  \draw[line width=0.4mm, domain=0:12.8, smooth, /pgf/fpu/install only={exp}]
    plot (\x, {f(\x)});
\end{tikzpicture}
\end{document}

其他選擇

請參閱pgfmanual,v3.1.5b,

  • 秒。 22.4繪製從外部文件讀取的點
  • 秒。 22.6使用 Gnuplot 繪製函數

答案2

不知道為什麼這個特定的圖看起來像這樣,但我永遠不會像這樣手動繪製函數。我會用pgfplots它看起來像這樣的地方

\documentclass[a4paper,11pt,border=10pt,]{standalone}
\usepackage{tikz,pgfplots}
\begin{document}
\begin{tikzpicture}%[scale=0.5]
\begin{axis}[
  width=13cm,
  ymin=-2.1,
  ymax=5.5,
  domain=0:12.8,
  no marks,
  axis x line=center,
  axis y line=center,
  ]

  \addplot[smooth] {((-3.017180*(\x)^3+11.88040*(\x)^2+0.753323*(\x))*e^(-0.790569*(\x)))};
  
\end{axis}

\end{tikzpicture}

\end{document}

pgfplots有大量的配置選項)

結果是:

在此輸入影像描述

相關內容