Achromatic Correction in Cemented Doublet Lenses: Principles and an Open-Source Simulation Example

1. Introduction: Why a Single Lens Suffers from Chromatic Aberration

The refractive index of any transparent medium varies with the wavelength of light — a phenomenon known as dispersion. For ordinary optical glass, the refractive index increases toward shorter (bluer/violet) wavelengths and decreases toward longer (redder) wavelengths.

From the thin-lens equation:

φ = 1/f = (n − 1) × (1/R1 − 1/R2)

the power φ of a lens is directly proportional to the refractive index n. Since n changes with wavelength, a single lens focuses different colors of light at different positions — blue light focuses closer to the lens, red light focuses farther away. This is Longitudinal Chromatic Aberration (LCA). At the image plane it appears as colored fringing or a halo around image points, and it becomes especially noticeable in large-aperture, long-focal-length systems.

The magnitude of chromatic aberration in a single lens is characterized by the Abbe number Vd:

Vd = (nd − 1) / (nF − nC)

where nF, nd, and nC are the glass's refractive indices at the Fraunhofer F line (486.1 nm, blue), d line (587.6 nm, yellow), and C line (656.3 nm, red), respectively. A larger Vd means lower dispersion. For a lens of focal length f, the focus shift between the F and C wavelengths is approximately:

ΔfF−C ≈ f / Vd

The Abbe number of a single glass typically ranges from about 20 to 70 and cannot be eliminated on its own — hence the need to combine multiple glass types.

2. Principle of Achromatic Correction in a Cemented Doublet

2.1 Basic Idea

If two lens elements made from glasses with different Abbe numbers — a low-dispersion "crown" glass and a high-dispersion "flint" glass — are shaped into a positive and a negative lens respectively and cemented together, the chromatic aberration each element introduces can be made to cancel while the assembly still retains the net positive power required. This is the achromatic doublet, the earliest and still most widely used method of chromatic correction (developed in the 18th century following Newton, by Dollond, Clairaut, and others).

2.2 Deriving the Achromatic Condition

For two thin elements in contact (cemented), the total power is the sum of the two:

φ = φ1 + φ2

The first-order chromatic variation of the combined power can be written as:

δφ = φ1/V1 + φ2/V2

To make the power equal at the F and C wavelengths (first-order achromatism), we require δφ = 0:

φ1/V1 + φ2/V2 = 0

Combining this with the total power equation φ = φ1 + φ2 gives:

φ1 = φ × V1/(V1 − V2)      φ2 = φ × (−V2)/(V1 − V2)

Since the crown glass has a larger V1 and the flint glass a smaller V2, this yields φ1 > 0 (positive element, crown) and φ2 < 0 (negative element, flint). The magnitude of φ1 exceeds the target power φ, and φ2 partially cancels it; the sum still gives the desired net positive power, but the chromatic dispersion of the two elements at the F and C wavelengths cancels out.

2.3 Secondary Spectrum: The Residual Chromatic Error That Can't Be Removed

The condition above only guarantees that two specific wavelengths (typically F and C) come to exactly the same focus. Other wavelengths — especially the shorter g and h violet lines — still show residual chromatic error, known as the secondary spectrum. This occurs because the relative (partial) dispersion of different glasses is not exactly proportional to one another, so the two dispersion curves can only be made to intersect exactly at two points. Suppressing the secondary spectrum further requires special low-dispersion (ED/fluorite-type) glasses, leading to apochromatic lens designs — beyond the scope of this article.

3. Design Example: An f = 100 mm, f/5 Achromatic Cemented Doublet

Below is a worked example showing the calculation process, which is then verified in Section 4 with an open-source simulation.

Design target: Effective focal length f = 100 mm, clear aperture D = 20 mm (relative aperture f/5), covering the visible band.

Glass selection (the classic crown–flint pair):

Element Glass nd Vd
Element 1 (positive) N-BK7 (crown) 1.5168 64.17
Element 2 (negative) F2 (flint) 1.6200 36.37

Solving for the power of each element:

φ = 1/100 = 0.01 mm−1

φ1 = 0.01 × 64.17/(64.17 − 36.37) = 0.02308 mm−1  ⇒  f1 ≈ 43.3 mm

φ2 = 0.01 − 0.02308 = −0.01308 mm−1  ⇒  f2 ≈ −76.4 mm

Assigning radii of curvature (using the common "flat-back" form, i.e. the third surface is flat, which simplifies fabrication and cementing):

