pgfplots 绘图功能不正确

pgfplots 绘图功能不正确

此代码

\documentclass{article}

\usepackage{pgfplots}
\pgfplotsset{compat=newest}

\begin{document}

  \begin{tikzpicture}
    \begin{axis}
      \addplot [domain=15:30, samples=1000] {4*65*sin(0.25*asin(x/65))/x};
    \end{axis}
  \end{tikzpicture}

\end{document}

绘制一个振荡剧烈的函数。如果我用另一个绘图仪(Mathematica、在线绘图仪等)绘制此函数,我会得到一个非常平滑的函数,它是给出函数的非振荡平均值pgfplots

我知道pgfplots使用度数而不是弧度,但asin()我认为应该给出度数(所以rad()没有必要)?无论如何,我已经尝试输入rad()所有可能的组合,它经常改变输出,但从未给出正确的结果。

将样本改为 1000 也没有带来更好的结果(它开始振荡得更快)。这是 pgfplots 的一个错误吗?

这里还有其他选项可以尝试/更改吗?

TikZ 版本 2.10 的结果(常数插值):

在此处输入图片描述

TikZ CVS 版本 ≥ 2012-10-11 的结果(线性插值):

在此处输入图片描述

答案1

我认为这pgfmath超出了引擎(及其三角函数近似值)的极限。您可以通过使用gnuplot作为后端来解决此问题:

\documentclass{article}

\usepackage{pgfplots}
\pgfplotsset{compat=newest}

\begin{document}

  \begin{tikzpicture}
    \begin{axis}
      \addplot [no markers] gnuplot [domain=15:30, samples=100] {4*65*sin(0.25*asin(x/65))/x};
    \end{axis}
  \end{tikzpicture}

\end{document}

答案2

这主要是对@Jake 的后续行动:

如果你不想使用 gnuplot inline(对于所需的写访问权限,因为这会使构建更加复杂),你可以预先计算曲线非常容易,并且使用

\draw plot file { yourfile.table };

您可以在其中生成预先计算的表一次使用 gnuplot,例如

#!/usr/bin/gnuplot
set format "%.6f"
set table "yourfile.table"
set samples 100
plot [x=15:30] 4*65*sin(0.25*asin(x/65))/x

或使用自定义应用程序。

主要的好处是您可以 a) 使用任意其他应用程序来生成数据,b) 它只需要运行一次,c) 您不需要额外的权限或参数进行调用pdflatex

主要缺点是公式不再内联在 tex 文件中;要更改任何内容,您需要在 tex 之外进行工作。

答案3

这个线程很旧了并且有一个更新。

首先:编译有问题的情节对于pdflatex这个具有挑战性的功能来说存在准确性困难,并且其他答案都是有效的。

1.12但是,的版本pgfplots附带了lua backend使用 lua 高级数学函数的 。 使用 编译相关示例可获得lualatex预期的输出(没有准确性问题)。 速度也至少快两倍。

lua backend如果使用或更新版本,则将处于活动状态。compat=1.12大多数标准参数组合都受支持,如果某些组合当前不受支持,pgfplots则将自动使用现有的 TeX 实现。

此解决方案的优点:不需要第三方库。

相关内容