Seminar 1 — Wave Optics Calculations

Introduction

In this seminar, we explore fundamental concepts from Lecture 1: ray tracing through optical systems, interference phenomena, and the boundary behavior of light at interfaces. You will solve problems combining analytical calculations with numerical simulations.


Pen & Paper Problems

Problem 1: ABCD Matrix Ray Tracing

A thick lens can be modeled as two refracting surfaces separated by a distance \(d\) in a medium of refractive index \(n\). The ABCD matrix for this system is:

\[\begin{pmatrix} A & B \\ C & D \end{pmatrix} = \begin{pmatrix} 1 & 0 \\ -\frac{1}{f} & 1 \end{pmatrix}\]

for a thin lens, but for a thick lens with radii \(R_1\) and \(R_2\) (first surface convex toward incident light) and refractive index \(n\):

Given: \(R_1 = 50\) mm, \(R_2 = -50\) mm, \(d = 5\) mm, \(n = 1.5\), incident ray at height \(h = 2\) mm with angle \(\theta = 1°\).

Tasks: 1. Compute the focal length of the thick lens using \(f = \frac{d}{n-1} \left( \frac{1}{R_1} - \frac{1}{R_2} + \frac{(n-1)d}{nR_1 R_2} \right)\). 2. Trace the ray through the system using ABCD matrices (compute the matrices for: first refraction, propagation, second refraction). 3. Find the output ray position and angle. If this ray continues, where does it cross the optical axis (image position)?

Hint: A ray state is \(\begin{pmatrix} h \\ \theta \end{pmatrix}\). After propagating through ABCD: \(\begin{pmatrix} h' \\ \theta' \end{pmatrix} = \begin{pmatrix} A & B \\ C & D \end{pmatrix} \begin{pmatrix} h \\ \theta \end{pmatrix}\).


Problem 2: Thin Film Interference

A soap film (refractive index \(n = 1.33\), thickness \(d = 0.5\) μm) floats in air. White light is incident normally on the film.

Tasks: 1. For constructive interference in reflected light, what wavelengths (in the visible range 400–700 nm) are enhanced? 2. For destructive interference in reflected light, what colors are suppressed? 3. The reflected color appears as a particular shade. Which wavelengths contribute most?

Hint: For a film in air with normal incidence, the optical path difference is \(2nd\) (accounting for the phase change at the air-film boundary). Include the \(\pi\) phase shift at the denser medium reflection.


Problem 3: Michelson Interferometer

A Michelson interferometer uses a He-Ne laser (\(\lambda = 633\) nm). The path difference between the two arms is adjustable.

Tasks: 1. If the movable mirror is displaced by \(\Delta z = 0.1\) mm, how many fringes pass through the center of the field of view? 2. If one mirror is tilted by angle \(\alpha = 10\) arcseconds relative to the other, estimate the fringe spacing (center-to-center distance on the detector). Assume the beam diameter on the mirror is 10 mm. 3. What happens to the visibility (contrast) of the fringes if the mirrors are tilted?


Problem 4: Fresnel Equations & Brewster Angle

Consider light incident on a glass-air interface (from glass, \(n_1 = 1.5\), to air, \(n_2 = 1.0\)).

Tasks: 1. Calculate the Brewster angle \(\theta_B = \arctan(n_2/n_1)\) for this interface. 2. At Brewster incidence, what is the reflection coefficient for \(s\)-polarized light (\(R_s\))? 3. Sketch how \(R_s\) and \(R_p\) (Fresnel coefficients for \(s\) and \(p\) polarization) vary with incident angle from 0° to 90°. Mark the Brewster angle.


Python Exercises

Setup


Exercise 1: Thin Film Reflectance

Calculate and plot the reflectance spectrum for a thin film of varying thickness.

Code
# Thin film interference: reflectance vs wavelength
def thin_film_reflectance(n_film, n_air, thickness_um, wavelengths_nm):
    """
    Calculate reflectance for normal incidence on a thin film.
    Assumes film in air with phase change at first surface.
    """
    n = n_film
    d = thickness_um * 1000  # nm

    # Optical path difference
    delta = 2 * n * d  # (in nm)

    # Phase difference (accounting for π phase change at denser medium)
    phase = 2 * np.pi * delta / wavelengths_nm + np.pi

    # Reflectance for normal incidence (Fresnel at interfaces)
    r1 = (1 - n) / (1 + n)  # air-film
    r2 = (n - 1) / (n + 1)  # film-air (same magnitude, opposite sign)

    # Intensity reflectance with interference
    R = np.abs(r1 + r2 * np.exp(1j * phase)) / np.abs(1 + r1 * r2 * np.exp(1j * phase))**2

    return R