Setting R3 = ∞, the cemented-surface radius is back-solved from the flint element's power equation φ2 = (n2 − 1)/R2, and the first-surface radius is then back-solved from the crown element's power equation. This gives an initial three-surface prescription based on the thin-lens approximation (Section 4 shows this is only a starting point — a small correction is needed once real element thickness is included):

Surface Radius R (mm) Thickness (mm) Glass Note
1 +42.43 (initial) 5.0 N-BK7 First surface (convex toward object)
2 (cemented) −47.39 (initial) 2.5 F2 Crown/flint cemented interface
3 ∞ (flat) → image plane Exit surface

(Section 4 verifies this initial prescription and corrects it to the final values R1=+42.39, R2=−45.21.)

4. Verifying the Design with an Open-Source Python Toolchain

If you don't have access to commercial lens design software, the open-source Python optics library rayoptics (which bundles the opticalglass sub-package with real dispersion catalogs from Schott, Hoya, Ohara, etc. — no internet connection or commercial license required) can do the equivalent modeling and analysis. Below is the full workflow, which also uncovers and corrects a small error in the "thin-lens" radii from Section 3.

4.1 Setup and Modeling

pip install rayoptics --break-system-packages

Trace the Section 3 structure with its real thickness (not the thin-lens approximation) using the standard paraxial (y, u) ray-trace equations:

import numpy as np
from opticalglass import glassfactory as gfact

g_bk7 = gfact.create_glass('N-BK7', 'Schott')   # real Schott catalog data, Vd=64.17
g_f2  = gfact.create_glass('F2', 'Schott')      # Vd=36.37
t1, t2 = 5.0, 2.5                                # actual center thicknesses (mm)

def efl_bfl(R1, R2, wl, y0=10.0):
    c1, c2, c3 = 1/R1, 1/R2, 0.0
    n0, n1, n2, n3 = 1.0, g_bk7.rindex(wl), g_f2.rindex(wl), 1.0
    u1p = (n0*0.0 - y0*c1*(n1-n0)) / n1
    y2  = y0 + t1*u1p
    u2p = (n1*u1p - y2*c2*(n2-n1)) / n2
    y3  = y2 + t2*u2p
    u3p = (n2*u2p - y3*c3*(n3-n2)) / n3   # flat surface, c3=0
    return -y0/u3p, -y3/u3p               # (EFL, BFL)

I independently re-checked the Section 3 structure with this code and also built the same structure in rayoptics' own OpticalModel/compute_first_order API — the two agree exactly on the d-line focal length (99.12 mm both ways), confirming the tracing method itself is sound.

4.2 An Important Finding: The Thin-Lens Formula Is a Starting Point, Not the Final Answer

Feeding the radii solved purely from the thin-lens formula (R1=+42.43, R2=−47.39, R3=∞) into a real thick-lens trace (accounting for the actual 5 mm and 2.5 mm center thicknesses) gives:

Wavelength (nm) Line EFL (mm) Shift vs. d line (mm)
404.7 h 99.4036 +0.2858
435.8 g 99.2237 +0.1059
486.1 F 99.1066 −0.0112
546.1 e 99.0921 −0.0257
587.6 d 99.1178 0 (reference)
656.3 C 99.1906 +0.0728

Notice that the d-line focal length is 99.12 mm — about 0.9% short of the 100 mm target — and, more importantly, F and C no longer focus at exactly the same place (99.1066 vs. 99.1906 mm, a 0.084 mm gap). This isn't a calculation error; it's a real optical effect. The thin-lens formula ignores actual element thickness, and once real thickness is included, the marginal ray's path through the two glass elements changes just enough that the "exactly satisfied" achromatic condition picks up a small residual. This is exactly why, in real lens design workflows, the thin-lens formula only ever gives you a starting point — further optimization (such as the open-source approach used here) is always required.

4.3 A Quick Optimization Restores Exact Achromatism

Using scipy.optimize.fsolve to solve for R1 and R2 such that the d-line EFL is exactly 100 mm and the F- and C-line EFLs match exactly:

from scipy.optimize import fsolve

def equations(params):
    R1, R2 = params
    efl_d, _ = efl_bfl(R1, R2, 587.6)
    efl_F, _ = efl_bfl(R1, R2, 486.1)
    efl_C, _ = efl_bfl(R1, R2, 656.3)
    return [efl_d - 100.0, efl_F - efl_C]

