![在绘制普朗克定律时,Tikz 认为我除以了 0](https://linux22.com/image/312551/%E5%9C%A8%E7%BB%98%E5%88%B6%E6%99%AE%E6%9C%97%E5%85%8B%E5%AE%9A%E5%BE%8B%E6%97%B6%EF%BC%8CTikz%20%E8%AE%A4%E4%B8%BA%E6%88%91%E9%99%A4%E4%BB%A5%E4%BA%86%200.png)
我正在尝试使用 绘制普朗克定律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}