我想用 gnuplot 绘制一些函数。它运行良好,但缺少前半部分,我不知道为什么。
\begin{figure}[htpb]
\begin{center}
\begin{tikzpicture}
\begin{axis}[width=0.8\textwidth, xlabel={Anzahl der Prozessoren}, ylabel={Speedup}, xmin=1, xmax=4096, ymin=0, ymax=30, xmode = log, log basis x={2},xticklabel=\pgfmathparse{2^\tick}\pgfmathprintnumber{\pgfmathresult}]
\addplot gnuplot[black, solid, raw gnuplot,id=bal,mark=none,very thick]{
set xrange [0:4096];
set yrange [0:30];
p = 0.5;
f(x)=1/((1-p) + p/x);
plot f(x)};
\addplot gnuplot[black, dashed, raw gnuplot,id=bal,mark=none,very thick]{
set xrange [0:4096];
set yrange [0:30];
p = 0.8;
f(x)=1/((1-p) + p/x);
plot f(x)};
\addplot gnuplot[black, dotted, raw gnuplot,id=bal,mark=none,very thick]{
set xrange [0:4096];
set yrange [0:30];
p = 0.9;
f(x)=1/((1-p) + p/x);
plot f(x)};
\addplot gnuplot[black, loosely dotted, raw gnuplot,id=bal,mark=none,very thick]{
set xrange [0:4096];
set yrange [0:30];
p = 0.95;
f(x)=1/((1-p) + p/x);
plot f(x)};
\legend{%
P = 50\%,
P = 80\%,
P = 90\%,
P = 95\%,
}
\end{axis}
\end{tikzpicture}
\end{center}
\caption{Speedup nach Amdahla'sches Gesetz}
\label[figure]{fig:amdahls_law_speedup}
\end{figure}
我的结果是这样的:
但它应该是这样的:
我是 pgfplots 的新手。所以代码可能也包含冗余数据。但是为什么图的第一部分缺失了呢?
答案1
发生这种情况的原因是,图的前半部分没有有效样本。
gnuplot
默认情况下使用 100 个样本,从采样范围中的第一个数字开始,并在线性空间中均等划分范围。这意味着,在您的例子中,您的样本位于0
、41.4
、等。由于您的等式中除以零,因此82.8
第一个样本的计算结果为。NaN
一个快速解决方法是将范围设置为1:4096
,确保您在开始时获得有效样本。但是,这不会导致方程的准确表示,因为几乎所有样本都在图表的上部区域。更好的方法是set logscale x;
在gnuplot
选项中使用以均匀分布对数空间中的样本:
在这种情况下,根本不需要使用gnuplot
。仅使用内置的 PGF 数学引擎即可生成此图:
\documentclass[border=5mm]{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
width=0.8\textwidth,
xlabel={Anzahl der Prozessoren},
ylabel={Speedup},
domain = 1:4096,
xmin=1, xmax=4096,
ymin=0, ymax=30,
xmode = log,
log basis x={2},
log ticks with fixed point
]
\addplot [black, very thick]{
1/((1-0.5) + 0.5/x)
};
\addplot [black, very thick, dashed]{
1/((1-0.8) + 0.8/x)
};
\addplot [black, very thick, dotted]{
1/((1-0.9) + 0.9/x)
};
\addplot [black, very thick, loosely dotted]{
1/((1-0.95) + 0.95/x)
};;
\legend{%
P = 50\%,
P = 80\%,
P = 90\%,
P = 95\%,
}
\end{axis}
\end{tikzpicture}
\end{document}
答案2
纯粹的pgfplots
解决方案可能也更高效,输入速度也更快
\begin{tikzpicture}
\begin{semilogxaxis}[grid,log basis x={2},xticklabel=\pgfmathparse{2^\tick}\pgfmathprintnumber{\pgfmathresult},enlarge x limits = false,width=0.8\textwidth, xlabel={Anzahl der Prozessoren}, ylabel={Speedup}, xmin=1, ymin=0, legend pos=north west]
\addplot [black, solid,mark=none,very thick,domain=1:4096]{1/((1-0.5) + 0.5/x)};
\addplot [black, dashed,mark=none,very thick,domain=1:4096]{1/((1-0.8) + 0.8/x)};
\addplot [black, dotted,mark=none,very thick,domain=1:4096]{1/((1-0.9) + 0.9/x)};
\addplot [black, loosely dotted, mark=none,very thick,domain=1:4096]{1/((1-0.95) + 0.95/x)};
\legend{%
P = 50\%,
P = 80\%,
P = 90\%,
P = 95\%,
}
\end{semilogxaxis}
\end{tikzpicture}
请注意,避免 log(0) 的重要绘图参数是domain=min:max
而不是xmin,xmax
。
答案3
Dimension too large
当我尝试运行此代码时,我实际上会收到错误。我怀疑您的问题是您有一个p/x
术语;因为x->0
这个术语将变得难以计算。将 gnuplots 中的 x 限制更改为[1:4096]
。这对我来说有效:
\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.11}
\begin{document}
\begin{figure}[htpb]
\begin{center}
\begin{tikzpicture}
\begin{axis}[width=0.8\textwidth, xlabel={Anzahl der Prozessoren}, ylabel={Speedup}, xmin=1, xmax=4096, ymin=0, ymax=30, xmode = log, log basis x={2},xticklabel=\pgfmathparse{2^\tick}\pgfmathprintnumber{\pgfmathresult}]
\addplot gnuplot[black, solid, raw gnuplot,id=bal1,mark=none,very thick]{
set xrange [1:4096];
set yrange [0:30];
p = 0.5;
f(x)=1/((1-p) + p/x);
plot f(x)};
\addplot gnuplot[black, dashed, raw gnuplot,id=bal2,mark=none,very thick]{
set xrange [1:4096];
set yrange [0:30];
p = 0.8;
f(x)=1/((1-p) + p/x);
plot f(x)};
\addplot gnuplot[black, dotted, raw gnuplot,id=bal3,mark=none,very thick]{
set xrange [1:4096];
set yrange [0:30];
p = 0.9;
f(x)=1/((1-p) + p/x);
plot f(x)};
\addplot gnuplot[black, loosely dotted, raw gnuplot,id=bal4,mark=none,very thick]{
set xrange [1:4096];
set yrange [0:30];
p = 0.95;
f(x)=1/((1-p) + p/x);
plot f(x)};
\legend{%
P = 50\%,
P = 80\%,
P = 90\%,
P = 95\%,
}
\end{axis}
\end{tikzpicture}
\end{center}
% \caption{Speedup nach Amdahla'sches Gesetz}
% \label[figure]{fig:amdahls_law_speedup}
\end{figure}
\end{document}