此代码
\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 实现。
此解决方案的优点:不需要第三方库。