Light and Matter: From Atoms to Optical Devices

When light enters a piece of glass, remarkable things happen: it bends, partially reflects, and travels at a different speed. These everyday phenomena - from the sparkle of a diamond to the operation of optical fibers - all stem from the fundamental interaction between electromagnetic waves and matter at the atomic level.

In this lecture, we’ll trace the complete story from individual atoms responding to electric fields to the macroscopic optical properties we observe and exploit in modern technology. We’ll see how:

Microscopic Origins - How Atoms Respond to Light

The Atomic Picture

To understand why materials affect light propagation, we start with individual atoms. Our simple but powerful model consists of:

  • A positive nucleus at the center
  • A negative electron cloud of charge \(-q\) distributed in a sphere of radius \(a\)
  • An applied electric field that can displace these charges
Figure 1— Atomic polarization: An external electric field displaces the positive nucleus relative to the negative electron cloud, creating an induced dipole moment.

The charge density of the electron cloud is:

\[\rho=\frac{-q}{\frac{4}{3}\pi a^{3}}=-\frac{3q}{4\pi a^3}\]

This creates a radial electric field inside the cloud that acts like a spring:

\[\vec{E}_{\text{internal}}(r)=-\frac{1}{4\pi\epsilon_0}\frac{q}{a^3}\vec{r}\]

Atomic Polarizability

When an external field \(\vec{E}_{\text{ex}}\) is applied, the nucleus is displaced by distance \(\vec{d}\) until forces balance:

\[q\vec{E}_{\text{ex}}-\frac{1}{4\pi\epsilon_0}\frac{q^2\vec{d}}{a^3}=\vec{0}\]

Solving for the displacement:

\[\vec{d}=4\pi \epsilon_0 a^3 \frac{\vec{E}_{\text{ex}}}{q}\]

This creates a dipole moment:

\[\vec{p}=q\vec{d}=4\pi\epsilon_0 a^3 \vec{E}_{\text{ex}} = \alpha \vec{E}_{\text{ex}}\]

The atomic polarizability is:

\[\alpha=4\pi \epsilon_0 a^3\]

Key insight: Polarizability scales with atomic volume - larger atoms are more easily polarized!

From Atoms to Bulk Materials

Polarization Density

In a material with \(N\) atoms per unit volume, the polarization density is:

\[\vec{P}=N\vec{p}=N\alpha\vec{E}_{\text{local}}\]

But what is \(\vec{E}_{\text{local}}\)? In dense materials, each atom feels not just the applied field but also fields from neighboring dipoles.

Maxwell’s Equations in Matter

From the polarization density \(\vec{P} = N\vec{p}\) we established earlier, we can now understand how this microscopic response modifies the macroscopic electromagnetic fields. The polarization creates bound charges within the material that must be accounted for in Maxwell’s equations.

The key insight is that the polarization \(\vec{P}\) represents dipole moments per unit volume, which creates a bound charge density:

\[\rho_b = -\nabla \cdot \vec{P}\]

To handle both free charges (from external sources) and bound charges (from polarization) in a unified way, we introduce the displacement field:

\[\vec{D} = \epsilon_0\vec{E} + \vec{P}\]

This displacement field allows us to write Gauss’s law in terms of only the free charge density \(\rho_f\), effectively “absorbing” the bound charges into the definition of \(\vec{D}\).

For linear materials, the polarization is proportional to the electric field:

\[\vec{P} = \epsilon_0\chi\vec{E}\]

where \(\chi\) is the electric susceptibility of the material. This gives us:

\[\vec{D} = \epsilon_0\vec{E} + \vec{P} = \epsilon_0\vec{E} + \epsilon_0\chi\vec{E} = \epsilon_0(1 + \chi)\vec{E}\]

We define the relative dielectric function (or relative permittivity) as:

\[\epsilon_r = 1 + \chi\]

so that:

\[\vec{D} = \epsilon_0\epsilon_r\vec{E} = \epsilon\vec{E}\]

where \(\epsilon = \epsilon_0\epsilon_r\) is the absolute permittivity.

The presence of bound charges requires modified Maxwell’s equations:

\[\nabla \times \vec{E}=-\frac{\partial \vec{B}}{\partial t} \quad \text{(Faraday's law)}\]

\[\nabla\cdot\vec{D}=\rho_f \quad \text{(Gauss's law with } \vec{D}=\epsilon_0\vec{E}+\vec{P}\text{)}\]

\[\nabla\times \vec{H}=\frac{\partial \vec{D}}{\partial t}+\vec{j}_f \quad \text{(Ampère's law)}\]

\[\nabla\cdot \vec{B}=0 \quad \text{(No magnetic monopoles)}\]

For linear materials: \(\vec{D}=\epsilon(\omega)\vec{E}\) and \(\vec{B}=\mu(\omega)\vec{H}\), where the frequency dependence is now explicit.

Local Field Effects: The Clausius-Mossotti Relation

When we try to connect the microscopic polarizability of individual atoms to macroscopic dielectric properties, we face a crucial problem: in dense materials, atoms don’t just experience the externally applied electric field. Instead, each atom sits in a complex field environment created by all other polarized atoms in the material.

To solve this problem, Lorentz developed a spherical cavity model. Consider a single atom at the center of a small spherical cavity within a uniformly polarized material. The local electric field experienced by this atom has three contributions:

\[\vec{E}_{\text{local}} = \vec{E} + \vec{E}_{\text{depolarization}} + \vec{E}_{\text{near-field}}\]

Where:

  • \(\vec{E}\) is the macroscopic electric field (averaged over many atoms)
  • \(\vec{E}_{\text{depolarization}}\) is the field from polarization charges on the cavity surface
  • \(\vec{E}_{\text{near-field}}\) is from nearby dipoles within the cavity

For an idealized spherical cavity in a uniformly polarized medium, the near-field contribution vanishes due to symmetry. The depolarization field can be calculated from electrostatics:

\[\vec{E}_{\text{depolarization}} = \frac{\vec{P}}{3\epsilon_0}\]

Now we can write a self-consistent equation. The polarization depends on the local field:

\[\vec{P} = N\alpha\vec{E}_{\text{local}} = N\alpha\left(\vec{E} + \frac{\vec{P}}{3\epsilon_0}\right)\]

Rearranging to isolate \(\vec{P}\):

\[\vec{P} = \frac{N\alpha\vec{E}}{1 - \frac{N\alpha}{3\epsilon_0}}\]

From macroscopic electrodynamics, we know that \(\vec{P} = \epsilon_0(\epsilon_r-1)\vec{E}\). Equating these expressions:

\[\epsilon_0(\epsilon_r-1) = \frac{N\alpha}{1 - \frac{N\alpha}{3\epsilon_0}}\]

Cross-multiplying and rearranging:

\[\epsilon_0(\epsilon_r-1)\left(1 - \frac{N\alpha}{3\epsilon_0}\right) = N\alpha\]

\[(\epsilon_r-1) - \frac{N\alpha(\epsilon_r-1)}{3\epsilon_0} = \frac{N\alpha}{\epsilon_0}\]

Collecting terms with \((\epsilon_r-1)\):

\[(\epsilon_r-1)\left(1 + \frac{N\alpha}{3\epsilon_0}\right) = \frac{N\alpha}{\epsilon_0}\]

\[(\epsilon_r-1)\left(\frac{3\epsilon_0 + N\alpha}{3\epsilon_0}\right) = \frac{N\alpha}{\epsilon_0}\]

Solving for the final result:

\[\frac{\epsilon_r - 1}{\epsilon_r + 2} = \frac{N\alpha}{3\epsilon_0}\]

This is the Clausius-Mossotti relation, a remarkable bridge between the microscopic world of atomic polarizability and the macroscopic world of dielectric constants. It successfully explains the refractive indices of many gases and liquids, though it becomes less accurate for strongly polar materials where dipole-dipole interactions become significant.

Wave Propagation and the Refractive Index

Wave Propagation and the Refractive Index

Combining Maxwell’s equations for source-free regions gives the wave equation in matter:

\[\nabla^2\vec{E}-\frac{1}{v^2} \frac{\partial^2\vec{E}}{\partial t^2}=0\]

where the phase velocity is:

\[v=\frac{c}{\sqrt{\epsilon_r\mu_r}}\]

For non-magnetic materials (\(\mu_r=1\)), the refractive index is:

\[n=\frac{c}{v}=\sqrt{\epsilon_r}\]

When electromagnetic waves travel through a material, they interact with the bound charges (electrons and nuclei) we discussed earlier in the atomic polarization model. These microscopic interactions manifest as macroscopic modifications to the wave’s properties through a collective response of billions of atomic dipoles. Let’s examine these effects from a fundamental physical perspective.

Phase Velocity and Wavelength Changes

In a material with refractive index \(n\), the phase velocity of light becomes:

\[v_p = \frac{c}{n}\]

This reduction in velocity isn’t just a mathematical relationship - it has a direct physical cause. As the electromagnetic wave propagates, it induces oscillating dipoles in the material’s atoms. These oscillating dipoles temporarily store electromagnetic energy and re-emit it with a phase delay. This cyclic process of absorption and re-emission effectively increases the time it takes for the wave to propagate through the medium, reducing its effective velocity.

The wavelength must change inside the material while the frequency remains constant (since frequency is determined by the source and must match at boundaries):

\[\lambda_{material} = \frac{\lambda_{vacuum}}{n}\]

This wavelength reduction can be understood as spatial compression of the wavefronts: since the wave oscillates at the same frequency but travels more slowly, the distance between successive crests must decrease proportionally.

Mathematical Description from First Principles

For a plane wave entering a material with refractive index \(n\), we can derive the behavior by considering how the material’s polarization response modifies the wave equation.

When passing through a thin material slab of thickness \(\Delta z\), the total field is a superposition of the incident wave and the field generated by the material’s polarization:

\[\begin{aligned} E &= E_0 e^{i(\omega t - k z)} + E_{pol} \\ &= E_0 e^{i(\omega t - k z)} + E_0 e^{i(\omega t - k z)}(e^{-i(n-1)k\Delta z} - 1) \\ &= E_0 e^{i(\omega t - k z - (n-1)k\Delta z)} \\ &= E_0 e^{-i(n-1)k\Delta z} e^{i(\omega t - kz)} \\ &= E_0 e^{-i\phi} e^{i(\omega t - kz)} \end{aligned}\]

where \(\phi = (n-1)k\Delta z\) is the phase shift introduced by the material. This phase shift has a direct physical interpretation: \((n-1)\) represents the additional optical path length per unit physical length caused by the material’s polarization response, and \(k\Delta z\) is the phase accumulated over distance \(\Delta z\).

Code
# Parameters
E0 = 1.0  # Initial amplitude
k = 2*np.pi  # Wave number
n = 1.5  # Refractive index
dz = 0.1  # Thickness of slab
omega = 2*np.pi  # Angular frequency
t = 0  # Fixed time point

# Spatial grid
z = np.linspace(0, 2, 1000)

# Calculate components
E_vacuum = E0 * np.exp(1j*(omega*t - k*z))
E_medium = -1j * k * (n-1) * dz * E0 * np.exp(1j*(omega*t - k*z))
E_total = E_vacuum + E_medium

# Create figure
fig, ax1 = plt.subplots(1, 1, figsize=get_size(12, 8))

# Plot real parts
ax1.plot(z, E_vacuum.real, 'b-', label='Incident Wave', alpha=0.7)
ax1.plot(z, E_medium.real, 'r-', label='Material Response', alpha=0.7)
ax1.plot(z, E_total.real, 'g-.', label='Total Field', linewidth=2)
ax1.set_xlabel('Position z')
ax1.set_ylabel('Electric Field')
ax1.legend()
ax1.grid(True, alpha=0.3)
ax1.set_title('Wave Modification by Material')

plt.tight_layout()
plt.show()
Figure 2— Wave propagation through a thin material slab

Physical Interpretation at the Atomic Level

The physical mechanism behind wave modification in materials can be traced directly to our earlier discussion of atomic polarization. When an electromagnetic wave enters a material:

  1. The wave’s electric field displaces electrons relative to nuclei, creating oscillating atomic dipoles at the frequency of the incident wave
  2. These oscillating dipoles act as secondary sources, radiating their own electromagnetic waves according to Maxwell’s equations
  3. The secondary waves combine with the incident wave through superposition, resulting in:
    • A phase shift (effectively delaying the wave)
    • A modified wave amplitude
    • Cancellation of backward-propagating components in the absence of reflections

The phase delay fundamentally results from the time lag in the atomic response. When the electric field pushes on the bound electrons, they don’t respond instantaneously but slightly lag the driving field (like a driven harmonic oscillator). This microscopic delay, multiplied across billions of atoms, creates the macroscopic effect of reduced phase velocity.

For a thick material (much greater than a wavelength), these phase shifts accumulate. In a 1 mm thick glass plate (\(n = 1.5\)) illuminated with visible light (\(\lambda = 500\) nm), the total phase shift is \((1.5-1) \times 2\pi \times \frac{10^{-3}}{500 \times 10^{-9}} \approx 6,280\) radians or about 1,000 complete cycles!

Group Velocity and Resonance Effects

The atomic perspective becomes especially important when considering wave packets rather than infinite plane waves. The group velocity governs the propagation of these packets:

\[v_g = \frac{d\omega}{dk} = \frac{c}{n - \lambda\frac{dn}{d\lambda}}\]

This formula has a direct physical interpretation: when a material’s refractive index varies with wavelength (dispersion), different frequency components of a wave packet travel at different phase velocities. This happens because different frequencies excite the atomic dipoles with varying efficiencies depending on how close they are to the natural resonant frequencies of the material’s electrons.

In materials with normal dispersion (\(\frac{dn}{d\lambda} < 0\)), which occurs away from resonances, higher frequencies (shorter wavelengths) experience higher refractive indices because they drive the electrons more efficiently. Near atomic or molecular resonances, anomalous dispersion occurs, leading to dramatic changes in wave propagation and absorption.

The dispersion relation directly connects to the Lorentz-Drude model discussed later, where the refractive index emerges from treating the electrons as damped harmonic oscillators responding to the oscillating electric field of light.

Experimental Manifestations and Applications

The material modification of wave propagation manifests in numerous experimental observations and technologies:

  • Interference phenomena: In a Michelson interferometer, a thin glass plate inserted in one arm shifts the fringe pattern precisely because of the accumulated phase shift \(\phi = (n-1)k\Delta z\). This allows for extremely sensitive measurements of refractive indices or material thicknesses.

  • Optical path length: The concept of optical path length \(L_{opt} = nL_{physical}\) accounts for the additional phase accumulation in materials and is essential for designing optical systems from microscopes to telescopes.

  • Pulse dispersion: In optical communications, the wavelength dependence of refractive index causes different frequency components of pulses to travel at different velocities. This dispersion effect limits data transmission rates in fiber optic systems and requires compensation techniques.

  • Phase contrast microscopy: This Nobel Prize-winning technique exploits the phase shifts introduced by biological samples to convert otherwise invisible phase variations into visible intensity changes, revolutionizing biological imaging without needing stains.

The fundamental interaction between electromagnetic waves and bound charges thus bridges atomic physics to practical applications, demonstrating how microscopic quantum mechanical phenomena scale up to create macroscopic optical effects we can harness in technology.

Frequency Dependence of the Refractive Index: The Lorentz Oscillator Model

In the earlier atomic polarizability model, we treated atoms as static systems responding to a constant electric field. In reality, light consists of time-varying electromagnetic fields, and atoms respond dynamically to these oscillations. This frequency dependence fundamentally explains dispersion, absorption, and many optical phenomena.

From Static to Dynamic Atomic Response

Extending our previous atomic model, we now treat the electron as a damped harmonic oscillator driven by an oscillating electric field. For visible light (\(\lambda \approx 500\, \text{nm}\)) interacting with atoms (size \(\approx 0.1\, \text{nm}\)), we can make the dipole approximation where the field appears uniform across each atom (\(\vec{E}(\vec{r},t) \approx \vec{E}(t)\)), and the local field approximation where the field acting on each atom is approximately the macroscopic field (\(\vec{E}_\text{local} \approx \vec{E}\)).

For a harmonically oscillating electric field \(\vec{E}(t)=E_0\hat{x} e^{-i\omega t}\), the bound electron moves under the combined influence of the restoring force from the nucleus, damping from radiation and collisions, and the driving force from the electric field. This gives us the equation of motion: \[ m\ddot{\vec{r}}+m\sigma\dot{\vec{r}}+m\omega_0^2\vec{r}=q\vec{E}(t) \]

Here, \(\omega_0\) is the natural resonance frequency of the electron, \(\sigma\) is the damping coefficient, \(q\) is the electron charge, and \(m\) is the electron mass.

Frequency-Dependent Polarizability

Solving this differential equation for a steady-state response, the electron displacement follows the driving field with frequency \(\omega\): \[ \vec{r}(t)=\frac{q/m}{\omega_0^2+i\omega\sigma-\omega^2}\vec{E}(t) \]

From this, the frequency-dependent dipole moment becomes \(\vec{p}(\omega)=q\vec{r}(t)=\alpha(\omega)\vec{E}(t)\), where \(\alpha(\omega)=\frac{q^2/m}{\omega_0^2+i\omega\sigma-\omega^2}\) is the frequency-dependent polarizability. This directly extends our previous static model, with the atomic polarizability we derived earlier (\(\alpha=4\pi\epsilon_0 a^3\)) being approximately the low-frequency limit (\(\omega \rightarrow 0\)) of this more general expression.

From Polarizability to Complex Refractive Index

The macroscopic polarization density for \(N\) atoms per unit volume becomes

\[\vec{P}=N\vec{p}=N\alpha(\omega)\vec{E}(t)=\epsilon_0\chi(\omega)\vec{E}(t)\]

giving us the frequency-dependent susceptibility

\[\chi(\omega)=\chi_0\frac{1}{\omega_0^2+i\omega\sigma-\omega^2}\]

where \(\chi_0=\frac{Nq^2}{m\epsilon_0}\) represents the strength of the resonance.

Since the susceptibility is complex (\(\chi=\chi'+i\chi''\)), both the dielectric function \(\epsilon_r(\omega)=1+\chi(\omega)\) and the refractive index become complex quantities:

\[ n(\omega)=n_r(\omega)-i\kappa(\omega)=\sqrt{\epsilon_r(\omega)}=\sqrt{1+\chi(\omega)} \]

This expands to:

\[ n(\omega)=1+\frac{Nq^2}{2\epsilon_0 m}\frac{(\omega_0^2-\omega^2)-i\sigma\omega}{(\omega_0^2-\omega^2)^2+\omega^2\sigma^2} \]

The real part \(n_r(\omega)\) controls the phase velocity and refraction, while the imaginary part \(\kappa(\omega)\) determines absorption according to the Beer-Lambert law: \(I \propto e^{-2\omega\kappa z/c}\). These components can be written as: \[n_r(\omega) = 1 + A\frac{(\omega_0^2-\omega^2)}{(\omega_0^2-\omega^2)^2+\omega^2\sigma^2}\]

\[\kappa(\omega) = A\frac{\sigma\omega}{(\omega_0^2-\omega^2)^2+\omega^2\sigma^2}\]

where \(A=\frac{Nq^2}{2\epsilon_0 m}\) is a constant that depends on the material’s atomic properties.

Code
N = 1  # Number density
q = 1  # Charge
m = 1  # Mass
epsilon_0 = 1  # Vacuum permittivity
omega_0 = 1  # Resonance frequency
sigma = 0.1  # Damping parameter

omega = np.linspace(0, 2, 1000)

prefactor = N * q**2 / (2 * epsilon_0 * m)

denominator = (omega_0**2 - omega**2)**2 + omega**2 * sigma**2
n_real = 1 + prefactor * (omega_0**2 - omega**2) / denominator
n_imag = prefactor * sigma * omega / denominator

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=get_size(12,7))

# Real part
ax1.plot(omega/omega_0, n_real, 'b-')
ax1.axhline(y=1, color='k', linestyle=':', alpha=0.7)
ax1.axvline(x=1, color='r', linestyle='--', alpha=0.7)
ax1.set_xlabel(r'frequency ($\omega/\omega_0$)')
ax1.set_ylabel(r'real part $n_r(\omega)$')
ax1.grid(alpha=0.3)

# Imaginary part
ax2.plot(omega/omega_0, n_imag, 'r-')
ax2.axhline(y=0, color='k', linestyle=':', alpha=0.7)
ax2.axvline(x=1, color='r', linestyle='--', alpha=0.7)
ax2.set_xlabel(r'frequency ($\omega/\omega_0$)')
ax2.set_ylabel(r'imaginary part $\kappa(\omega)$')

ax2.grid(alpha=0.3)

plt.tight_layout()
plt.show()

Frequency dependence of refractive index near a resonance. The real part shows dispersion behavior around the resonance, while the imaginary part peaks at resonance, corresponding to maximum absorption.

Physical Interpretation and Applications

The plots above reveal how refractive index varies with frequency around a resonance. Below resonance (\(\omega < \omega_0\)), the real part exceeds 1 and increases with frequency (normal dispersion), while absorption remains low. At resonance (\(\omega = \omega_0\)), absorption reaches its maximum as the atoms absorb energy most efficiently, with a \(90°\) phase lag between atomic oscillation and the driving field. Above resonance (\(\omega > \omega_0\)), the real part drops below 1, showing anomalous dispersion.

This behavior explains everyday optical phenomena such as prism dispersion (different colors refracting at different angles), material color (selective absorption of specific wavelengths), and transparency windows (regions between resonances with low absorption).

Real materials typically have multiple resonances across the electromagnetic spectrum. Their susceptibility can be expressed as a sum over all resonances:

\[\chi(\omega) = \sum_j \frac{f_j\omega_{p,j}^2}{\omega_{0,j}^2 - \omega^2 - i\gamma_j\omega}\]

where \(f_j\) is the oscillator strength, \(\omega_{p,j}\) is the plasma frequency, and \(\omega_{0,j}\) is the resonance frequency for the j-th resonance. This extends our understanding from the static case to the full spectral response of materials.

Reflection and Refraction at Interfaces

The Physical Setup

When light hits an interface between two materials, three things can happen:

Figure 3— Reflection and refraction at an interface between materials with refractive indices \(n_1\) and \(n_2\).

We have three waves:

  • Incident: \(\vec{E}_I e^{i(\omega t -\vec{k}_I\cdot \vec{r})}\)
  • Reflected: \(\vec{E}_R e^{i(\omega t -\vec{k}_R\cdot \vec{r})}\)
  • Transmitted: \(\vec{E}_T e^{i(\omega t -\vec{k}_T\cdot \vec{r})}\)

The behavior at interfaces comes from Maxwell’s equations. The key boundary conditions are:

For Electric Fields:

  • Tangential component continuous: \(E_{1||} = E_{2||}\)
  • Normal component jumps: \(\epsilon_1 E_{1\perp} = \epsilon_2 E_{2\perp}\)

For Magnetic Fields:

  • Tangential component continuous: \(H_{1||} = H_{2||}\)
  • Normal component jumps: \(B_{1\perp} = B_{2\perp}\)

Phase matching along the interface requires:

\[\vec{k}_i\cdot \vec{r}=\vec{k}_r\cdot \vec{r}=\vec{k}_t\cdot \vec{r}\]

This gives us:

  1. Law of reflection: \(\theta_i = \theta_r\)
  2. Snell’s law: \(n_1 \sin\theta_i = n_2 \sin\theta_t\)

Fresnel Equations: Quantifying Reflection and Transmission

The boundary conditions lead to the Fresnel equations, which tell us exactly how much light is reflected and transmitted at interfaces between different media. These equations are derived by applying the boundary conditions that electric and magnetic fields must satisfy at the interface.

To derive the Fresnel equations, we need to consider the polarization of the incident light relative to the plane of incidence (the plane containing the incident ray and the surface normal). There are two fundamental polarization cases:

  1. s-polarization (TE or transverse electric): Electric field is perpendicular to the plane of incidence
  2. p-polarization (TM or transverse magnetic): Electric field is parallel to the plane of incidence

Derivation of Fresnel Equations

For s-polarized light, the electric field is perpendicular to the plane of incidence. Applying the boundary condition that the tangential component of the electric field must be continuous:

\[E_i + E_r = E_t\]

And from the boundary condition for the tangential component of the magnetic field:

\[\frac{1}{\mu_1}(k_i\cos\theta_i - k_r\cos\theta_r) = \frac{1}{\mu_2}k_t\cos\theta_t\]

For non-magnetic media (\(\mu_1 = \mu_2 = \mu_0\)) and recognizing that \(k_i = k_r\) and \(\theta_i = \theta_r\), and using \(k = \frac{\omega n}{c}\):

\[n_1\cos\theta_i(E_i - E_r) = n_2\cos\theta_t E_t\]

Solving these equations, we get the Fresnel reflection coefficient for s-polarization:

\[r_s = \frac{E_r}{E_i} = \frac{n_1\cos\theta_i - n_2\cos\theta_t}{n_1\cos\theta_i + n_2\cos\theta_t}\]

And the transmission coefficient:

\[t_s = \frac{E_t}{E_i} = \frac{2n_1\cos\theta_i}{n_1\cos\theta_i + n_2\cos\theta_t}\]

For p-polarized light, the magnetic field is perpendicular to the plane of incidence. A similar derivation using boundary conditions yields:

\[r_p = \frac{n_2\cos\theta_i - n_1\cos\theta_t}{n_2\cos\theta_i + n_1\cos\theta_t}\]

\[t_p = \frac{2n_1\cos\theta_i}{n_2\cos\theta_i + n_1\cos\theta_t}\]

These four equations—the reflection and transmission coefficients for both s and p polarizations—are collectively known as the Fresnel equations. They completely describe the behavior of light at an interface between two isotropic media.

The reflected and transmitted intensities (the observable quantities in experiments) can be calculated as:

\[R_s = |r_s|^2 \quad \text{and} \quad R_p = |r_p|^2\]

\[T_s = \frac{n_2\cos\theta_t}{n_1\cos\theta_i}|t_s|^2 \quad \text{and} \quad T_p = \frac{n_2\cos\theta_t}{n_1\cos\theta_i}|t_p|^2\]

The factors in the transmission coefficients account for the change in propagation speed and beam cross-section when light crosses the boundary. Energy conservation requires that \(R + T = 1\) for a non-absorbing medium.

Code
def reflection_coefficients(n1, n2, theta_i):
    """Calculate Fresnel reflection coefficients for s and p polarizations"""

    # Convert angle to radians if needed
    theta_i_rad = np.radians(theta_i) if np.max(theta_i) > np.pi else theta_i

    # Initialize arrays for results
    r_s = np.zeros_like(theta_i_rad, dtype=complex)
    r_p = np.zeros_like(theta_i_rad, dtype=complex)

    # Calculate for each angle individually to handle TIR properly
    for i, theta_i_val in enumerate(theta_i_rad):
        # Calculate transmission angle using Snell's law
        sin_theta_t = (n1/n2) * np.sin(theta_i_val)

        # Check if we have total internal reflection
        if abs(sin_theta_t) > 1:
            # Total internal reflection - cos(theta_t) is imaginary
            cos_theta_t = 1j * np.sqrt(sin_theta_t**2 - 1)
        else:
            # Normal refraction - cos(theta_t) is real
            cos_theta_t = np.sqrt(1 - sin_theta_t**2)

        cos_theta_i = np.cos(theta_i_val)

        # s-polarized (TE) light
        r_s[i] = (n1*cos_theta_i - n2*cos_theta_t) / (n1*cos_theta_i + n2*cos_theta_t)

        # p-polarized (TM) light
        r_p[i] = (n2*cos_theta_i - n1*cos_theta_t) / (n2*cos_theta_i + n1*cos_theta_t)

    return r_s, r_p

# Parameters
angles = np.linspace(0, 89, 500)  # Incident angles in degrees

# Air to glass
n1_air = 1.0
n2_glass = 1.5
r_s_air_glass, r_p_air_glass = reflection_coefficients(n1_air, n2_glass, angles)

# Glass to air (possibly total internal reflection)
n1_glass = 1.5
n2_air = 1.0
r_s_glass_air, r_p_glass_air = reflection_coefficients(n1_glass, n2_air, angles)

# Calculate magnitudes and phases
mag_r_s_air_glass = np.abs(r_s_air_glass)
mag_r_p_air_glass = np.abs(r_p_air_glass)
mag_r_s_glass_air = np.abs(r_s_glass_air)
mag_r_p_glass_air = np.abs(r_p_glass_air)

phase_r_s_air_glass = np.angle(r_s_air_glass, deg=True)
phase_r_p_air_glass = np.angle(r_p_air_glass, deg=True)
phase_r_s_glass_air = np.angle(r_s_glass_air, deg=True)
phase_r_p_glass_air = np.angle(r_p_glass_air, deg=True)

# Calculate special angles
brewster_air_glass = np.degrees(np.arctan(n2_glass/n1_air))
brewster_glass_air = np.degrees(np.arctan(n2_air/n1_glass))
critical_angle = np.degrees(np.arcsin(n2_air/n1_glass))

# Create figure with 4x2 subplots
fig, axs = plt.subplots(4, 2, figsize=get_size(12, 16))

# Row 1: p-polarization, Air to Glass
# Left: Magnitude
axs[0, 0].plot(angles, mag_r_p_air_glass, 'r-', linewidth=1)
axs[0, 0].set_xlabel('incident angle [°]')
axs[0, 0].set_ylabel(r"$|r_p|$")
axs[0, 0].set_title(r"$|r_p|$ (Air→Glass)")
axs[0, 0].set_xlim(0, 90)
axs[0, 0].set_ylim(0, 1)
axs[0, 0].axvline(brewster_air_glass, color='green', linestyle=':', alpha=0.7)
axs[0, 0].text(brewster_air_glass+1, 0.3, f'θᴮ: {brewster_air_glass:.1f}°',
               rotation=90, ha='left', va='center', color='green', fontsize=8)

# Right: Phase
axs[0, 1].plot(angles, phase_r_p_air_glass, 'r-', linewidth=1)
axs[0, 1].set_xlabel('incident angle [°]')
axs[0, 1].set_ylabel(r"$\phi_p$")
axs[0, 1].set_title(r"$\phi_p$ (Air→Glass)")
axs[0, 1].set_xlim(0, 90)
axs[0, 1].set_ylim(0, 180)
axs[0, 1].axvline(brewster_air_glass, color='green', linestyle=':', alpha=0.7)

# Row 2: s-polarization, Air to Glass
# Left: Magnitude
axs[1, 0].plot(angles, mag_r_s_air_glass, 'b-', linewidth=1)
axs[1, 0].set_xlabel('incident angle [°]')
axs[1, 0].set_ylabel(r"$|r_s|$")
axs[1, 0].set_title(r"$|r_s|$ (Air→Glass)")
axs[1, 0].set_xlim(0, 90)
axs[1, 0].set_ylim(0, 1)

# Right: Phase
axs[1, 1].plot(angles, phase_r_s_air_glass, 'b-', linewidth=1)
axs[1, 1].set_xlabel('incident angle [°]')
axs[1, 1].set_ylabel(r"$\phi_s$")
axs[1, 1].set_title(r"$\phi_s$ (Air→Glass)")
axs[1, 1].set_xlim(0, 90)
axs[1, 1].set_ylim(0, 180)

# Row 3: p-polarization, Glass to Air
# Left: Magnitude
axs[2, 0].plot(angles, mag_r_p_glass_air, 'r-', linewidth=1)
axs[2, 0].set_xlabel('incident angle [°]')
axs[2, 0].set_ylabel(r"$|r_p|$")
axs[2, 0].set_title(r"$|r_p|$ (Glass→Air)")
axs[2, 0].set_xlim(0, 90)
axs[2, 0].set_ylim(0, 1)
axs[2, 0].axvline(brewster_glass_air, color='green', linestyle=':', alpha=0.7)
axs[2, 0].text(brewster_glass_air+1, 0.3, f'θᴮ: {brewster_glass_air:.1f}°',
               rotation=90, ha='left', va='center', color='green', fontsize=8)
axs[2, 0].axvline(critical_angle, color='purple', linestyle=':', alpha=0.7)
axs[2, 0].text(critical_angle+1, 0.7, f'θᶜ: {critical_angle:.1f}°',
               rotation=90, ha='left', va='center', color='purple', fontsize=8)

# Right: Phase
axs[2, 1].plot(angles, np.abs(phase_r_p_glass_air), 'r-', linewidth=1)
axs[2, 1].set_xlabel('incident angle [°]')
axs[2, 1].set_ylabel(r"$\phi_p$")
axs[2, 1].set_title(r"$\phi_p$ (Glass→Air)")
axs[2, 1].set_xlim(0, 90)
axs[2, 1].set_ylim(0, 180)
axs[2, 1].axvline(brewster_glass_air, color='green', linestyle=':', alpha=0.7)
axs[2, 1].axvline(critical_angle, color='purple', linestyle=':', alpha=0.7)

# Row 4: s-polarization, Glass to Air
# Left: Magnitude
axs[3, 0].plot(angles, mag_r_s_glass_air, 'b-', linewidth=1)
axs[3, 0].set_xlabel('incident angle [°]')
axs[3, 0].set_ylabel(r"$|r_s|$")
axs[3, 0].set_title(r"$|r_s|$ (Glass→Air)")
axs[3, 0].set_xlim(0, 90)
axs[3, 0].set_ylim(0, 1)
axs[3, 0].axvline(critical_angle, color='purple', linestyle=':', alpha=0.7)
axs[3, 0].text(critical_angle+1, 0.7, f'θᶜ: {critical_angle:.1f}°',
               rotation=90, ha='left', va='center', color='purple', fontsize=8)

# Right: Phase
axs[3, 1].plot(angles, np.abs(phase_r_s_glass_air), 'b-', linewidth=1)
axs[3, 1].set_xlabel('incident angle [°]')
axs[3, 1].set_ylabel(r"$\phi_s$")
axs[3, 1].set_title(r"$\phi_s$ (Glass→Air)")
axs[3, 1].set_xlim(0, 90)
axs[3, 1].set_ylim(0, 180)
axs[3, 1].axvline(critical_angle, color='purple', linestyle=':', alpha=0.7)

plt.tight_layout()
plt.show()
Figure 4— Magnitude and phase of Fresnel reflection coefficients for air-glass and glass-air interfaces. θᴮ marks the Brewster angle where r_p=0, and θᶜ marks the critical angle where total internal reflection begins.

The following code calculates these coefficients for various angles of incidence:

Key Features of Fresnel Behavior

The Fresnel equations reveal several important phenomena that are central to optical systems and devices.

Normal Incidence

At normal incidence (\(\theta_i = 0\)), both s and p polarization cases become identical, and the reflection coefficient simplifies to:

\[r = \frac{n_1 - n_2}{n_1 + n_2}\]

For an air-glass interface (\(n_1 = 1.0\), \(n_2 = 1.5\)), this gives a reflection of about 4% of the incident intensity. This is why untreated glass reflects approximately 4% of light at each air-glass interface, an important consideration in optical systems like cameras and microscopes where multiple optical elements are used. The intensity loss through a thick glass window with two interfaces would be approximately 8%, which can be significant for precision measurements or energy-sensitive applications.

Brewster’s Angle

A particularly interesting case occurs for p-polarized light at a specific angle called the Brewster angle, given by:

\[\theta_B = \arctan\left(\frac{n_2}{n_1}\right)\]

At this angle, the reflection coefficient \(r_p\) becomes exactly zero, meaning p-polarized light is completely transmitted with no reflection. Physically, this occurs because the reflected and refracted rays would be perpendicular to each other, and since light cannot radiate along the direction of the dipole oscillation, no reflection occurs. This property is utilized in:

  • Polarizing filters (Brewster windows)
  • Laser systems to minimize internal reflections
  • Optical systems where polarization control is important
  • Surface analysis techniques like Brewster angle microscopy

Total Internal Reflection

When light travels from a higher index material to a lower index one (\(n_1 > n_2\)), another important phenomenon occurs. If the angle of incidence exceeds a critical angle:

\[\theta_c = \arcsin\left(\frac{n_2}{n_1}\right)\]

Snell’s law would require \(\sin\theta_t > 1\), which is physically impossible. Instead, all light is reflected back into the first medium with 100% efficiency, a phenomenon known as total internal reflection (TIR).

During TIR, an evanescent wave penetrates a short distance (typically a fraction of a wavelength) into the second medium. This wave carries no energy in the perpendicular direction but creates an electromagnetic field that decays exponentially with distance from the interface:

\[E(x) = E_0 e^{-\kappa x} \quad \text{where} \quad \kappa = k_0\sqrt{n_1^2\sin^2\theta_i - n_2^2}\]

This evanescent field is the basis for techniques like:

  • Optical waveguides and fibers
  • Attenuated total reflection (ATR) spectroscopy
  • Total internal reflection fluorescence (TIRF) microscopy
  • Fiber optic sensors and evanescent wave coupling devices
Code
# Parameters for TIRF
n1 = 1.5  # Glass
n2 = 1.33  # Water
critical_angle = np.degrees(np.arcsin(n2/n1))
wavelength = 500  # nm in vacuum

# Calculate decay length vs. angle
angles = np.linspace(critical_angle+0.1, 89, 200)  # Range of angles above critical angle
decay_lengths = []

for angle in angles:
    theta_rad = np.radians(angle)
    sin_theta = np.sin(theta_rad)
    decay = wavelength/(4*np.pi*np.sqrt((n1*sin_theta/n2)**2 - 1))
    decay_lengths.append(decay)

# Create figure with two subplots
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=get_size(12, 6))

# Plot 1: Field intensity decay from surface
z_values = np.linspace(0, 500, 200)  # Distance from surface (nm)
selected_angles = [critical_angle+1, critical_angle+5, critical_angle+15, 80]
colors = ['blue', 'green', 'orange', 'red']
labels = []

for i, angle in enumerate(selected_angles):
    # Calculate decay length for this angle
    theta_rad = np.radians(angle)
    sin_theta = np.sin(theta_rad)
    decay_length = wavelength/(4*np.pi*np.sqrt((n1*sin_theta/n2)**2 - 1))

    # Calculate intensity vs distance
    intensity = np.exp(-z_values/decay_length)

    # Plot the decay curve
    ax1.plot(z_values, intensity, color=colors[i],
             label=f'{angle:.1f}°')

ax1.set_xlabel('Distance from Interface (nm)')
ax1.set_ylabel('Relative Intensity')
ax1.legend()
ax1.set_ylim(0, 1.05)
ax1.set_xlim(0, 500)

# Plot 2: Decay length vs angle (original plot)
ax2.plot(angles, decay_lengths, 'r-')
ax2.set_xlabel('Incident Angle (degrees)')
ax2.set_ylabel('Decay Length (nm)')

# Add reference line for critical angle
ax2.axvline(critical_angle, color='blue', linestyle='--', alpha=0.7)

ax2.set_ylim(0, 1000)
plt.tight_layout()
plt.show()
Figure 5— Evanescent wave characteristics in TIRF microscopy

1. Brewster Angle Microscopy (BAM)

At the Brewster angle, p-polarized light experiences zero reflection from a clean interface. Any surface contamination changes this condition, enabling sensitive detection of monolayers.

Applications: - Langmuir film characterization - Surface contamination detection - Biological membrane studies

Code
# Define range of refractive indices
n_values = np.linspace(1.0, 3.0, 200)
# Calculate Brewster angle (air to medium)
brewster_angles = np.degrees(np.arctan(n_values))

# Material reference points
materials = [
    ('Water', 1.33, 'blue'),
    ('Glass', 1.5, 'green'),
    ('Diamond', 2.4, 'red')
]

fig, ax = plt.subplots(figsize=get_size(8,6))

# Plot Brewster angle as function of refractive index
ax.plot(n_values, brewster_angles, 'k-', label='Brewster Angle')

# Add vertical lines for specific materials
for name, n, color in materials:
    angle = np.degrees(np.arctan(n))
    ax.axvline(n, color=color, linestyle='--', alpha=0.7)

ax.set_xlabel('Refractive Index (n)')
ax.set_ylabel('Brewster Angle (degrees)')
ax.set_xlim(1.0, 3.0)
ax.set_ylim(40, 80)

plt.tight_layout()
plt.show()
Figure 6— Brewster angle as a function of refractive index for air-medium interfaces. Vertical dashed lines mark specific materials: Water (blue, \(n=1.33\), \(\theta_B=53.1^{°}\)), Glass (green, \(n=1.5\), \(\theta_B=56.3^{°}\)), and Diamond (red, \(n=2.4\), \(\theta_B=67.4^{°}\)).

2. Total Internal Reflection Fluorescence (TIRF) Microscopy

When total internal reflection occurs (\(n_1 > n_2\) and \(\sin\theta_i > n_2/n_1\)), the transmission angle becomes complex:

\[\theta_t = \arcsin\left(\frac{n_1}{n_2}\sin\theta_i\right) = \frac{\pi}{2} + i\,\text{arcsinh}\left(\sqrt{\frac{n_1^2\sin^2\theta_i}{n_2^2}-1}\right)\]

In this case, the reflection coefficients become complex with unit magnitude (\(|r|^2 = 1\)), meaning 100% of the light is reflected but with a phase shift. This phase shift depends on polarization and is the basis for many optical devices and phenomena.

When light undergoes total internal reflection, an evanescent wave penetrates into the second medium. This wave’s intensity decays exponentially with distance from the interface according to:

\[I(z) = I_0 e^{-z/d}\]

Where the characteristic decay length \(d\) is given by:

\[d = \frac{\lambda}{4\pi\sqrt{n_1^2\sin^2\theta_i - n_2^2}}\]

This decay length has several important dependencies:

  • It increases with wavelength (\(\lambda\))
  • It decreases as the incident angle increases above the critical angle
  • It shortens with larger differences between the refractive indices
  • It approaches infinity at the critical angle and decreases rapidly as \(\theta_i\) increases

This tunable penetration depth enables:

  • Selective excitation of fluorophores near surfaces
  • High contrast imaging by eliminating background fluorescence
  • Single molecule detection with exceptional signal-to-noise ratio
Code
# Parameters for TIRF
n1 = 1.5  # Glass
n2 = 1.33  # Water
critical_angle = np.degrees(np.arcsin(n2/n1))
wavelength = 500  # nm in vacuum

# Calculate decay length vs. angle
angles = np.linspace(critical_angle+0.1, 89, 200)  # Range of angles above critical angle
decay_lengths = []

for angle in angles:
    theta_rad = np.radians(angle)
    sin_theta = np.sin(theta_rad)
    decay = wavelength/(4*np.pi*np.sqrt((n1*sin_theta/n2)**2 - 1))
    decay_lengths.append(decay)

# Create figure with two subplots
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=get_size(12, 6))

# Plot 1: Field intensity decay from surface
z_values = np.linspace(0, 500, 200)  # Distance from surface (nm)
selected_angles = [critical_angle+1, critical_angle+5, critical_angle+15, 80]
colors = ['blue', 'green', 'orange', 'red']
labels = []

for i, angle in enumerate(selected_angles):
    # Calculate decay length for this angle
    theta_rad = np.radians(angle)
    sin_theta = np.sin(theta_rad)
    decay_length = wavelength/(4*np.pi*np.sqrt((n1*sin_theta/n2)**2 - 1))

    # Calculate intensity vs distance
    intensity = np.exp(-z_values/decay_length)

    # Plot the decay curve
    ax1.plot(z_values, intensity, color=colors[i],
             label=f'{angle:.1f}°')

ax1.set_xlabel('Distance from Interface (nm)')
ax1.set_ylabel('Relative Intensity')
ax1.legend()
ax1.set_ylim(0, 1.05)
ax1.set_xlim(0, 500)

# Plot 2: Decay length vs angle (original plot)
ax2.plot(angles, decay_lengths, 'r-')
ax2.set_xlabel('Incident Angle (degrees)')
ax2.set_ylabel('Decay Length (nm)')

# Add reference line for critical angle
ax2.axvline(critical_angle, color='blue', linestyle='--', alpha=0.7)

ax2.set_ylim(0, 1000)
plt.tight_layout()
plt.show()
Figure 7— Evanescent wave characteristics in TIRF microscopy

3. Antireflection Coatings

By depositing thin films with specific thickness and refractive index, we can minimize reflections:

For a quarter-wave coating: \(n_{\text{coating}} = \sqrt{n_1 n_2}\) and \(t = \lambda/(4n_{\text{coating}})\)

Code
def reflectance_with_coating(wavelength, n0, n1, n2, thickness):
    """Calculate reflectance with single-layer coating"""
    k1 = 2*np.pi*n1/wavelength
    delta = k1 * thickness

    # Complex reflection coefficient for three layers
    r01 = (n0 - n1)/(n0 + n1)
    r12 = (n1 - n2)/(n1 + n2)

    r = (r01 + r12*np.exp(2j*delta))/(1 + r01*r12*np.exp(2j*delta))
    return np.abs(r)**2

# Parameters
wavelengths = np.linspace(400, 800, 200)
n0 = 1.0    # Air
n2 = 1.5    # Glass
n1_optimal = np.sqrt(n0 * n2)  # Optimal coating index
thickness = 550/(4*n1_optimal)  # Quarter wave at 550 nm

# Calculate reflectance
R_uncoated = np.abs((n0-n2)/(n0+n2))**2 * np.ones_like(wavelengths)
R_coated = [reflectance_with_coating(wl, n0, n1_optimal, n2, thickness) for wl in wavelengths]

fig, ax = plt.subplots(figsize=get_size(8, 6))
ax.plot(wavelengths, 100*R_uncoated, 'r-',  label='Uncoated Glass')
ax.plot(wavelengths, 100*np.array(R_coated), 'b-', label='AR Coated Glass')
ax.set_xlabel('Wavelength (nm)')
ax.set_ylabel('Reflectance (%)')
ax.legend()
ax.set_xlim(400, 800)

plt.tight_layout()
plt.show()
Figure 8— Effect of antireflection coating

4. Metamaterials and Negative Refraction

Engineered structures can exhibit negative refractive indices when both \(\epsilon < 0\) and \(\mu < 0\):

Figure 9— Split-ring resonators provide negative permeability while metallic wires provide negative permittivity, enabling negative refraction.

Applications: - Superlenses (resolution beyond diffraction limit) - Electromagnetic cloaking - Novel waveguiding