R1_opt, R2_opt = fsolve(equations, [42.43, -47.39])
# result: R1_opt ≈ 42.39 mm, R2_opt ≈ -45.21 mm

Nudging the cemented-surface radius from −47.39 mm to −45.21 mm (R1 barely changes) is enough to bring the F- and C-line focal lengths into exact agreement. This is exactly what a commercial lens design tool's built-in optimizer would do — reproduced here with two lines of scipy.

5. Final Structure and Verification Results

The corrected prescription:

Surface Radius R (mm) Thickness (mm) Glass Note
1 +42.39 5.0 N-BK7 First surface (convex toward object)
2 (cemented) −45.21 2.5 F2 Crown/flint cemented interface
3 ∞ (flat) → image plane Exit surface

The figure below shows this final structure:

Cemented achromatic doublet layout

Using the same real thick-lens trace, comparing "N-BK7 alone (same d-line f = 100 mm design)" against "the optimized N-BK7 + F2 cemented doublet":

Wavelength (nm) Line Singlet focal length (mm) Doublet focal length (mm)
404.7 h (violet) 97.47 100.455
435.8 g (blue-violet) 98.12 100.223
486.1 F (blue) 98.93 100.050
546.1 e (green) 99.63 99.994
587.6 d (yellow, primary) 100.00 100.000
656.3 C (red) 100.48 100.050

Plotted as a curve, the effect is even clearer:

Singlet vs. achromatic doublet chromatic comparison

Analysis of the results:

  • Singlet lens: The focal lengths at F and C differ by about 1.55 mm, closely matching the theoretical estimate Δf ≈ f/Vd = 100/64.17 ≈ 1.56 mm. At a 20 mm aperture and f/5, this corresponds to a chromatic blur-circle diameter at the focal plane of about (D/f)Δf ≈ 0.31 mm — a color halo visible to the naked eye.
  • Optimized achromatic doublet: The focal lengths at F and C are now exactly equal (both 100.050 mm) — the F–C difference has gone from the singlet's 1.55 mm to essentially zero, a direct demonstration of the achromatic condition φ1/V1 + φ2/V2 = 0 holding exactly once the real thick-lens geometry is accounted for.
  • Residual secondary spectrum: The shorter g and h lines still deviate from the d-line reference by roughly 0.22–0.46 mm — violet light is not fully corrected, an inherent limitation of the two-glass achromatic doublet. In practice this shows up as slight purple fringing. Further suppression requires switching to special low-dispersion glass pairs (e.g., FPL53/ED glass) to design an apochromatic objective.
  • The overall curve shape — a shallow minimum near d/e with increasing deviation toward both ends (especially the blue-violet side) — matches the textbook secondary-spectrum curve exactly.

6. Summary

  1. A single lens inevitably suffers from longitudinal chromatic aberration due to glass dispersion, on the order of f/Vd;
  2. By pairing a low-dispersion crown-glass element with a high-dispersion flint-glass element and cementing them together, the condition φ1/V1 + φ2/V2 = 0 makes the chromatic errors of the two elements cancel at the F and C lines, achieving first-order achromatism;
  3. The radii from the thin-lens formula are only a starting point — once real thickness is included, F and C pick up a small residual mismatch that needs a further optimization pass to remove, exactly mirroring real-world design practice;
  4. This method cannot eliminate chromatic error across the entire spectrum — the residual secondary spectrum (about 0.46 mm at the h line in this example) is an intrinsic limitation of the cemented achromatic doublet;
  5. Without commercial lens design software, the open-source Python library rayoptics (bundled with real Schott glass catalog data) combined with a short paraxial ray-trace script is enough to do the modeling, chromatic analysis, and even the radius optimization — following the same logic a commercial tool would use.

Note: All numbers in this article were computed with the standard paraxial (y, u) ray-trace equations, using real Schott glass dispersion data (N-BK7, F2) from the opticalglass package, and cross-checked against rayoptics' own OpticalModel/compute_first_order results at the d line (the two agree exactly). The initial radii in Section 3 come from the thin-lens approximation; Section 4 shows how a real thick-lens trace reveals the residual color error and how a short optimization corrects it to the final prescription. If you have access to commercial lens design software, you can build the final structure from Section 5 (R1=+42.39, R2=−45.21, R3=∞) directly and further verify it with focal-shift, spot-diagram, and MTF analysis tools, which will also capture higher-order aberrations such as spherical aberration and coma that this paraxial treatment does not.