arcsinh 함수를 사용한 Janky pgfplot 동작

arcsinh 함수를 사용한 Janky pgfplot 동작

pgfplot을 사용하여 적정 곡선을 그리려고 합니다. 기준으로이 종이, 적정 곡선에 대한 방정식은 다음과 같습니다. 방정식

나는 이것을 pgfplots 내에서 구현하려고 시도했는데 매우 이상한 결과를 얻었습니다. pgfplot

왜 이런 일이 발생하는지 모르겠습니다. 내가 사용한 정확한 공식을 재현하려고 시도하는 것조차데스모스작동하지 않았다.

참고로 코드는 다음과 같습니다.뒷면 프로젝트에 대한 링크.

\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

TeXs 한계에 도달했기 때문에 이 이상한 결과가 나타납니다(떨어진 좌표에서도 볼 수 있듯이). 따라서 "지그재그"는 정밀도 한계(빨간색 선)로 인해 발생합니다. gnuplot(녹색 점) 또는 Lua(파란색 선)를 계산 엔진으로 사용하면 예상대로 작동합니다. 물론 Lua 솔루션의 경우 LuaLaTeX를 TeX 엔진으로 사용해야 합니다.


참고:
이렇게 많은 수의 샘플을 사용하지 않으려면 비선형 간격을 활용하도록 방정식을 다시 공식화하는 것이 좋습니다. 이에 대해서는 예를 참조하십시오.

% 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}

위 코드의 결과를 보여주는 이미지

관련 정보