Cálculo errado de Tikz desenhar função exponencial

Cálculo errado de Tikz desenhar função exponencial

Obrigado pela sua ajuda antecipadamente :)

Tenho um problema com o tikz calculando/imprimindo os valores da minha função incorretamente.

A função é f(x) = (ax³+bx²+cx)*e^(dx)coma=-3.01718 b=11.8804 c=0.753323 d=-0.790569

O gráfico tikz parece muito bomx=0 to x=11.2

O gráfico fica errado dex > 11.4

Você pode comparar o gráfico tikz com o gráfico do geogebra.

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Este é o código:

\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}

Obrigado pela ajuda!

Responder1

Isso é causado pela forma como a função matemática pgf expé implementada. Um exemplo simplificado:

\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}

A saída é

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

A relação entre o exemplo do OP e o meu é que, quando x ~= 11.384, -0.790569*(\x)está próximo -9, então e^xse torna e^{-9}.

Oimplementação atual deexp(x)simplesmente retorna 1/65536 ~= 0.00002quando x < -9(introduzido porcomprometer-se29a3525e6f5fem 2008, de pgf2,10), o que faz com que o valor do salto seja próximo de -9.

Usar um ponto de salto menor em vez de -9causará erros dimension too largecom mais frequência e, portanto, não é uma solução interessante. Por exemplo, com -10, traçar a função do OP aumentará dimension too largeperto de x = 12.3.

Usar algum utilitário de cálculo de ponto flutuante é melhor. A base de código mais recente tikz-pgfintroduziu uma nova chave /pgf/fpu/install only={<math function list>}que pode ser usada para alternar localmente implementações de funções matemáticas específicas para sua fpuversão.

O exemplo a seguir faz uso de install onlychave e gerará a mesma saída que emresposta de Daleif. Acho que pgfplotsusa truques semelhantes para realizar cálculos de ponto flutuante durante a plotagem.

\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}

Outras opções

Consulte pgfmanual, v3.1.5b,

  • seg. 22.4Plotando pontos lidos de um arquivo externoe
  • seg. 22,6Plotando uma função usando Gnuplot.

Responder2

Não tenho ideia de por que esse gráfico em particular se parece com isso, mas eu nunca traçaria uma função manualmente como esta. Eu usaria pgfplotsonde fica assim

\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}

( pgfplotstem uma enorme quantidade de opções de configuração)

E o resultado é:

insira a descrição da imagem aqui

informação relacionada