Janky pgfplot Verhalten mit arcsinh Funktion
Ich versuche mit pgfplot eine Titrationskurve zu zeichnen. Basierend auf dieser Arbeit gibt es eine Gleichung für die Titrationskurve:
Ich habe versucht, dies in pgfplots zu implementieren, und ich erhalte ein sehr seltsames Ergebnis:
Ich habe keine Ahnung, warum dies passieren würde; Selbst der Versuch, die genaue Formel, die ich in Desmos verwendet habe , neu zu erstellen, funktionierte nicht.
Als Referenz finden Sie hier den Code sowie einen Link zu einem umseitigen Projekt .
\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: Wenn es eine Möglichkeit gibt, Variablen wie V_a in der pgfplot-Funktion zu haben, wäre das viel schöner, als durchgehend Konstanten zu haben. danke Torjorn
Antworten
Man erhält dieses seltsame Ergebnis, weil die TeX-Grenzen erreicht sind - wie auch an den abgelegten Koordinaten zu sehen ist - und somit der "Zickzack" aus Präzisionsgrenzen resultiert (rote Linie). Wenn Sie entweder Gnuplot (grüne Punkte) oder Lua (blaue Linie) als Berechnungsmaschine verwenden, funktioniert dies wie erwartet. Natürlich müssen Sie für die Lua-Lösung LuaLaTeX als TeX-Engine verwenden.
Nebenbemerkung:
Wenn Sie vermeiden möchten, eine so hohe Anzahl von Abtastwerten zu verwenden, sollten Sie die Gleichung neu formulieren, um nichtlineare Abstände zu verwenden. Dazu siehe z
- 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}