在绘制普朗克定律时,Tikz 认为我除以了 0

在绘制普朗克定律时,Tikz 认为我除以了 0

我正在尝试使用 绘制普朗克定律tikz。这在大多数情况下都很好用,但如果我尝试绘制定律的某些区域,它tikz会认为我正在除以。以下是我正在尝试执行的操作的一个最低限度的工作示例:0

\documentclass[8pt,xcolor=dvipsnames,compress]{beamer}
\usepackage{tikz}
\begin{document}
\begin{frame}
  \begin{tikzpicture}
    \draw[->] (0,0) -- (4.2,0) node[right] {$\lambda$};
    \draw[->] (0,0) -- (0,4.2) node[above] {Flux};
    \draw[scale=3,domain=0.16:1,smooth,variable=\x,blue] plot ({\x},{((1/(exp(1/\x)-1)*(1/(\x^5)))/20});
    \end{tikzpicture}
  \end{frame}
\end{document}

现在一切正常,但请注意我的域从 开始0.16。我希望它能早点开始,至少在 左右0.1,但如果我从 开始我的域,0.1我会得到一个除法0错误:

! Package PGF Math Error: You've asked me to divide `1' by `0.0', but I cannot divide any number by `0.0' (in '{((1/(exp(1/0.1)-1)*(1/(0.1^5)))/20}').

有什么想法可以解释这是什么原因造成的吗?

答案1

您需要确保fpu使用该库以便对浮点数进行算术运算。最简单的方法是使用pgfplots(建立在 之上tikz),默认情况下它将执行此操作。

pgfplots轴的默认样式是,boxed因此需要进行一些调整才能生成您想要的绘图样式。但该函数的实际绘图命令很简单。

示例输出

\documentclass[8pt,xcolor=dvipsnames,compress]{beamer}
\usepackage{pgfplots}
\pgfplotsset{compat=1.12}

\begin{document}

\begin{frame}
  \begin{tikzpicture}
    \begin{axis}[xlabel={\( \lambda \)},ylabel={Flux},
      axis x line=bottom,axis y line=left,
      every axis x label/.append style={at={(1,0)},right},
      every axis y label/.append style={at={(0,1)},above,rotate=-90}]
      \addplot[blue,domain=0.01:1,samples=200]
      {1/((exp(1/x)-1)*x^5*20)};
    \end{axis}
    \end{tikzpicture}
  \end{frame}

\end{document}

答案2

分母为 x 5,最小值为 0.1。TeX 通过单位 pt 中的 dimen 寄存器进行算术运算的精度仅为 2 -16(= 1 sp)。因此,0.1 5变为 0.00001,而 0.00001 pt 小于 1 sp,结果被截断为零。

TikZ 支持更好的算法,例如通过库fpu,参见其他回答Andrew Swann 的。此示例显示了库的使用fixedpointarithmetic,该库依赖于包fp。计算需要更多时间,但结果更精确,并且在算术溢出之前下限可以降低到 0.025。我还增加了样本数量以获得更好的曲线形状。

\documentclass[8pt,xcolor=dvipsnames,compress]{beamer}
\usepackage{tikz}
\usepackage{fp}
\usetikzlibrary{fixedpointarithmetic}
\begin{document}
\begin{frame}
  \begin{tikzpicture}
    \draw[->] (0,0) -- (4.2,0) node[right] {$\lambda$};
    \draw[->] (0,0) -- (0,4.2) node[above] {Flux};
    \draw[
      samples=100,
      fixed point arithmetic,
      scale=3,domain=0.025:1,smooth,variable=\x,blue] plot
    ({\x},{((1/(exp(1/\x)-1)*(1/(\x^5)))/20});
    \end{tikzpicture}
  \end{frame}
\end{document}

结果

相关内容