Hành vi janky pgfplot với hàm arcsinh

Sep 02 2020

Tôi đang cố gắng vẽ đường cong chuẩn độ bằng pgfplot. Dựa trên bài báo này , có một phương trình cho đường cong chuẩn độ:

Tôi đã cố gắng thực hiện điều này trong pgfplots và tôi nhận được một kết quả rất lạ:

Tôi không biết tại sao điều này lại xảy ra; thậm chí cố gắng tạo lại công thức chính xác mà tôi đã sử dụng trong desmos cũng không hoạt động.

Để tham khảo, đây là mã và cũng là liên kết đến một dự án ở trang sau .

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

endnote: nếu có cách nào đó tôi có thể có các biến ví dụ như V_a trong hàm pgfplot, điều đó sẽ đẹp hơn nhiều so với việc có hằng số trong suốt. cảm ơn Torjorn

Trả lời

2 StefanPinnow Sep 03 2020 at 21:48

Người ta nhận được kết quả kỳ lạ này vì đã đạt đến giới hạn TeXs - cũng có thể được nhìn thấy bởi các tọa độ bị giảm - và do đó, kết quả "zigzag" từ các giới hạn chính xác (đường màu đỏ). Nếu bạn sử dụng gnuplot (chấm màu xanh lá cây) hoặc Lua (đường màu xanh lam) làm công cụ tính toán, nó sẽ hoạt động như mong đợi. Tất nhiên đối với giải pháp Lua, bạn phải sử dụng LuaLaTeX làm động cơ TeX.


Ghi chú bên lề:
Nếu bạn muốn tránh sử dụng số lượng mẫu cao như vậy, hãy xem xét việc định dạng lại quy cách để sử dụng khoảng cách phi tuyến tính. Đối với điều đó, hãy xem vd

  • https://tex.stackexchange.com/a/443731/95441
  • https://tex.stackexchange.com/a/446727/95441
% 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}