使用 shapes.symbols 库的 PGF fpu“格式不正确的浮点数”

使用 shapes.symbols 库的 PGF fpu“格式不正确的浮点数”

我试图画一个皮尔逊-莫斯科维茨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需要本地开启,例如这个我从该答案中复制了(或多或少)该答案的代码。

相关内容