A weak acid titration curve has a buffer region, a half-equivalence point where pH = pKa, and a steep jump at the end point. You can generate the whole curve with four formulas. Below is a JavaScript function for 25 mL of 0.10 M acetic acid titrated with 0.10 M NaOH. (I build PractiSci, which has free virtual titration labs.)
What are the four regions of the curve?
- Start: only the weak acid, so [H⁺] = √(Ka·C).
- Before the end point: a buffer, so pH = pKa + log([A⁻]/[HA]).
- At the end point: only the salt, which hydrolyses, so pH is above 7.
- After the end point: excess NaOH sets the pH.
How do I code the curve?
const Ka = 1.8e-5, Kw = 1e-14, Ca = 0.10, Va = 25, Cb = 0.10; function pH(vb) { const na = Ca * Va / 1000, nb = Cb * vb / 1000, V = (Va + vb) / 1000; if (vb === 0) { const x = (-Ka + Math.sqrt(Ka * Ka + 4 * Ka * Ca)) / 2; return -Math.log10(x); } if (nb < na) return -Math.log10(Ka) + Math.log10(nb / (na - nb)); if (Math.abs(nb - na) < 1e-12) { const c = na / V; return 14 + Math.log10(Math.sqrt(Kw / Ka * c)); } return 14 + Math.log10((nb - na) / V); } What pH values does it give?
| NaOH added (mL) | pH |
|---|---|
| 0 | 2.88 |
| 5 | 4.14 |
| 12.5 (half-equivalence) | 4.74 |
| 20 | 5.35 |
| 24 | 6.12 |
| 25 (end point) | 8.72 |
| 26 | 11.29 |
| 30 | 11.96 |
At 12.5 mL the pH equals pKa = 4.74, which is how you find Ka from a graph. The end point is at 8.72, not 7, so phenolphthalein (pH range 8.2 to 10) is the right indicator and methyl orange is not.
FAQ
Why is the end point above pH 7?
The acetate ion is a weak base, so the salt solution is slightly basic.
How do I find the end point from the curve?
It is where the curve is steepest, the middle of the vertical jump.
Where can I try it?
The free weak acid titration lab lets you run the titration drop by drop, and the Class 12 chemistry practical list has the other titrations.

