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)-9e^x된다는 것입니다 e^{-9}.

그만큼현재 구현exp(x)다음 과 같은 1/65536 ~= 0.00002경우 간단히 반환됩니다 .x < -9저지르다29a3525e6f5f2008년 pgf2.10부터), 이는 -9.

대신 작은 점프 포인트를 사용하면 -9오류가 더 자주 발생하므로 dimension too large깔끔한 해결책은 아닙니다. 예를 들어, OP의 기능을 플로팅하면 근처에서 -10상승합니다 .dimension too largex = 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}

다른 선택

v3.1.5b를 참조하세요 pgfmanual.

  • 비서. 22.4외부 파일에서 읽은 플로팅 포인트그리고
  • 비서. 22.6Gnuplot을 사용하여 함수 그리기.

답변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엄청난 양의 구성 옵션이 있음)

결과는 다음과 같습니다.

여기에 이미지 설명을 입력하세요

관련 정보