Заранее благодарны за Вашу помощь:)
У меня возникла проблема с 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
Это вызвано тем, как exp
реализована математическая функция pgf. Упрощенный пример:
\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}
.
Theтекущая реализацияexp(x)
просто возвращается 1/65536 ~= 0.00002
, когда x < -9
(введеносовершить29a3525e6f5f
в 2008 году с pgf
2.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 only
ключ, и будет сгенерирован тот же вывод, что и вответ далеифа. Я полагаю, что 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
имеет огромное количество вариантов конфигурации)
И вот результат: