我正在尝试绘制一个函数,该函数涉及在域 (0,1) 上取另一个函数的对数。
如下图所示,当接近 0 时,图形并不平滑。事实上,当远离 0 时,图形表现不佳。但在 1 附近表现良好。
如何才能生成一个在整个域内显得平滑的图形?
代码 v1
\documentclass{standalone}
\usepackage{tikz,pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}
[xmin=0,xmax=1,xtick={0,1},ymin=0,ymax=0.12,ytick={0}]
\addplot[domain=0:1,samples=100]{(1/2)*((1 - x)/x)*((ln((1 + x)/(1-x))/x) - 2)};
\end{axis}
\end{tikzpicture}
\end{document}
输出 v1
更新:
重新排列表达式以使 ln() 中的参数更简单似乎有帮助ln((1+x)/(1-x)) = ln(1+x)-ln(1-x)
。我还指定了\pgfplotsset{compat=1.18}
KersouMan 所指定的值,但如您所见,这对我没有太大帮助。我还添加了restrict y to domain={0:0.12}
以消除一些大尖峰。最后,我想我会休息一下并从域中删除接近 0 的值,而是使用domain=0:1
,但我不想这样做,我真的希望 pgfplots 将其平滑地绘制到 (0,0)。
还有其他想法吗?
代码 v2:
\documentclass{standalone}
\usepackage{tikz,pgfplots}
\pgfplotsset{compat=1.18}
\begin{document}
\begin{tikzpicture}
\begin{axis}
[xmin=0,xmax=1,xtick={0,1},ymin=0,ymax=0.12,ytick={0}]
\addplot[domain=0.03:1,samples=100,restrict y to domain={0:0.12}]{(1/2)*((1 - x)/x)*( (ln(1 + x) - ln(1 - x))/x - 2)};
\end{axis}
\end{tikzpicture}
\end{document}
输出 v2
具体答复:
回复:KersouMan——不幸的是,这对我没有帮助,我想知道它对你有什么帮助。
回复:Jasper Habicht - 这是一个平滑函数,当 x=0 时从 y=0 上升,当 x=1 时趋向于 y=0。是的,我也认为问题是由于函数变得复杂,pgfplots 在 0 附近出现问题。
答案1
解决方法:对对数部分使用泰勒多项式:
\documentclass[border=1.618]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}
\begin{document}
\begin{tikzpicture}
\begin{axis}[xmin=0,xmax=1,xtick={0,1},ymin=0,ymax=0.12,ytick={0}]
\addplot[domain=0.4:1,samples=100] {(1/2)*((1 - x)/x)*( (ln(1 + x) - ln(1 - x))/x - 2)};
\addplot[red,domain=0.0001:0.4,samples=41]{(1 - x)*(x/3 + x^3/5 + x^5/7 + x^7/9)};
\end{axis}
\end{tikzpicture}
\end{document}
答案2
另一个解决方案可能是使用xfp
/l3fp
而不是pgf
-FPU。下面在包的帮助下这样做pgfmath-xfp
来定义您的函数。但是,myplot(0)
会尝试除以零,因此会导致错误,0.001
因此下面将域从 开始(它也会出错,myplot(1)
但永远不会对以下域进行评估)。
\documentclass{standalone}
\usepackage{tikz,pgfplots,pgfmath-xfp}
\begin{document}
\begin{tikzpicture}
\begin{axis}
[xmin=0,xmax=1,xtick={0,1},ymin=0,ymax=0.12,ytick={0}]
% locally define the function myplot
\pgfmxfpdeclarefunction{myplot}{1}{0.5 * ((1 - (#1))/(#1)) * ((ln((1+#1)/(1-(#1)))/(#1)) - 2)}
\addplot[domain=0.001:1,samples=100]{myplot(x)};
\end{axis}
\end{tikzpicture}
\end{document}