# Define wavelengths
wavelengths = np.linspace(400, 700, 500)

# Calculate reflectance for soap film (n=1.33, d=0.5 µm)
R_soap = thin_film_reflectance(n_film=1.33, n_air=1.0, thickness_um=0.5, wavelengths_nm=wavelengths)

fig, ax = plt.subplots(figsize=get_size(12, 6))
ax.plot(wavelengths, R_soap, linewidth=2)
ax.set_xlabel(r'Wavelength (nm)')
ax.set_ylabel(r'Reflectance')
ax.grid(True, alpha=0.3)
ax.set_xlim(400, 700)
plt.tight_layout()
plt.savefig('img/thin_film_reflectance.png', dpi=150, bbox_inches='tight')
plt.close()

print(f"Maximum reflectance: {np.max(R_soap):.4f} at λ = {wavelengths[np.argmax(R_soap)]:.1f} nm")
print(f"Minimum reflectance: {np.min(R_soap):.4f} at λ = {wavelengths[np.argmin(R_soap)]:.1f} nm")
Maximum reflectance: 0.2722 at λ = 443.3 nm
Minimum reflectance: 0.0012 at λ = 532.3 nm

Exercise 2: Michelson Interferometer Fringe Pattern

Simulate the intensity pattern observed in a Michelson interferometer with a tilted mirror.

Code
# Michelson interferometer: intensity pattern
wavelength = 633e-9  # He-Ne laser (m)
beam_diameter = 10e-3  # 10 mm

# Create detector grid
detector_size = 20e-3  # 20 mm detector
pixels = 200
x = np.linspace(-detector_size/2, detector_size/2, pixels)
y = np.linspace(-detector_size/2, detector_size/2, pixels)
X, Y = np.meshgrid(x, y)

# Flat mirrors case (uniform path difference)
path_diff_flat = 0  # can be adjusted
intensity_flat = np.cos(2 * np.pi * path_diff_flat / wavelength)**2

# Tilted mirror case: one mirror tilted by angle α
alpha = 10 / 3600 * np.pi / 180  # 10 arcseconds to radians
path_diff_tilted = X * np.sin(2 * alpha)  # optical path difference varies with x
intensity_tilted = np.cos(np.pi * path_diff_tilted / wavelength)**2

fig, axes = plt.subplots(1, 2, figsize=get_size(14, 6))

# Flat mirror
im0 = axes[0].imshow(intensity_flat * np.ones_like(X), extent=[-10, 10, -10, 10], cmap='gray', vmin=0, vmax=1)
axes[0].set_xlabel('x (mm)')
axes[0].set_ylabel('y (mm)')
axes[0].set_aspect('equal')

# Tilted mirror
im1 = axes[1].imshow(intensity_tilted, extent=[-10, 10, -10, 10], cmap='gray', vmin=0, vmax=1)
axes[1].set_xlabel('x (mm)')
axes[1].set_ylabel('y (mm)')
axes[1].set_aspect('equal')

plt.tight_layout()
plt.savefig('img/michelson_fringes.png', dpi=150, bbox_inches='tight')
plt.close()

