我正在尝试制作这个图表(使用 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, ',')