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.
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^x
se torna e^{-9}
.
Oimplementação atual deexp(x)
simplesmente retorna 1/65536 ~= 0.00002
quando x < -9
(introduzido porcomprometer-se29a3525e6f5f
em 2008, de pgf
2,10), o que faz com que o valor do salto seja próximo de -9
.
Usar um ponto de salto menor em vez de -9
causará erros dimension too large
com 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 large
perto de x = 12.3
.
Usar algum utilitário de cálculo de ponto flutuante é melhor. A base de código mais recente tikz-pgf
introduziu 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 fpu
versão.
O exemplo a seguir faz uso de install only
chave e gerará a mesma saída que emresposta de Daleif. Acho que pgfplots
usa 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 pgfplots
onde 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}
( pgfplots
tem uma enorme quantidade de opções de configuração)
E o resultado é: