![使用 shapes.symbols 库的 PGF fpu“格式不正确的浮点数”](https://linux22.com/image/381521/%E4%BD%BF%E7%94%A8%20shapes.symbols%20%E5%BA%93%E7%9A%84%20PGF%20fpu%E2%80%9C%E6%A0%BC%E5%BC%8F%E4%B8%8D%E6%AD%A3%E7%A1%AE%E7%9A%84%E6%B5%AE%E7%82%B9%E6%95%B0%E2%80%9D.png)
我试图画一个皮尔逊-莫斯科维茨Ti 中的波谱钾Z 并且必须加载 PGF 的fpu
库来进行一些计算。
很多错误!
令我惊讶的是,其中一个与我的波谱无关,而是与库tape
中的形状有关shapes.symbols
:
\documentclass[tikz]{standalone}
\usetikzlibrary{shapes.symbols}
\usetikzlibrary{fpu}
\begin{document}
\pgfkeys{/pgf/fpu=true,/pgf/fpu/output format=fixed}
\begin{tikzpicture}
\node [tape] (model) {Do stuff};
\end{tikzpicture}
\end{document}
这就引发了ill-formatted floating point number
。
为什么 FPU 与这个(看似简单的)库不兼容?
答案1
fpu
当您使用一些基本的 pgf 例程(例如形状中使用的例程)时,不可能使用“就这样” tape
。但是,可以在重要的地方本地使用它。也就是说,您可以在组中本地打开它,并使用在编写此问题很久之后\pgfmathsmuggle
才添加到的pgf
(之前有内部版本可用),将计算结果偷运出组。这允许您定义在解析表达式时产生相当小的值但在超过大值的函数。链接下的函数是一个很好的例子,因为它涉及参数 omega 的高次方,但结果不是太极端,因为这些大值被抵消了。
\documentclass[tikz]{standalone}
\usetikzlibrary{shapes.symbols}
\usetikzlibrary{fpu}
\newcommand{\pgfmathparseFPU}[1]{\begingroup%
\pgfkeys{/pgf/fpu,/pgf/fpu/output format=fixed}%
\pgfmathparse{#1}%
\pgfmathsmuggle\pgfmathresult\endgroup}
\pgfmathdeclarefunction{SPM}{4}{\begingroup% #1=omega,#2=omega_p,#3=alpha,#4=beta
\pgfmathparseFPU{(#2/pow(#1,5))*exp(-#4*pow(#2/#1,4))}%
\pgfmathsmuggle\pgfmathresult\endgroup}
\begin{document}
\pgfmathsetmacro{\xtest}{SPM(1,1,1,1)}
\begin{tikzpicture}
\draw[stealth-stealth] (0,4) node[below left] {$S_\mathrm{PM}(\omega) $ }|- (5,0) node[below left] {$\omega$ };
\draw[blue,thick] plot[variable=\x,domain=0.2:5,smooth,samples=71] (\x,{4*SPM(\x,1,1,1)});
\node [tape,below right,draw] at (0.1,4){$\displaystyle S_\mathrm{PM}(\omega)
= \frac{\alpha g^2}{\omega^5} \exp \left [-\beta \left (\frac{\omega_p}{\omega} \right )^4 \right ]$};
\end{tikzpicture}
\end{document}
不用说,制作此图的标准方法是使用,它也只在需要时pgfplots
打开。fpu
\documentclass[tikz]{standalone}
\usepackage{pgfplots}
\usetikzlibrary{shapes.symbols}
\pgfplotsset{compat=1.16}
\begin{document}
\begin{tikzpicture}[declare function={SPM(\omega,\omegap,\alpha,\beta)=%
(\omegap/pow(\omega,5))*exp(-\beta*pow(\omegap/\omega,4));}]
\begin{axis}[xlabel=$\omega$,ylabel=$S_\mathrm{PM}(\omega)$,ymax=0.8]
\addplot[domain=0.2:5,smooth,samples=71,blue,thick] {SPM(x,1,1,1)};
\node[below right,draw,tape] at (0.2,0.75) {$\displaystyle S_\mathrm{PM}(\omega)
= \frac{\alpha g^2}{\omega^5} \exp \left [-\beta \left
(\frac{\omega_p}{\omega} \right )^4 \right ]$};
\end{axis}
\end{tikzpicture}
\end{document}
然而,确实有一些应用程序fpu
需要本地开启,例如这个我从该答案中复制了(或多或少)该答案的代码。