绘制函数对数的图形

绘制函数对数的图形

我正在尝试绘制一个函数,该函数涉及在域 (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}

在此处输入图片描述

相关内容