Comportamiento janky pgfplot con función arcsinh
Estoy tratando de dibujar una curva de titulación usando pgfplot. Con base en este documento , existe una ecuación para la curva de titulación:
Intenté implementar esto dentro de pgfplots y obtengo un resultado muy extraño:
No tengo idea de por qué ocurriría esto; incluso intentar recrear la fórmula exacta que utilicé en desmos no funcionó.
Como referencia, aquí está el código y también un enlace a un proyecto al dorso .
\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}
nota final: si hay una forma en que puedo tener variables, por ejemplo, V_a dentro de la función pgfplot, sería mucho mejor que tener constantes en todo momento. gracias Torjorn
Respuestas
Se obtiene este resultado extraño porque se alcanzan los límites de TeX, como también se puede ver en las coordenadas eliminadas, y por lo tanto el "zigzag" resulta de los límites de precisión (línea roja). Si utiliza gnuplot (puntos verdes) o Lua (línea azul) como motor de cálculo, funciona como se esperaba. Por supuesto, para la solución Lua debe usar LuaLaTeX como motor TeX.
Nota al margen : si desea evitar el uso de un número tan alto de muestras, considere reformular la ecuación para hacer uso del espaciado no lineal. Para eso ver eg
- 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}