# titratiecurve.py - pH tijdens de titratie van een sterk zuur met een sterke base
import math

KW = 1.0e-14            # waterconstante bij 25 graden: [H3O+] * [OH-]


def ph_mengsel(c_zuur, v_zuur, c_base, v_base):
    """pH na het mengen van v_zuur mL sterk zuur (c_zuur mol/L) met v_base mL sterke base (c_base mol/L)."""
    overmaat = (c_zuur * v_zuur - c_base * v_base) / (v_zuur + v_base)   # mol/L zuur (negatief: base)
    # ladingsbalans: [H3O+] - KW / [H3O+] = overmaat  ->  kwadratische vergelijking in [H3O+]
    h = (overmaat + math.sqrt(overmaat ** 2 + 4 * KW)) / 2
    return -math.log10(h)


C_ZUUR, V_ZUUR = 0.100, 25.0     # 25,0 mL zoutzuur van 0,100 mol/L in de erlenmeyer
C_BASE = 0.100                   # natronloog van 0,100 mol/L in de buret

if __name__ == "__main__":
    v_eq = C_ZUUR * V_ZUUR / C_BASE
    print(f"equivalentiepunt bij {v_eq:.2f} mL")
    for v in [0, 10, 20, 24, 24.9, 24.95, 25, 25.05, 25.1, 26, 30, 50]:
        print(f"{v:6.2f} mL   pH {ph_mengsel(C_ZUUR, V_ZUUR, C_BASE, v):5.2f}")
