pgfplot 曲线中的极值

pgfplot 曲线中的极值

我正在尝试制作这个图表(使用 Wolfram Alpha 制作):

在此处输入图片描述

这是我的代码:

\documentclass{article}
\usepackage{pgfplots,tikz}

\begin{document}

\newcommand\erfinv[1]{(0.5*sqrt(pi))*(#1 + (pi/12)*#1^3 + (7*pi^2/480)*#1^5 + (127*pi^3/40320)*#1^7 + (4369*pi^4/5806080)*#1^9 + (34807*pi^5/182476800)*#1^11)} 

\begin{figure}[t]
        \begin{tikzpicture}
        \begin{axis}[
        axis x line=bottom,
        axis y line=left,
        smooth,
        ytick=\empty,
        %ymax=10,
        xtick={0,1},
        xmin=0,
        xmax=1.15]
        \addplot[thick,domain=0.0:0.99,samples=500] {exp(0+0.25*sqrt(2)*\erfinv{2*x-1})};
        \end{axis}
        \end{tikzpicture}   
\end{figure}

\end{document}

输出如下:

在此处输入图片描述

我认为问题是由于极值和点数造成的。但使用像下面这样的更精细的方法并不能改善输出:

\addplot[thick,domain=0.0:0.05,samples=5000] {exp(0+0.25*sqrt(2)*\erfinv{2*x-1})};
\addplot[thick,domain=0.05:0.95,samples=50] {exp(0+0.25*sqrt(2)*\erfinv{2*x-1})};
\addplot[thick,domain=0.95:1,samples=5000] {exp(0+0.25*sqrt(2)*\erfinv{2*x-1})};

有办法解决这个问题吗?也许有其他绘制方法?也许手动创建数据?Matlab?

答案1

\erfinv需要重写该函数,以使中间结果不会消失由 支持fpu并由 使用的数字范围pgfplots。例如:

\documentclass{article}
\usepackage{pgfplots,tikz}

\begin{document}

\newcommand*{\erfinv}[1]{%
  (((((34807/89100 * pi * (#1)/2 * (#1)/2
  + 4369/11340) * pi * (#1)/2 * (#1)/2
  + 127/315) * pi * (#1)/2 * (#1)/2
  + 7/15) * pi * (#1)/2 * (#1)/2
  + 2/3) * pi * (#1)/2 * (#1)/2
  + 2) * (#1)/2
  * sqrt(pi)/2
}

\begin{figure}[t]
        \begin{tikzpicture}
        \begin{axis}[
        axis x line=bottom,
        axis y line=left,
        smooth,
        xmin=0,
        xmax=1.15]
        \addplot[thick,domain=0:1,samples=100]
          {exp(0.25 * sqrt(2) * \erfinv{2*x-1})};
        \end{axis}
        \end{tikzpicture}   
\end{figure}

\end{document}

结果

答案2

经过多次尝试,我听从了 Derek 的建议,选择了外部生成的数据。最终的代码是:

\documentclass{article}
\usepackage{pgfplotstable,tikz}

\begin{document}

\begin{figure}[t]
    \begin{tikzpicture}
    \begin{axis}[
    axis x line=bottom,
    axis y line=left,
    ytick=\empty,
    ymin=0,
    xtick={0,1},
    xmin=0,
    xmax=1.15]
    \pgfplotstableread[col sep=comma]{my_data.txt}\mytab;
    \addplot[smooth,thick,mark=none] table [y=Y, x=X]{\mytab};
    \addplot+[mark=none,dashed,gray,thick] coordinates {(1, 0) (1, 2.2)};               
    \end{axis}
    \end{tikzpicture}   
\end{figure}

\end{document}

这给了我一个漂亮的图表!

在此处输入图片描述

为了参考,我用 Matlab 创建了数据,如下所示:

x = [0:0.001:1]';
y = exp(0+0.25*sqrt(2)*erfinv(2*x-1));
T = [x,y];
dlmwrite('my_data.txt',T, ',')

相关内容