VOLUME 1, ISSUE 3 · SPRING 2025 · METHODS
Where the Textbook Titration Shortcuts Actually Fail
Computational study · Peer-edited by the club review board · LaTeX source · Analysis code · Raw output · Interactive model
A Licence With Edges On It
Every chemistry student learns the buffer equation as a gift. Two concentrations and one logarithm. Every chemistry student also learns the disclaimer, which is always some version of provided the acid is weak and the solution is not too dilute, and which has never in the history of the subject come with a number attached. Henderson wrote the relation down in 1908 while thinking about blood [1] and Hasselbalch put it into logarithms in 1917 [2], and the disclaimer has been travelling with it ever since [3][4][8].
So we attached one. At 0.1 M, the concentration of a teaching titration, Henderson-Hasselbalch is good to 0.05 pH across the working buffer window for acids whose pKa lies between 3.92 and 9.84. Outside that band it is not. Acetic acid, pKa 4.756, sits comfortably inside and misses by 0.008 pH at its worst point. Formic acid, pKa 3.75, sits just outside and misses by 0.068. Phenol, at 9.99, misses by 0.065 on the other side.
Dilute the solution and the band narrows from both sides at once, by one full pKa unit for every factor of ten. At 10−3 M it has shrunk to pKa 5.92 through 7.84. At 1.09×10−4 M the two edges cross and the band vanishes, meaning there is no acid at any strength whatsoever for which the buffer equation is good to 0.05 pH across the window from one tenth titrated to nine tenths. That is not a warning. It is a coordinate.
What the Solver Is
The object under test is a titration of a protic acid \(\mathrm{H}_n\mathrm{A}\) with strong base. The exact treatment is old and completely standard, and the only thing the club contributes is running it everywhere instead of in the two or three places a textbook runs it. The general closed form and its computer implementation are de Levie's [5][6][7]. Write \(h = [\mathrm{H}^+]\), let the stepwise dissociation constants be \(K_{a1} \dots K_{an}\), and define the cumulative products \(\beta_k = \prod_{j \le k} K_{aj}\) with \(\beta_0 = 1\). The fraction of the acid carrying \(k\) removed protons is
$$\alpha_k(h) \;=\; \frac{\beta_k\,h^{\,n-k}}{D(h)}, \qquad D(h) = \sum_{k=0}^{n} \beta_k\,h^{\,n-k}$$and the mean number of protons removed is \(\bar n(h) = \sum_k k\,\alpha_k(h)\). Charge balance, with \(C_A\) the total acid concentration and \(C_B\) the added strong-base cation, is then the whole model:
$$C_B + h \;=\; \frac{K_w}{h} \;+\; C_A\,\bar n(h)$$Mass balance is not a separate equation. It is built into the \(\alpha_k\), which sum to one by construction because they share the denominator \(D(h)\). The left side of the charge balance rises with \(h\) and the right side falls, so there is exactly one positive root and no starting guess can send a solver to the wrong place. We bisect in pH on the interval \([-3, 17]\) for 90 halvings, which is a final bracket of 1.6×10−26 pH units, far below anything a double can represent. The whole thing is vectorised, so a grid of 189,297 titration points solves in about a second.
Four things are assumed, and one of them matters enormously. The temperature is 25 °C and \(K_w = 1.000 \times 10^{-14}\), which is a measured quantity with its own literature and its own temperature dependence [15]. The vessel is closed, so no atmospheric carbon dioxide dissolves in. Stepwise constants are treated as independent. And every activity coefficient is 1, which means the solution is ideal and the pH we compute is a concentration pH rather than anything an electrode would read. What an electrode reads is itself a defined quantity with an IUPAC recommendation behind it [13][14], and the gap between the two is not rhetorical. Section 10 is about how badly that last assumption bites, because it bites harder than everything else in this article put together.
The approximations under test are the ones actually taught. Henderson-Hasselbalch, \(\mathrm{pH} = \mathrm{p}K_a + \log_{10}\!\big(\varphi/(1-\varphi)\big)\), with the ratio taken from stoichiometry alone and \(\varphi\) the fraction titrated. The starting-pH formula \([\mathrm{H}^+] = \sqrt{K_a C}\). Its quadratic upgrade, which keeps the acid's own dissociation but still ignores water. The practice of dropping water autoionisation altogether, which we implement by setting \(K_w\) to zero and solving the rest exactly. The equivalence-point formula. And for diprotic acids, the amphiprotic shortcut \(\mathrm{pH} = (\mathrm{p}K_1 + \mathrm{p}K_2)/2\).
Auditing the Solver Before Believing It
An exact solver that is quietly wrong is worse than an approximation that is openly wrong, so the first job was to try to break ours. Six independent checks, each printing the club's number next to an answer we did not compute.
The polynomial check deserves a word, because it shares nothing with bisection except the algebra. Multiply the charge balance through by \(h\,D(h)\) and it becomes a polynomial of degree \(n+2\):
$$\big(h^2 + C_B h - K_w\big)\,D(h) \;-\; C_A\,h\,N(h) \;=\; 0, \qquad N(h) = \sum_k k\,\beta_k h^{\,n-k}$$whose roots we take with an eigenvalue method. Agreement to 6.4×10−14 pH is limited by the eigenvalue solver, not by us, because those coefficients span \(K_w\) and the conditioning is unpleasant. The decimal check has no such problem and lands at 8.9×10−16 pH, which is the last bit of a double.
One check refuses to come out clean, and refusing is the correct behaviour. The textbook says that at half equivalence the pH equals the pKa. It does not. At pKa 4.76 and 1 M the exact answer is 4.7600453, high by 4.5×10−5. At the same pKa and 10−3 M it is 4.8012127, high by 0.041. At pKa 2 and 0.1 M it is 2.1760913, high by 0.176. That is not a solver error. It is the approximation's error, showing up in the one place where students are told there is none, and the next section derives it from scratch and then checks the derivation against the solver over 675 cases.
The Arithmetic, Done by Hand
The entire result of this article comes out of two lines of algebra, and it is worth doing them slowly.
At a fraction \(\varphi\) of the way through the titration, the stoichiometric bookkeeping says the conjugate base is \(\varphi C_A\) and the undissociated acid is \((1-\varphi)C_A\). Charge balance says otherwise. It says \([\mathrm{A}^-] = C_B + [\mathrm{H}^+] - [\mathrm{OH}^-]\), and since \(C_B = \varphi C_A\) exactly under our dilution scheme, writing \(\delta = ([\mathrm{H}^+]-[\mathrm{OH}^-])/C_A\) gives the true ratio as
$$\frac{[\mathrm{A}^-]}{[\mathrm{HA}]} \;=\; \frac{\varphi + \delta}{1 - \varphi - \delta}$$The buffer equation uses \(\varphi/(1-\varphi)\) instead. Take logarithms, expand both to first order in \(\delta\), and the error is
$$\Delta\mathrm{pH} \;\simeq\; -\,\frac{[\mathrm{H}^+]-[\mathrm{OH}^-]}{C_A \ln 10 \;\varphi(1-\varphi)}$$Read that denominator. It carries \(\varphi(1-\varphi)\), which is largest in the middle of the buffer window and smallest at its edges, so the error is smallest at half equivalence and grows towards both ends. This is the opposite of the intuition most people carry, which is that the middle of a buffer region is where approximations get shaky. The middle is the one place the buffer equation is nearly exact.
Now put \(\varphi = 0.1\) and drop the hydroxide, which is negligible on the acid side. To zeroth order \([\mathrm{H}^+] = K_a (1-\varphi)/\varphi\), so the error becomes \(K_a / (C_A \ln 10 \,\varphi^2)\). Set that to a tolerance \(T\) and solve for the pKa:
$$\mathrm{p}K_a^{\,\mathrm{lo}} \;=\; -\log_{10}\!\big(T\,C_A \ln 10\,\varphi^2\big), \qquad \mathrm{p}K_a^{\,\mathrm{hi}} \;=\; 14 + \log_{10}\!\big(T\,C_A \ln 10\,(1-\varphi)^2\big)$$with the second line coming from the same expansion on the base side, where \([\mathrm{OH}^-] = K_w \varphi / (K_a(1-\varphi))\) and \(\varphi = 0.9\). At \(T = 0.05\) and \(C = 0.1\) M these give 3.980 and 9.782. The solver, scanning the full grid with no expansion anywhere, gives 3.922 and 9.840. The gap is 0.058 pKa units on one side and 0.057 on the other, and it stays 0.058 across five decades of concentration, which is what a first-order expansion is entitled to and no better.
Two consequences fall straight out of those two formulas. First, each edge moves one pKa unit per decade of concentration, in opposite directions, because \(C_A\) appears once inside each logarithm. The solver's fitted slopes are −0.9998 and +0.9995. Second, the band must therefore close. Setting the two expressions equal gives \(2\log_{10} C = \log_{10}(T^2 C_A^2 \ln^2\!10\,\varphi^2(1-\varphi)^2) - 14\), and the solver locates the meeting point at \(C = 1.089\times10^{-4}\) M, pKa 6.882. That pKa is not 7, and it should not be: the dilution factor differs between the two edges because a tenth-titrated solution has been diluted less than a nine-tenths-titrated one.
The Map
Figure 1 is the picture the whole thing reduces to. Three exact titration curves at 0.1 M, with the buffer equation laid over each one and the gap between them shaded.
Figure 2 strips away the curve and plots only the error, on a logarithmic axis, so that four orders of magnitude of it fit in one frame. The shape is the same every time: a deep minimum somewhere near half equivalence, rising steeply towards whichever end the trouble is coming from.
Figure 3 assembles every cell into the map. Concentration runs left to right, pKa runs bottom to top, and the shaded wedge is the region where the buffer equation is inside tolerance everywhere from \(\varphi = 0.1\) to \(\varphi = 0.9\).
The table below is the same information for named acids, which is the form in which anybody is actually going to use it. The pKa values are the conventional aqueous ones at 25 °C, of the kind compiled thermodynamically for buffers [16] or extracted from potentiometric titrations by difference plots [12]; the solver takes them as inputs and does not derive them.
| Acid | pKa | worst |error|, pH | at φ | error at φ = 0.5 | inside 0.05 pH? |
|---|---|---|---|---|---|
| too strong for the buffer equation | |||||
| trichloroacetic | 0.660 | 1.5033 | 0.10 | −0.92165 | no |
| dichloroacetic | 1.350 | 1.0101 | 0.10 | −0.44962 | no |
| chloroacetic | 2.865 | 0.2723 | 0.10 | −0.03297 | no |
| citric, pKa1 | 3.130 | 0.1914 | 0.10 | −0.01851 | no |
| hydrofluoric | 3.170 | 0.1807 | 0.10 | −0.01695 | no |
| formic | 3.750 | 0.0682 | 0.10 | −0.00459 | no |
| inside the band at 0.1 M | |||||
| benzoic | 4.200 | 0.0276 | 0.10 | −0.00164 | yes |
| acetic | 4.756 | 0.0082 | 0.10 | −0.00046 | yes |
| propanoic | 4.874 | 0.0063 | 0.10 | −0.00035 | yes |
| carbonic, pKa1 | 6.350 | 0.0002 | 0.10 | −0.00001 | yes |
| dihydrogenphosphate | 7.198 | 0.0001 | 0.90 | +0.00000 | yes |
| hypochlorous | 7.530 | 0.0003 | 0.90 | +0.00001 | yes |
| hydrocyanic | 9.210 | 0.0128 | 0.90 | +0.00042 | yes |
| ammonium | 9.250 | 0.0140 | 0.90 | +0.00046 | yes |
| too weak for the buffer equation | |||||
| phenol | 9.990 | 0.0653 | 0.90 | +0.00253 | no |
| bicarbonate | 10.330 | 0.1199 | 0.90 | +0.00550 | no |
| methylammonium | 10.660 | 0.1990 | 0.90 | +0.01160 | no |
| hydrogenphosphate | 12.375 | 0.9863 | 0.90 | +0.31328 | no |
The φ = 0.5 column is there to make a point. Judged only at half equivalence, every acid on this list except hydrogenphosphate looks fine, several of them spectacularly so. The buffer equation is not tested at half equivalence. It is tested at the ends of the window, which is where people actually prepare buffers when they want a pH that is not exactly the pKa.
Narrowing the window helps, and helps by an amount the algebra predicts in advance. Restricting attention to \(\varphi\) between 0.2 and 0.8 instead of 0.1 to 0.9 buys 0.560 pKa units of extra room on the strong-acid side, averaged over all 41 concentrations. The prediction is \(2\log_{10}(0.2/0.1) = 0.602\). Real, and modest, and not nearly enough to rescue chloroacetic acid.
Working Notes From the Club Table
Session 1, Tuesday
Solver written in forty minutes. Bisection on the charge balance, because the function is
monotone and nobody wanted to debug a Newton iteration that wandered off into negative
concentrations at two in the morning. First run: pure water gives 7.000000000000. Loud
relief.
Session 1, later
Strong acid check fails. Worst discrepancy 9.4e-7 pH, at 0.1 M and fifty percent past
equivalence. Not machine precision. Spent an hour instrumenting the bisection, printing
brackets, widening the pH interval, adding halvings up to 200. Nothing moved.
Session 2
It was never the solver. Past equivalence \(D = C_A - C_B\) goes negative and the closed
form \(h = (D + \sqrt{D^2 + 4K_w})/2\) subtracts two numbers that agree to ten digits. At
0.1 M and \(\varphi = 1.5\) that is 0.02 minus 0.02000000000000005. The bisection was
right and the textbook quadratic was wrong, by a factor of ten million. Rewriting it as
\(h = 2K_w/(\sqrt{D^2+4K_w} - D)\) brings the two into exact agreement. We are keeping this
in the paper because it is the first time any of us has watched a closed form lose to a
numerical method.
Session 2, addendum
Residual at exactly \(\varphi = 1\) is 2.6e-12 pH rather than 1e-15. Also not a bug.
\(C_B + h - K_w/h - C_A\) cancels two numbers of order 0.05 down to one of order 1e-7, so
the float residual is identically zero over a window about 1e-11 pH wide and nothing can be
resolved inside it. Eleven orders of magnitude below anything a chemist measures. Noted and
moved on.
Session 4
Monte Carlo disagrees with the grid by 27 standard errors. 0.03102 against
0.02210 ± 0.00033. Three of us convinced there is a sampling bug. There is
not. The grid was the problem: the failure region hugs the faces of the box, and a closed
lattice puts full-weight nodes on all six of them, which is the trapezoid end-point error
wearing a disguise. Recomputed on a 70×60×64 midpoint rule with no node on any
face: 0.02199, which is 0.32 standard errors from the sampler. Both numbers are in the
output file. We would rather print the wrong one next to the right one than quietly delete
it.
The Five Percent Rule Does Not Cover What You Think
Before any base goes in, the taught answer for the starting pH is \([\mathrm{H}^+] = \sqrt{K_a C}\), and the taught guard on it is the five percent rule: the formula is safe as long as less than five percent of the acid dissociates, which is \(\sqrt{K_a/C} < 0.05\), which is \(K_a/C < 2.5\times10^{-3}\). It is a perfectly good rule. It just guards the wrong door.
Across our 2,337-cell grid, 1,486 cells obey the rule. Of those obedient cells, 523, which is 35.2 percent of them, still miss the exact starting pH by more than 0.05 pH units, and the worst offender inside the rule misses by 2.500 pH. The rule controls how much acid dissociates. It says nothing whatsoever about how many protons water contributes, and water is what does the damage.
Keeping the dissociation term and solving the quadratic \(h^2 + K_a h - K_a C = 0\) fixes exactly the half of the problem the rule was written about. Attempts to give students one decision rule covering both halves have been made [11], and they are worth more than the five percent rule is. Keeping the dissociation term drops the failure rate from 50.02 percent of cells to 22.38 percent, and in the cells where the acid is strong it is essentially perfect: at pKa 0 and 0.1 M the square-root formula misses by 0.538 pH and the quadratic error rounds to zero at four decimal places. In the cells where water matters it does nothing at all. At pKa 12 and 10−3 M both formulas return 7.500 against an exact 6.979, an error of 0.521 pH, and they return it with identical confidence.
Dropping water autoionisation on its own, with the speciation kept exact, costs more than 0.05 pH in 40.82 percent of grid cells. At pKa 12 and 10−5 M it costs 4.279 pH. And it is not merely inaccurate at the equivalence point of a weak-acid titration, it is undefined: with \(K_w\) set to zero there is no positive \(h\) that balances the charge at \(\varphi = 1\), because there is nothing left to balance it with.
The Second Proton Is Already Watching
Polyprotic acids break the buffer equation in a way that has nothing to do with either edge of the map, and it is a nicer failure because you can see it coming from the pKa values alone. Apply Henderson-Hasselbalch to the first buffer region of a diprotic acid and you are implicitly claiming that the second proton is not doing anything yet. Sometimes it is.
The measure is \(\Delta\mathrm{p}K\), the gap between the first and second constants. Run each real diprotic acid at 0.1 M and compare against a fictitious monoprotic acid with the same pKa1, and the extra cost of the second proton is the difference:
| Acid | pKa1 | ΔpK | worst |error|, polyprotic | worst |error|, monoprotic control | cost of the second proton |
|---|---|---|---|---|---|
| succinic | 4.210 | 1.43 | 0.3943 | 0.0270 | +0.3673 |
| citric | 3.130 | 1.63 | 0.3177 | 0.1914 | +0.1263 |
| phthalic | 2.950 | 2.46 | 0.2441 | 0.2445 | −0.0004 |
| malonic | 2.830 | 2.86 | 0.2840 | 0.2842 | −0.0002 |
| oxalic | 1.250 | 3.02 | 1.0740 | 1.0746 | −0.0006 |
| carbonic | 6.350 | 3.98 | 0.0044 | 0.0002 | +0.0042 |
| phosphoric | 2.148 | 5.05 | 0.5671 | 0.5671 | −0.0000 |
Succinic acid is the case to remember. Its two constants are 1.43 apart, and that gap costs 0.367 pH on top of everything else, taking an acid whose pKa1 of 4.21 puts it safely inside the monoprotic band and throwing it well outside. Citric acid pays 0.126. Oxalic acid, whose constants are 3.02 apart, pays essentially nothing, and its enormous 1.07 pH error is entirely the ordinary strong-acid failure of Section 5. Phosphoric acid, with a 5.05 gap, pays nothing at all to four decimal places.
The amphiprotic shortcut is a different story and mostly a happier one. For the intermediate salt, \(\mathrm{pH} = (\mathrm{p}K_1 + \mathrm{p}K_2)/2\) drops both the concentration and \(K_w\). At 0.1 M sodium bicarbonate it gives 8.340 against an exact 8.339528, off by 0.0005, which is a genuinely excellent piece of luck. At 10−3 M the same formula gives 8.340 against 8.297241, off by 0.043. For sodium hydrogen oxalate it is off by 0.102 at 0.1 M and by 0.929 at 10−3 M. The refinement \(h = \sqrt{(K_1K_2C + K_1K_w)/(K_1+C)}\) cuts the big errors by more than a factor of ten, taking oxalate at 10−3 M from 0.929 down to 0.051. On the cases that were already good to a thousandth it does nothing much, and for sodium dihydrogen citrate at 0.1 M it is slightly worse, moving from −0.0006 to +0.0010. Better, then, rather than exact, and better mostly where it was needed.
Rolling Dice at the Bench
A grid tells you where the failures are. It does not tell you how likely you are to walk into one, because that depends on what problems people actually set. So we drew random problems.
A note on what is being sampled. The error we draw is an error in pH, which is not the same as an error in how well a buffer resists added acid; buffer capacity is a derivative and has its own literature [9], and systematic numerical treatments of multi-equilibrium problems reach the same equations from a different direction [10]. We sample pH because pH is what the approximations claim to give.
Two regions, 200,000 draws each, from a single PCG64 stream seeded at 20250411. The classroom region draws pKa uniformly from 3 to 10, concentration log-uniformly from 0.01 to 1 M, and \(\varphi\) uniformly from 0.2 to 0.8, which is roughly the box a homework problem lives in. The wide region opens all three to their full extent. The statistic is whether the buffer equation misses by more than a tolerance, and the standard errors are binomial, computed from the draws themselves.
| Region | P(error > 0.02 pH) | P(error > 0.05 pH) | P(error > 0.10 pH) | mean |error| | 99th percentile |
|---|---|---|---|---|---|
| classroom | 0.05543 ± 0.00051 | 0.02210 ± 0.00033 | 0.00771 ± 0.00020 | 0.00457 ± 0.00004 | 0.08686 |
| wide | 0.67439 ± 0.00105 | 0.61766 ± 0.00109 | 0.56833 ± 0.00111 | 0.89831 ± 0.00279 | 4.76932 |
So the buffer equation is fine, in the sense that matters to a student: draw a problem at random from the region where problems get drawn and it misses 0.05 pH about one time in forty-five, with a median error of 0.00017 pH. It is also terrible, in the sense that matters to anybody who leaves that region: over the full space it misses 0.05 pH in 61.77 percent of draws and the mean error is 0.898 pH. Both of those are honest descriptions of the same equation. The difference between them is entirely the choice of box, which is why the box has to be stated whenever anybody says an approximation is good.
The Objection We Cannot Answer
Here is the strongest case against everything above, and we think it is close to fatal for the practical reading of our result.
Every pH in this article is the pH of an ideal solution. Real ions in real water interact electrostatically, the equilibrium constants that apply to concentrations differ from the thermodynamic ones by activity coefficients, and a calibrated glass electrode measures something closer to hydrogen ion activity than to hydrogen ion concentration. The gap is not subtle. We reran the monoprotic analysis with Davies-equation activity corrections, using conditional constants \(K_a/\gamma^2\) and \(K_w/\gamma^2\) and closing the ionic strength self-consistently on \(I = C_B + [\mathrm{H}^+]\), which for a monoprotic acid is exact rather than approximate. This is the same correction de Levie's simulator offers as an option [7], and switching it on is the single most consequential thing anyone can do to a calculation like ours.
| Acid | C (M) | ionic strength at φ = 0.5 | γ | ideal pH | Davies pH | shift |
|---|---|---|---|---|---|---|
| acetic | 1 | 0.33337 | 0.73205 | 4.75605 | 4.62062 | −0.13542 |
| acetic | 0.1 | 0.03336 | 0.84422 | 4.75646 | 4.68310 | −0.07336 |
| acetic | 0.01 | 0.00335 | 0.93895 | 4.76052 | 4.73376 | −0.02676 |
| acetic | 0.001 | 0.00035 | 0.97882 | 4.79756 | 4.78992 | −0.00764 |
| chloroacetic | 0.1 | 0.03507 | 0.84147 | 2.89797 | 2.83533 | −0.06265 |
| ammonium | 0.1 | 0.03333 | 0.84426 | 9.24954 | 9.17602 | −0.07352 |
| phenol | 0.1 | 0.03333 | 0.84426 | 9.98747 | 9.91395 | −0.07352 |
Look at the 0.1 M acetic acid row. The activity correction moves the half-equivalence pH by 0.073, and we spent the first half of this article establishing that acetic acid's worst buffer-equation error at that concentration is 0.008. The correction we left out is nine times larger than the error we went looking for. Recomputing the whole map with Davies corrections on, the 0.05 pH band at 0.1 M does not narrow. It disappears. The fraction of grid cells where the buffer equation beats 0.05 pH falls from 22.33 percent to 6.57 percent, and the largest ideal-to-Davies gap anywhere on the grid is 0.136 pH.
The defence, and it is a real defence rather than a dodge, is that we are measuring the error of one idealisation against another idealisation with the same solvent model on both sides. The buffer equation is written in concentrations and so is our exact solver, so the comparison between them is clean even though neither describes a beaker. What the Davies run establishes is that our map is a map of a mathematical object, and that anybody who wants to predict an electrode reading to 0.05 pH has a much bigger problem than Henderson-Hasselbalch waiting for them. Davies is itself only reliable to about 0.1 M ionic strength, so the top row of that table is an extrapolation and should be read as an indication of size rather than a number.
There is a second objection, smaller and cleaner. \(K_w\) is an input, not a result, and the base-side edge of the band is made of it. Rerunning the map at p\(K_w\) of 13.90, 14.00 and 14.10 leaves the acid-side edge at 3.922 in all three cases and moves the base-side edge to 9.752, 9.840 and 9.944. One for one, exactly as the closed form says. A titration at body temperature has a different \(K_w\) and therefore a different licence, and nobody teaching the buffer equation mentions that either.
Where a different choice would change the answer
Several other choices in the model could have gone the other way, and being specific about which ones move the result is the difference between a measurement and a claim.
The titrant concentration. We titrate with base at the same concentration as the analyte, so the solution is diluted by a factor of \(1+\varphi\) as the titration runs. A more concentrated titrant dilutes less and flatters the buffer equation. Rerunning the whole map at titrant-to-analyte ratios of 1, 10 and 100 moves the acid-side edge at 0.1 M from 3.922 to 3.886 to 3.883, and the base-side edge from 9.840 to 10.082 to 10.114. The fraction of failing cells falls from 78.09 percent to 75.27 percent. This is a second-order effect worth about \(\log_{10}(1+\varphi)\) in pKa, because the boundary is set by the ratio of \([\mathrm{H}^+]\) to the acid concentration and dilution moves both of them together.
The width of the buffer window. Our headline band is for \(\varphi\) from 0.1 to 0.9. Anyone who only ever works between 0.2 and 0.8 gets 0.560 pKa units back on each side. Anyone who quotes it at \(\varphi = 0.05\) gives 0.602 pKa units back the other way, by the same piece of algebra. This is the single choice with the largest effect on the headline number and it is a convention rather than a physical fact, so we have printed the boundary for both windows in the output file.
The tolerance. We chose 0.05 and 0.10 pH because 0.05 is about the reproducibility a careful student gets from a calibrated electrode and 0.10 is about what a pH paper resolves. Pick 0.02 instead and the band at 0.1 M runs pKa 4.366 to 9.398 and closes at 3.007×10−4 M; pick 0.01 and it runs 4.680 to 9.082 and closes at 6.235×10−4 M. The structure does not change, only the intercepts, because the tolerance enters inside a logarithm. One thing does not move at all: the pKa at which the band closes is 6.882 for every tolerance we tried, from 0.01 up to 0.20.
Ideal against Davies. Covered at the top of this section, and the largest of all of them. With activity corrections switched on there is no 0.05 pH band at 0.1 M at all.
Monoprotic against polyprotic. The map is monoprotic. A diprotic acid with \(\Delta\mathrm{p}K\) under about 2 pays an extra penalty that the map does not contain, worth 0.367 pH for succinic acid. Above \(\Delta\mathrm{p}K\) of about 2.5 the map applies to pKa1 unchanged, to four decimal places.
What We Would Actually Tell a Student
Keep using the buffer equation. It is not a bad equation and this article is not an argument for solving quartics by hand. It is an argument for knowing the edges of the thing you are holding.
Two numbers are enough to carry around. The first is that at 0.1 M the equation is good to 0.05 pH between pKa 3.92 and 9.84, and that the band moves one pKa unit per decade of concentration, narrowing from both sides. The second is that the error lives at the ends of the buffer window and not in the middle, so a buffer made at a one-to-one ratio is the safest thing you can build out of a given acid and a nine-to-one ratio is the least safe.
If you want a third, make it this: below about 10−4 M, stop. There is no acid at any strength for which the equation works across the window at that dilution, and the reason is that water itself is now a significant source of protons and the equation contains no water at all.
What the study does not tell you is what an electrode will read. We did not measure a pH. We did not mix anything. The computation is the experiment, the object we measured is a system of equations, and the thing we established about the real world is only this: two idealisations that are usually presented as the same thing are not the same thing, and we can say exactly where they part company and by how much. Against the published literature, our picture is the one Po and Senozan drew in 2001 when they compared the buffer equation to exact hydrogen ion concentrations and plotted the error against \(K_a\) and buffer composition [3], extended to two more dimensions and given boundaries with numbers on them. The exact machinery is de Levie's [5][6][7], who has been pointing out since 1993 that the general titration curve needs no approximations or segmentation at all and that a spreadsheet can carry it.
Reproducing this
One file, one command, no packages beyond numpy. Python 3.12.
python titration-approximations.py > titration-approximations-output.txt
Expected runtime is well under a minute. Three runs on the same laptop printed 16.5, 19.5
and 30.3 seconds, with numpy 2.4.2 on Python 3.12.3; the spread is machine load rather than
anything in the code, and the numbers are identical in all three. Peak memory is modest, set by the 189,297-point grid held as a handful of
double arrays. The master seed is 20250411, hard-coded at the top of the file, and the single
default_rng stream feeds both Monte Carlo regions in order, so the output is bit
for bit deterministic. Everything in this article, including all five figures, comes out of
that one file. If your numbers differ from ours by more than the printed standard errors we
would like to hear about it. The interactive
model runs the same solver in your browser and reproduces the headline band at its default
settings.
References
- Henderson, L. J. (1908). Concerning the relationship between the strength of acids and their capacity to preserve neutrality. American Journal of Physiology 21, 173–179. doi:10.1152/ajplegacy.1908.21.2.173
- Hasselbalch, K. A. (1917). Die Berechnung der Wasserstoffzahl des Blutes aus der freien und gebundenen Kohlensäure desselben, und die Sauerstoffbindung des Blutes als Funktion der Wasserstoffzahl. Biochemische Zeitschrift 78, 112–144.
- Po, H. N. & Senozan, N. M. (2001). The Henderson-Hasselbalch equation: its history and limitations. Journal of Chemical Education 78, 1499–1503. doi:10.1021/ed078p1499
- de Levie, R. (2003). The Henderson-Hasselbalch equation: its history and limitations. Journal of Chemical Education 80, 146. doi:10.1021/ed080p146
- de Levie, R. (1993). Explicit expressions of the general form of the titration curve in terms of concentration. Journal of Chemical Education 70, 209–217. doi:10.1021/ed070p209
- de Levie, R. (1996). General expressions for acid-base titrations of arbitrary mixtures. Analytical Chemistry 68, 585–590. doi:10.1021/ac950430l
- de Levie, R. (1999). A general simulator for acid-base titrations. Journal of Chemical Education 76, 987–991. doi:10.1021/ed076p987
- de Levie, R. (2002). The Henderson approximation and the mass action law of Guldberg and Waage. The Chemical Educator 7, 132–135. doi:10.1007/s00897020562a
- Urbansky, E. T. & Schock, M. R. (2000). Understanding, deriving, and computing buffer capacity. Journal of Chemical Education 77, 1640–1644. doi:10.1021/ed077p1640
- Baeza-Baeza, J. J. & García-Álvarez-Coque, M. C. (2011). Systematic approach to calculate the concentration of chemical species in multi-equilibrium problems. Journal of Chemical Education 88, 169–173. doi:10.1021/ed100784v
- Pardue, H. L., Odeh, I. N. & Tesfai, T. M. (2004). Unified approximations: a new approach for monoprotic weak acid-base equilibria. Journal of Chemical Education 81, 1367–1375. doi:10.1021/ed081p1367
- Kraft, A. (2003). The determination of the pKa of multiprotic, weak acids by analyzing potentiometric acid-base titration data with difference plots. Journal of Chemical Education 80, 554–559. doi:10.1021/ed080p554
- Buck, R. P., Rondinini, S., Covington, A. K., Baucke, F. G. K., Brett, C. M. A., Camões, M. F., Milton, M. J. T., Mussini, T., Naumann, R., Pratt, K. W., Spitzer, P. & Wilson, G. S. (2002). Measurement of pH. Definition, standards, and procedures (IUPAC Recommendations 2002). Pure and Applied Chemistry 74, 2169–2200. doi:10.1351/pac200274112169
- Covington, A. K., Bates, R. G. & Durst, R. A. (1985). Definition of pH scales, standard reference values, measurement of pH and related terminology (Recommendations 1984). Pure and Applied Chemistry 57, 531–542. doi:10.1351/pac198557030531
- Bandura, A. V. & Lvov, S. N. (2006). The ionization constant of water over wide ranges of temperature and density. Journal of Physical and Chemical Reference Data 35, 15–30. doi:10.1063/1.1928231
- Goldberg, R. N., Kishore, N. & Lennen, R. M. (2002). Thermodynamic quantities for the ionization reactions of buffers. Journal of Physical and Chemical Reference Data 31, 231–370. doi:10.1063/1.1416902