我想绘制一个连续复利序列的图形,该序列具有一定的年利率和投入资本。但是,生成的图形似乎精度不够(见下面的图形波动)。
输出:
梅威瑟:
\documentclass[border=5pt]{standalone}%
\usepackage{tikz,pgfplots}
\begin{document}
\begin{tikzpicture}[font=\scriptsize]
\begin{axis}[%
axis x line=bottom,
axis y line=center,
tick align=outside,
axis y discontinuity=crunch,
xtickmax=55,
ytickmin=2100,
ytickmax=2103,
ymin=2098,
enlargelimits=true,
mark size=1pt,
yticklabel style={/pgf/number format/1000 sep={\,}}
]
\addplot[%
mark=none,
domain=1:55,
samples=55,
only marks,
orange!50,
draw=black] {2000*(1+0.05/x)^x};
\end{axis}
\end{tikzpicture}
\end{document}
问题:
有没有什么(简单的)方法可以提高 -command 的精度\addplot
(可能不需要 gnuplot)?
答案1
这里有一种方法xint
进行计算。
幸运的是,只需要整数(半整数也可以)指数。事实上,xint
仍然需要增加对 log 和 exp 等数学函数的支持。
优点是它适用于所有引擎(我使用了 pdflatex)。
\documentclass[border=5pt]{standalone}
\usepackage{tikz,pgfplots}
\usepackage{xintexpr}
\begin{document}
\begin{tikzpicture}[font=\scriptsize]
\begin{axis}[%
axis x line=bottom,
axis y line=center,
tick align=outside,
axis y discontinuity=crunch,
xtickmax=55,
ytickmin=2100,
ytickmax=2103,
ymin=2098,
enlargelimits=true,
mark size=1pt,
yticklabel style={/pgf/number format/1000 sep={\,}}
]
\xintDigits:=8;% no need to use 16 digits of precision
\addplot[%
mark=none,
% domain=1:55,
% samples=55,
only marks,
orange!50,
draw=black] coordinates {%
\xintthecoords% (converts x1,y1,x2,y2,... into (x1, y1) (x2, y2)...
% format, as expected by "coordinates")
\xintfloatexpr
seq((x,2000*(1+0.05/x)^x), x=1..55)
% works with xint float engine
% because exponent is integer (or half-integer)
\relax
};
\end{axis}
\end{tikzpicture}
\end{document}
答案2
警告:此答案基于 LuaLaTeX。
pgfplots
警告您一个重要细节:您应该使用较新的兼容性设置。只需将警告中的行复制到文件中即可解决波动问题(因为pgpfplots
将使用 Lua 来计算点)。
\documentclass{article}%
\usepackage{tikz,pgfplots}
\pgfplotsset{compat=1.16}
\begin{document}
\begin{tikzpicture}[font=\scriptsize]
\begin{axis}[%
axis x line=bottom,
axis y line=center,
tick align=outside,
axis y discontinuity=crunch,
xtickmax=55,
ytickmin=2100,
ytickmax=2103,
ymin=2098,
enlargelimits=true,
mark size=1pt,
yticklabel style={/pgf/number format/1000 sep={\,}}
]
\addplot[%
mark=none,
domain=1:55,
samples=55,
only marks,
orange!50,
draw=black] {2000*(1+0.05/x)^x};
\end{axis}
\end{tikzpicture}
\end{document}