# Calculate fringe spacing for tilted mirror
fringe_spacing = wavelength / (2 * np.sin(alpha))
print(f"Fringe spacing (tilted, α=10\"): {fringe_spacing*1e3:.3f} mm")
Fringe spacing (tilted, α=10"): 6.528 mm

Exercise 3: Multi-beam Fabry-Pérot Interference

Simulate transmission through a Fabry-Pérot étalon for different finesse values.

Code
def fabry_perot_transmission(phase, finesse):
    """
    Transmission through a Fabry-Pérot étalon.

    Parameters:
    - phase: round-trip phase (in units of pi)
    - finesse: finesse of the étalon
    """
    # Reflectance from finesse: F = π*sqrt(R)/(1-R)
    R = (finesse * (1 - np.sqrt(1 - 1/finesse**2)) / np.pi)**2

    # Transmission coefficient (Airy function)
    denominator = 1 + 4 * R / (1 - R)**2 * np.sin(phase/2)**2
    T = 1 / denominator

    return T

# Phase range (normalized)
phase = np.linspace(0, 4*np.pi, 1000)

# Different finesse values
finesse_values = [5, 20, 50, 100]

fig, ax = plt.subplots(figsize=get_size(12, 7))
for F in finesse_values:
    T = fabry_perot_transmission(phase, F)
    ax.plot(phase/np.pi, T, label=f'Finesse = {F}', linewidth=2)

ax.set_xlabel(r'Round-trip phase ($\times \pi$)')
ax.set_ylabel(r'Transmission')
ax.legend(fontsize=8, loc='upper right')
ax.grid(True, alpha=0.3)
ax.set_xlim(0, 4)
plt.tight_layout()
plt.savefig('img/fabry_perot_transmission.png', dpi=150, bbox_inches='tight')
plt.close()

print("Fabry-Pérot transmission peaks are separated by phase = 2π")
print(f"Peak transmission (ideal): 1.0")
Fabry-Pérot transmission peaks are separated by phase = 2π
Peak transmission (ideal): 1.0

Exercise 4: Fresnel Coefficients

Calculate and plot reflection coefficients for s and p polarized light as a function of incident angle.

Code
def fresnel_coefficients(theta_i, n1, n2):
    """
    Fresnel reflection coefficients for s and p polarization.

    Parameters:
    - theta_i: incident angle (in radians)
    - n1, n2: refractive indices of first and second medium
    """
    # Refraction angle
    sin_theta_t = (n1 / n2) * np.sin(theta_i)
    # Handle total internal reflection
    sin_theta_t = np.clip(sin_theta_t, -1, 1)
    theta_t = np.arcsin(sin_theta_t)

    # s-polarization (TE): perpendicular to plane of incidence
    rs = (n1 * np.cos(theta_i) - n2 * np.cos(theta_t)) / (n1 * np.cos(theta_i) + n2 * np.cos(theta_t))
    Rs = np.abs(rs)**2

    # p-polarization (TM): parallel to plane of incidence
    rp = (n2 * np.cos(theta_i) - n1 * np.cos(theta_t)) / (n2 * np.cos(theta_i) + n1 * np.cos(theta_t))
    Rp = np.abs(rp)**2

    return Rs, Rp

# Glass to air: n1 = 1.5, n2 = 1.0
n1, n2 = 1.5, 1.0
theta_i_deg = np.linspace(0, 89.9, 500)
theta_i_rad = theta_i_deg * np.pi / 180

Rs, Rp = fresnel_coefficients(theta_i_rad, n1, n2)

# Calculate Brewster angle
theta_B = np.arctan(n2 / n1) * 180 / np.pi

fig, ax = plt.subplots(figsize=get_size(12, 7))
ax.plot(theta_i_deg, Rs, label='s-polarization', linewidth=2)
ax.plot(theta_i_deg, Rp, label='p-polarization', linewidth=2)
ax.axvline(theta_B, color='red', linestyle='--', label=f'Brewster angle = {theta_B:.2f}°', linewidth=1.5)
ax.fill_between(theta_i_deg, 0, 1, where=(theta_i_deg <= theta_B), alpha=0.1, color='green')
ax.set_xlabel(r'Incident angle (°)')
ax.set_ylabel(r'Reflectance')
ax.legend(fontsize=8)
ax.grid(True, alpha=0.3)
ax.set_xlim(0, 90)
ax.set_ylim(0, 1.05)
plt.tight_layout()
plt.savefig('img/fresnel_coefficients.png', dpi=150, bbox_inches='tight')
plt.close()

print(f"Calculated Brewster angle: {theta_B:.3f}°")
print(f"Theoretical Brewster angle: {np.arctan(1/1.5)*180/np.pi:.3f}°")
print(f"Reflectance for p-polarization at Brewster angle: {Rp[np.argmin(np.abs(theta_i_deg - theta_B))]:.6f}")
Calculated Brewster angle: 33.690°
Theoretical Brewster angle: 33.690°
Reflectance for p-polarization at Brewster angle: 0.000000

Solutions Guide

Problem 1: The focal length should be calculated using the given formula. Use matrix multiplication to trace the ray, and solve for where the output ray crosses the axis.

Problem 2: Look for wavelengths satisfying \(2nd\cos\theta_r = m\lambda\) (constructive) and \(2nd\cos\theta_r = (m + 1/2)\lambda\) (destructive), where \(\theta_r\) is the refracted angle and \(m\) is an integer.

Problem 3: The number of fringes \(N = 2\Delta z / \lambda\). For a tilted mirror, the fringe spacing depends on the tilt angle and beam size.

Problem 4: Use Snell’s law to find refraction angles and apply Fresnel equations. At Brewster angle, \(\theta_i + \theta_t = 90°\), making \(R_p = 0\).


Summary

These exercises cover the essential wave-optical phenomena: ray geometry, interference, and polarization-dependent reflection. By combining analytical and numerical approaches, you develop intuition for how light behaves at interfaces and in optical systems.