前半部分情节缺失

前半部分情节缺失

我想用 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 个样本,从采样范围中的第一个数字开始,并在线性空间中均等划分范围。这意味着,在您的例子中,您的样本位于041.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}

在此处输入图片描述

相关内容