声明函数与 pgfmathdeclarefunction

声明函数与 pgfmathdeclarefunction

我想创建一个图像来比较高斯分布和小 n 值的学生 t 分布之间的差异。

从我在 SE 中的搜索中,我得到了高斯 pdf 的定义TikZ/PGF 中的钟形曲线/高斯函数/正态分布绘制 t 分布的示例使用 TikZ 实现学生 t 分布。在后者中,函数“gamma”和“student”在本地声明。我打算多次使用这个函数,所以我想全局声明这些函数。正如您在 MWE 中看到的,我尝试使用 tixzpicture 声明中的函数来执行此操作,并将它们以较小的修改(变量)复制到从高斯分布复制的 \pgfmathdeclarefunction 命令中。

但是,如果我使用 tikzpicture 声明编译 MWE,则一切都很好,如果我取消注释序言中的函数并赞扬 tikzpicture 声明,则我根本得不到图像。

我的代码:

\documentclass[border=5mm]{standalone}
\usepackage{pgfplots}

\pgfmathdeclarefunction{gauss}{3}{%
  \pgfmathparse{1/(#3*sqrt(2*pi))*exp(-((#1-#2)^2)/(2*#3^2))}%
}

%\pgfmathdeclarefunction{gamma}{1}{%
%   \pgfmathparse{2.506628274631*sqrt(1/#1)+ 0.20888568*(1/#1)^(1.5)+ 0.00870357*(1/#1)^(2.5)- (174.2106599*(1/#1)^(3.5))/25920- (715.6423511*(1/#1)^(4.5))/1244160)*exp((-ln(1/#1)-1)*#1}
%}
%
%\pgfmathdeclarefunction{student}{2}{%
%   \pgfmathparse{gamma((#2+1)/2.)/(sqrt(#2*pi) *gamma(#2/2.)) *((1+(#1*#1)/#2)^(-(#2+1)/2.))}
%}

\begin{document}

\begin{tikzpicture}[
    declare function={gamma(\z)=
    2.506628274631*sqrt(1/\z)+ 0.20888568*(1/\z)^(1.5)+ 0.00870357*(1/\z)^(2.5)- (174.2106599*(1/\z)^(3.5))/25920- (715.6423511*(1/\z)^(4.5))/1244160)*exp((-ln(1/\z)-1)*\z;},
    declare function={student(\x,\n)= gamma((\n+1)/2.)/(sqrt(\n*pi) *gamma(\n/2.)) *((1+(\x*\x)/\n)^(-(\n+1)/2.));}
]

\begin{axis}[
    axis lines=left,
    enlargelimits=upper,
    samples=50,
]
\addplot [thick, smooth, domain=-6:6] {student(x,5)};
\addplot [thick, smooth, domain=-6:6] {gauss(x,0,1)};
\end{axis}
\end{tikzpicture}
\end{document} 

关于这里发生的事情的任何暗示都可以......

答案1

我不知道如何正确使用\pgfmathdeclarefunction,但对我来说以下方法有效:

\tikzset{declare function={bellshape(\x,\mu,\sigma)=exp(-(\x-\mu)^2/(2*\sigma^2));}}
\tikzset{declare function={normal(\x,\mu,\sigma)=1/(2.5066283*\sigma)*bellshape(\x,\mu,\sigma);}}
\tikzset{declare function={gamma(\z)= (2.506628274631*sqrt(1/\z) + 0.20888568*(1/\z)^(1.5) + 0.00870357*(1/\z)^(2.5) - (174.2106599*(1/\z)^(3.5))/25920 - (715.6423511*(1/\z)^(4.5))/1244160)*exp((-ln(1/\z)-1)*\z);}}
\tikzset{declare function={tpdf(\x,\nu) = gamma(0.5*(\nu+1))/(sqrt(3.1415927*\nu)*gamma(\nu/2))*(1+\x^2/\nu)^(-(\nu+1)/2);}}

基本上,\tikzset您可以全局设置与方括号中本地设置的选项相同的选项。

相关内容