arcsinh 関数を使用した pgfplot の動作がおかしい

arcsinh 関数を使用した pgfplot の動作がおかしい

pgfplotを使って滴定曲線を描こうとしています。この紙滴定曲線には次の式があります。 方程式

これを pgfplots 内で実装しようとしましたが、非常に奇妙な結果が得られました。 pgfプロット

なぜこのようなことが起こるのか全く分かりません。デスモス動作しませんでした。

参考までに、ここにコードとOverleaf プロジェクトへのリンク

\documentclass{article}
\usepackage{pgfplots}

\begin{document}

\pgfkeys{
    /pgf/declare function={
        arcsinh(\x) = ln(\x + sqrt(\x^2+1));
    },
    /pgf/declare function={
        Va = 0.025;
        Ma = 0.1;
        Mb = 0.1;
        V(\x) = \x / 1000;
        Kw = 1*10^(-14);
        p(\o) = -ln(\o)/ln(10);
    }
}

\begin{center}
\begin{tikzpicture}
    \begin{axis}[
        xlabel = {Solution Added (mL)},
        ylabel = {pH},
        ymin=0,
        ymax=14,
        ytick distance=7,
        xtick distance=10,
    ]
    \addplot[%
        samples=100,
        color=red,
        domain=0:50,
    ]{%
    7 + 1/ln(10) * arcsinh( 1/(2*sqrt(Kw))  *  (Mb*V(x) - Ma*Va) / (Va + V(x)) )
    };
    \end{axis}
\end{tikzpicture}
\end{center}

\end{document}

補足: pgfplot 関数内で V_a などの変数を使用する方法があれば、全体に定数を使用するよりもずっと便利です。ありがとう、Torjorn

答え1

この奇妙な結果になるのは、TeX の限界に達したためです (座標がドロップされていることからもわかります)。したがって、精度の限界 (赤線) から「ジグザグ」が生じます。gnuplot (緑の点) または Lua (青線) のいずれかを計算エンジンとして使用すると、期待どおりに動作します。もちろん、Lua ソリューションの場合は、TeX エンジンとして LuaLaTeX を使用する必要があります。


サイドノート:
これほど多くのサンプル数の使用を避けたい場合は、非線形間隔を利用するように式を再定式化することを検討してください。そのためには、例えば以下を参照してください。

% used PGFPlots v1.17
\documentclass[border={5pt}]{standalone}
\usepackage{pgfplots}
    % use this `compat` level or higher to use LUA backend for calculation (if possible)
    \pgfplotsset{compat=1.12}
\begin{document}
    % for gnuplot solution
    \newcommand*{\Kw}{1e-14}
    \newcommand*{\Ma}{0.1}
    \newcommand*{\Mb}{0.1}
    \newcommand*{\Va}{0.025}
\begin{tikzpicture}[
    % from https://tex.stackexchange.com/q/144778
    /pgf/declare function={
        % for LUA solution
        arcsinh(\x) = ln(\x + sqrt(\x^2+1));
        Kw = 1e-14;
        Ma = 0.1;
        Mb = 0.1;
        Va = 0.025;
        V(\x) = \x / 1000;
        p(\o) = -0.5*ln(\o)/ln(10);
    },
]
    \begin{axis}[
        xlabel={Solution Added (mL)},
        ylabel={pH},
        domain=0:50,
        samples=201,
    ]
        % gnuplot
        \addplot+ [ultra thick,green,mark size=1pt,only marks,opacity=0.5] gnuplot
            {-0.5*log10(\Kw) + asinh(1/(2*sqrt(\Kw)) * (\Ma*\Va - \Mb*x/1000)/(\Va + x/1000) )/log(10)};
        % Lua(TeX)
        \addplot [thick,blue]
            {p(Kw) + arcsinh(1/(2*sqrt(Kw)) * (Ma*Va - Mb*V(x))/(Va + V(x)) )/ln(10)};
        % TeX
        \addplot [red,opacity=0.75]
            {p(\Kw) + arcsinh(1/(2*sqrt(Kw)) * (Ma*Va - Mb*V(x))/(Va + V(x)) )/ln(10)};
    \end{axis}
\end{tikzpicture}
\end{document}

上記コードの結果を示す画像

関連情報