🌐 EN | 🇯🇵 JP | Last sync: 2025-11-16

Chapter 2: Hall Effect Measurement

From the Lorentz Force to van der Pauw Hall Configurations, Multi-Carrier Analysis, and Temperature Dependence

📖 Reading time: 45-55 minutes 📊 Difficulty: Intermediate 💻 Code examples: 7

The Hall effect is a powerful technique that uses the deflection of charge carriers in a magnetic field to determine carrier density, carrier type (electron or hole), and mobility. In this chapter, you will learn the theory of the Hall effect based on the Lorentz force, the relationship between the Hall coefficient and carrier density, the van der Pauw Hall measurement configuration, analysis of multi-carrier systems, and how carrier scattering mechanisms can be revealed through temperature dependence, and you will perform practical Hall data analysis in Python.

Learning Objectives

By reading this chapter, you will be able to:

2.1 Theory of the Hall Effect

2.1.1 Lorentz Force and Hall Voltage

The Hall effect (discovered by Edwin Herbert Hall in 1879) is the phenomenon in which, when a magnetic field is applied perpendicular to a conductor carrying a current, a voltage develops in the direction perpendicular to both the current and the magnetic field.

flowchart TD A[Current I
x direction] --> B[Magnetic field B
z direction] B --> C[Lorentz force
F = -e v × B] C --> D[Carrier deflection
y direction] D --> E[Hall voltage V_H
develops in y direction] style A fill:#99ccff,stroke:#0066cc,stroke-width:2px style B fill:#99ff99,stroke:#00cc00,stroke-width:2px style C fill:#ffeb99,stroke:#ffa500,stroke-width:2px style D fill:#ff9999,stroke:#ff0000,stroke-width:2px style E fill:#f093fb,stroke:#f5576c,stroke-width:2px,color:#fff

Physical mechanism:

  1. When a current $I$ flows through the conductor, the carriers (electrons) move in the x direction with drift velocity $v_x$
  2. When a magnetic field $B_z$ is applied in the z direction, the Lorentz force $\vec{F} = q\vec{v} \times \vec{B}$ acts on the carriers
  3. The electrons ($q = -e$) are deflected in the y direction and accumulate on one side of the sample
  4. This charge accumulation produces a Hall electric field $E_y$
  5. At steady state, the Lorentz force and the electric-field force balance: $eE_y = ev_x B_z$

Deriving the Hall voltage:

Let the sample width be $w$, thickness $t$, and current $I$. The current density is then:

$$ j_x = \frac{I}{wt} $$

If the carrier density is $n$, the relationship between current density and drift velocity is:

$$ j_x = nev_x \quad \Rightarrow \quad v_x = \frac{j_x}{ne} = \frac{I}{newt} $$

From the steady-state force balance:

$$ E_y = v_x B_z = \frac{IB_z}{newt} $$

The Hall voltage $V_H$ is the electric field integrated across the sample width $w$:

$$ V_H = E_y \cdot w = \frac{IB_z}{net} $$

The Hall coefficient $R_H$ is defined as:

$$ R_H = \frac{E_y}{j_x B_z} = \frac{V_H t}{IB_z} = \frac{1}{ne} $$

Therefore, the carrier density $n$ can be obtained directly from the Hall coefficient:

$$ n = \frac{1}{eR_H} $$

2.1.2 Determining Carrier Type

The sign of the Hall coefficient tells us whether the carriers are electrons or holes:

Carrier Type Hall Coefficient $R_H$ Sign of Hall Voltage Physical Interpretation
Electron (n-type) $R_H < 0$ Negative Electrons carry negative charge
Hole (p-type) $R_H > 0$ Positive Holes carry positive charge

Code Example 2-1: Calculating the Hall Coefficient and Carrier Density

import numpy as np
import matplotlib.pyplot as plt

def calculate_hall_coefficient(V_H, I, B, t):
    """
    Calculate the Hall coefficient

    Parameters
    ----------
    V_H : float
        Hall voltage [V]
    I : float
        Current [A]
    B : float
        Magnetic field [T]
    t : float
        Sample thickness [m]

    Returns
    -------
    R_H : float
        Hall coefficient [m^3/C]
    """
    R_H = V_H * t / (I * B)
    return R_H

def calculate_carrier_density(R_H):
    """
    Calculate the carrier density

    Parameters
    ----------
    R_H : float
        Hall coefficient [m^3/C]

    Returns
    -------
    n : float
        Carrier density [m^-3]
    carrier_type : str
        Carrier type ('electron' or 'hole')
    """
    e = 1.60218e-19  # Elementary charge [C]
    n = 1 / (np.abs(R_H) * e)
    carrier_type = 'electron' if R_H < 0 else 'hole'
    return n, carrier_type

# Measurement example 1: n-type silicon
V_H1 = -2.5e-3  # Hall voltage [V] (negative: electron)
I1 = 1e-3  # Current [A]
B1 = 0.5  # Magnetic field [T]
t1 = 500e-9  # Thickness [m] = 500 nm

R_H1 = calculate_hall_coefficient(V_H1, I1, B1, t1)
n1, type1 = calculate_carrier_density(R_H1)

print("Measurement example 1: n-type silicon")
print(f"  Hall voltage: {V_H1 * 1e3:.2f} mV")
print(f"  Hall coefficient: {R_H1:.3e} m³/C")
print(f"  Carrier type: {type1}")
print(f"  Carrier density: {n1:.3e} m⁻³ = {n1 / 1e6:.3e} cm⁻³")

# Measurement example 2: p-type gallium arsenide
V_H2 = +3.8e-3  # Hall voltage [V] (positive: hole)
I2 = 1e-3  # Current [A]
B2 = 0.5  # Magnetic field [T]
t2 = 300e-9  # Thickness [m] = 300 nm

R_H2 = calculate_hall_coefficient(V_H2, I2, B2, t2)
n2, type2 = calculate_carrier_density(R_H2)

print("\nMeasurement example 2: p-type gallium arsenide")
print(f"  Hall voltage: {V_H2 * 1e3:.2f} mV")
print(f"  Hall coefficient: {R_H2:.3e} m³/C")
print(f"  Carrier type: {type2}")
print(f"  Carrier density: {n2:.3e} m⁻³ = {n2 / 1e6:.3e} cm⁻³")

# Visualize the dependence on carrier density
n_range = np.logspace(20, 28, 100)  # [m^-3]
R_H_range = 1 / (n_range * 1.60218e-19)

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 5))

# Left panel: n vs R_H
ax1.loglog(n_range / 1e6, np.abs(R_H_range), linewidth=2.5, color='#f093fb', label='|R_H| = 1/(ne)')
ax1.scatter([n1 / 1e6], [np.abs(R_H1)], s=150, c='#f5576c', edgecolors='black', linewidth=2, zorder=5, label='n-Si (example 1)')
ax1.scatter([n2 / 1e6], [np.abs(R_H2)], s=150, c='#ffa500', edgecolors='black', linewidth=2, zorder=5, label='p-GaAs (example 2)')
ax1.set_xlabel('Carrier Density n [cm$^{-3}$]', fontsize=12)
ax1.set_ylabel('|Hall Coefficient R$_H$| [m$^3$/C]', fontsize=12)
ax1.set_title('Hall Coefficient vs Carrier Density', fontsize=14, fontweight='bold')
ax1.legend(fontsize=11)
ax1.grid(alpha=0.3, which='both')

# Right panel: magnetic-field dependence of the Hall voltage
B_range = np.linspace(0, 1, 100)  # [T]
V_H_n = R_H1 * I1 * B_range / t1 * 1e3  # n-type [mV]
V_H_p = R_H2 * I2 * B_range / t2 * 1e3  # p-type [mV]

ax2.plot(B_range, V_H_n, linewidth=2.5, color='#f5576c', label='n-type (electron, R_H < 0)')
ax2.plot(B_range, V_H_p, linewidth=2.5, color='#ffa500', label='p-type (hole, R_H > 0)')
ax2.axhline(0, color='black', linestyle='--', linewidth=1.5)
ax2.set_xlabel('Magnetic Field B [T]', fontsize=12)
ax2.set_ylabel('Hall Voltage V$_H$ [mV]', fontsize=12)
ax2.set_title('Hall Voltage vs Magnetic Field', fontsize=14, fontweight='bold')
ax2.legend(fontsize=11)
ax2.grid(alpha=0.3)

plt.tight_layout()
plt.show()

2.2 Determining the Mobility

2.2.1 Relationship Between Mobility and the Hall Coefficient

The mobility $\mu$ is obtained from the electrical conductivity $\sigma$ and the Hall coefficient $R_H$:

$$ \mu = \sigma R_H $$

This follows directly from $\sigma = ne\mu$ and $R_H = 1/(ne)$.

Physical meaning:

Code Example 2-2: Calculating Mobility

import numpy as np

def calculate_mobility(sigma, R_H):
    """
    Calculate the mobility

    Parameters
    ----------
    sigma : float
        Electrical conductivity [S/m]
    R_H : float
        Hall coefficient [m^3/C]

    Returns
    -------
    mu : float
        Mobility [m^2/(V·s)]
    """
    mu = sigma * np.abs(R_H)
    return mu

# Measurement example: n-type silicon (from the previous example)
R_H = -2.5e-3  # [m^3/C]
sigma = 1e4  # Electrical conductivity [S/m] (typical value)

mu = calculate_mobility(sigma, R_H)

e = 1.60218e-19  # [C]
n = 1 / (np.abs(R_H) * e)

print("Electrical properties of n-type silicon:")
print(f"  Conductivity σ = {sigma:.2e} S/m")
print(f"  Hall coefficient R_H = {R_H:.2e} m³/C")
print(f"  Carrier density n = {n:.2e} m⁻³ = {n / 1e6:.2e} cm⁻³")
print(f"  Mobility μ = {mu:.2e} m²/(V·s) = {mu * 1e4:.1f} cm²/(V·s)")
print(f"\nVerification: σ = neμ = {n * e * mu:.2e} S/m (matches)")

# Comparison across materials
materials = {
    'Si (bulk, n-type)': {'sigma': 1e4, 'R_H': -2.5e-3},
    'GaAs (bulk, n-type)': {'sigma': 1e5, 'R_H': -5e-3},
    'InSb (n-type)': {'sigma': 1e6, 'R_H': -1e-2},
    'Graphene': {'sigma': 1e5, 'R_H': -1e-4}
}

print("\nMaterial comparison:")
print(f"{'Material':<25} {'n [cm⁻³]':<15} {'μ [cm²/(V·s)]':<20}")
print("-" * 60)

for name, props in materials.items():
    n_mat = 1 / (np.abs(props['R_H']) * e)
    mu_mat = calculate_mobility(props['sigma'], props['R_H'])
    print(f"{name:<25} {n_mat / 1e6:.2e}      {mu_mat * 1e4:.1f}")

Interpreting the output:

2.3 van der Pauw Hall Measurement Configuration

2.3.1 Eight-Contact van der Pauw Hall Configuration

The van der Pauw Hall measurement is a standard technique for measuring the Hall effect on thin-film samples of arbitrary shape. Combined with the sheet resistance measurement covered in Chapter 1, it allows a single sample to yield all of $\sigma$, $R_H$, $n$, and $\mu$.

flowchart TD A[Sample preparation
8 contacts at the 4 corners] --> B[Sheet resistance measurement
R_AB,CD, R_BC,DA] B --> C[Compute sheet resistance R_s
van der Pauw equation] C --> D[Hall measurement
apply magnetic field B] D --> E[Measure Hall voltage V_H
with current I] E --> F[Compute Hall coefficient R_H
R_H = V_H t / IB] F --> G[Carrier density n
n = 1/eR_H] F --> H[Mobility μ
μ = σR_H] style A fill:#99ccff,stroke:#0066cc,stroke-width:2px style C fill:#ffeb99,stroke:#ffa500,stroke-width:2px style F fill:#f093fb,stroke:#f5576c,stroke-width:2px,color:#fff style G fill:#99ff99,stroke:#00cc00,stroke-width:2px style H fill:#99ff99,stroke:#00cc00,stroke-width:2px

Measurement procedure:

  1. Sheet resistance measurement (no magnetic field, B = 0):
    • Pass current from contact 1 to 2, measure the voltage between 3 and 4 → $R_{12,34}$
    • Pass current from contact 2 to 3, measure the voltage between 4 and 1 → $R_{23,41}$
    • Compute $R_s$ using the van der Pauw equation
  2. Hall measurement (apply magnetic field B, e.g., B = +0.5 T):
    • Pass current $I$ from contact 1 to 3, measure the voltage $V_{24}^{+B}$ between 2 and 4
    • Reverse the field (B = -0.5 T) and measure $V_{24}^{-B}$ with the same current
    • Hall voltage: $V_H = \frac{1}{2}(V_{24}^{+B} - V_{24}^{-B})$
    • Hall coefficient: $R_H = \frac{V_H t}{IB}$
  3. Deriving the electrical properties:
    • Electrical conductivity: $\sigma = \frac{1}{R_s t}$
    • Carrier density: $n = \frac{1}{eR_H}$
    • Mobility: $\mu = \sigma R_H$
Important: The reason the measurement is repeated with the magnetic field reversed is to cancel out offset voltages (arising from thermoelectric effects and inhomogeneity). The Hall voltage is an odd function of the magnetic field ($V_H(B) = -V_H(-B)$), while offset voltages are even functions, so taking the difference isolates the pure Hall voltage.

Code Example 2-3: Simulating a van der Pauw Hall Measurement

import numpy as np
from scipy.optimize import fsolve

def van_der_pauw_sheet_resistance(R1, R2):
    """Calculate the sheet resistance using the van der Pauw equation"""
    def equation(Rs):
        return np.exp(-np.pi * R1 / Rs) + np.exp(-np.pi * R2 / Rs) - 1

    R_initial = (R1 + R2) / 2 * np.pi / np.log(2)
    R_s = fsolve(equation, R_initial)[0]
    return R_s

def complete_hall_analysis(R_AB_CD, R_BC_DA, V_24_pos_B, V_24_neg_B, I, B, t):
    """
    Complete van der Pauw Hall analysis

    Parameters
    ----------
    R_AB_CD, R_BC_DA : float
        van der Pauw resistances [Ω]
    V_24_pos_B, V_24_neg_B : float
        Hall voltage under positive and negative magnetic field [V]
    I : float
        Current [A]
    B : float
        Magnitude of the magnetic field [T]
    t : float
        Sample thickness [m]

    Returns
    -------
    results : dict
        Analysis results (R_s, sigma, R_H, n, mu)
    """
    e = 1.60218e-19  # [C]

    # 1. Sheet resistance
    R_s = van_der_pauw_sheet_resistance(R_AB_CD, R_BC_DA)

    # 2. Electrical conductivity
    sigma = 1 / (R_s * t)

    # 3. Hall voltage (offset removed)
    V_H = 0.5 * (V_24_pos_B - V_24_neg_B)

    # 4. Hall coefficient
    R_H = V_H * t / (I * B)

    # 5. Carrier density
    n = 1 / (np.abs(R_H) * e)
    carrier_type = 'electron' if R_H < 0 else 'hole'

    # 6. Mobility
    mu = sigma * np.abs(R_H)

    results = {
        'R_s': R_s,
        'sigma': sigma,
        'rho': 1 / sigma,
        'V_H': V_H,
        'R_H': R_H,
        'n': n,
        'carrier_type': carrier_type,
        'mu': mu
    }

    return results

# Example measurement data: n-type silicon thin film
R_AB_CD = 1000  # [Ω]
R_BC_DA = 950   # [Ω]
V_24_plus = -5.2e-3  # Voltage at +B [V]
V_24_minus = +4.8e-3  # Voltage at -B [V]
I = 100e-6  # Current [A] = 100 μA
B = 0.5  # Magnetic field [T]
t = 200e-9  # Thickness [m] = 200 nm

results = complete_hall_analysis(R_AB_CD, R_BC_DA, V_24_plus, V_24_minus, I, B, t)

print("van der Pauw Hall measurement analysis results:")
print("=" * 60)
print(f"Measurement conditions:")
print(f"  R_AB,CD = {R_AB_CD:.1f} Ω")
print(f"  R_BC,DA = {R_BC_DA:.1f} Ω")
print(f"  V_24(+B) = {V_24_plus * 1e3:.2f} mV")
print(f"  V_24(-B) = {V_24_minus * 1e3:.2f} mV")
print(f"  Current I = {I * 1e6:.1f} μA")
print(f"  Magnetic field B = ±{B:.2f} T")
print(f"  Thickness t = {t * 1e9:.0f} nm")
print("\nAnalysis results:")
print(f"  Sheet resistance R_s = {results['R_s']:.2f} Ω/sq")
print(f"  Conductivity σ = {results['sigma']:.2e} S/m")
print(f"  Resistivity ρ = {results['rho']:.2e} Ω·m = {results['rho'] * 1e8:.2f} μΩ·cm")
print(f"  Hall voltage V_H = {results['V_H'] * 1e3:.2f} mV")
print(f"  Hall coefficient R_H = {results['R_H']:.2e} m³/C")
print(f"  Carrier type: {results['carrier_type']}")
print(f"  Carrier density n = {results['n']:.2e} m⁻³ = {results['n'] / 1e6:.2e} cm⁻³")
print(f"  Mobility μ = {results['mu']:.2e} m²/(V·s) = {results['mu'] * 1e4:.1f} cm²/(V·s)")
print("\nVerification:")
print(f"  σ = neμ = {results['n'] * 1.60218e-19 * results['mu']:.2e} S/m")
print(f"  (matches the computed σ = {results['sigma']:.2e} S/m)")

2.4 Multi-Carrier Analysis (Two-Band Model)

2.4.1 Theory of Two-Carrier Systems

In semiconductors, both electrons and holes can sometimes contribute to conduction (for example, in narrow-bandgap semiconductors such as InSb and HgCdTe). In such cases a simple single-band model is insufficient, and the two-band model is required.

Electrical conductivity (two carriers):

$$ \sigma = n_e e \mu_e + n_h e \mu_h $$

Hall coefficient (two carriers):

$$ R_H = \frac{n_h \mu_h^2 - n_e \mu_e^2}{e(n_h \mu_h + n_e \mu_e)^2} $$

Here $n_e$ and $\mu_e$ are the electron carrier density and mobility, and $n_h$ and $\mu_h$ are the hole carrier density and mobility.

Physical interpretation:

Code Example 2-4: Fitting the Two-Band Model

import numpy as np
import matplotlib.pyplot as plt
from lmfit import Model

def two_band_conductivity(n_e, mu_e, n_h, mu_h):
    """Electrical conductivity in the two-band model"""
    e = 1.60218e-19
    sigma = n_e * e * mu_e + n_h * e * mu_h
    return sigma

def two_band_hall_coefficient(n_e, mu_e, n_h, mu_h):
    """Hall coefficient in the two-band model"""
    e = 1.60218e-19
    numerator = n_h * mu_h**2 - n_e * mu_e**2
    denominator = (n_h * mu_h + n_e * mu_e)**2
    R_H = numerator / (e * denominator)
    return R_H

# Simulation: InSb (a system with coexisting electrons and holes)
T_range = np.linspace(200, 400, 50)  # Temperature [K]

# Temperature dependence (simplified)
n_e = 1e22 * np.exp(-0.1 / (8.617e-5 * T_range))  # Electron density [m^-3]
n_h = 5e21 * np.exp(-0.08 / (8.617e-5 * T_range))  # Hole density [m^-3]
mu_e = 7e4 * (300 / T_range)**1.5 * 1e-4  # Electron mobility [m^2/(V·s)]
mu_h = 1e3 * (300 / T_range)**2.5 * 1e-4  # Hole mobility [m^2/(V·s)]

sigma = two_band_conductivity(n_e, mu_e, n_h, mu_h)
R_H = two_band_hall_coefficient(n_e, mu_e, n_h, mu_h)

# Plotting
fig, axes = plt.subplots(2, 2, figsize=(14, 10))

# Top left: carrier densities
axes[0, 0].semilogy(T_range, n_e / 1e6, linewidth=2.5, label='Electron density n$_e$', color='#f5576c')
axes[0, 0].semilogy(T_range, n_h / 1e6, linewidth=2.5, label='Hole density n$_h$', color='#ffa500')
axes[0, 0].set_xlabel('Temperature T [K]', fontsize=12)
axes[0, 0].set_ylabel('Carrier Density [cm$^{-3}$]', fontsize=12)
axes[0, 0].set_title('Carrier Densities (Two-Band Model)', fontsize=13, fontweight='bold')
axes[0, 0].legend(fontsize=11)
axes[0, 0].grid(alpha=0.3)

# Top right: mobilities
axes[0, 1].loglog(T_range, mu_e * 1e4, linewidth=2.5, label='Electron mobility μ$_e$', color='#f5576c')
axes[0, 1].loglog(T_range, mu_h * 1e4, linewidth=2.5, label='Hole mobility μ$_h$', color='#ffa500')
axes[0, 1].set_xlabel('Temperature T [K]', fontsize=12)
axes[0, 1].set_ylabel('Mobility [cm$^2$/(V·s)]', fontsize=12)
axes[0, 1].set_title('Mobilities (Temperature Dependence)', fontsize=13, fontweight='bold')
axes[0, 1].legend(fontsize=11)
axes[0, 1].grid(alpha=0.3, which='both')

# Bottom left: electrical conductivity
axes[1, 0].semilogy(T_range, sigma, linewidth=2.5, color='#f093fb')
axes[1, 0].set_xlabel('Temperature T [K]', fontsize=12)
axes[1, 0].set_ylabel('Conductivity σ [S/m]', fontsize=12)
axes[1, 0].set_title('Electrical Conductivity', fontsize=13, fontweight='bold')
axes[1, 0].grid(alpha=0.3)

# Bottom right: Hall coefficient
axes[1, 1].plot(T_range, R_H, linewidth=2.5, color='#f093fb')
axes[1, 1].axhline(0, color='black', linestyle='--', linewidth=1.5)
axes[1, 1].set_xlabel('Temperature T [K]', fontsize=12)
axes[1, 1].set_ylabel('Hall Coefficient R$_H$ [m$^3$/C]', fontsize=12)
axes[1, 1].set_title('Hall Coefficient (Sign Change)', fontsize=13, fontweight='bold')
axes[1, 1].grid(alpha=0.3)

plt.tight_layout()
plt.show()

# Detect the temperature at which the Hall coefficient changes sign
sign_change_idx = np.where(np.diff(np.sign(R_H)))[0]
if len(sign_change_idx) > 0:
    T_sign_change = T_range[sign_change_idx[0]]
    print(f"\nHall coefficient sign-change temperature: {T_sign_change:.1f} K")
    print("  → Low temperature: R_H < 0 (electrons dominate)")
    print("  → High temperature: R_H > 0 (holes dominate)")

2.5 Temperature-Dependent Hall Measurements

2.5.1 Analyzing Carrier Scattering Mechanisms

The temperature dependence of the mobility lets us identify the dominant carrier scattering mechanism:

Scattering Mechanism Temperature Dependence of Mobility Dominant Temperature Range Example Materials
Acoustic phonon scattering $\mu \propto T^{-3/2}$ Room temperature and above Si, GaAs (high temperature)
Ionized impurity scattering $\mu \propto T^{3/2}$ Low temperature (< 100 K) Doped semiconductors
Optical phonon scattering Complex (temperature-dependent) High temperature Polar semiconductors (GaAs)
Neutral impurity scattering $\mu \approx$ constant Low temperature Heavily doped materials

Matthiessen's rule (mobility version):

$$ \frac{1}{\mu_{\text{total}}} = \frac{1}{\mu_{\text{phonon}}} + \frac{1}{\mu_{\text{impurity}}} + \frac{1}{\mu_{\text{other}}} $$

Code Example 2-5: Analyzing Temperature-Dependent Hall Measurements

import numpy as np
import matplotlib.pyplot as plt
from lmfit import Model

# Acoustic phonon scattering model
def acoustic_phonon_mobility(T, mu0, T0=300):
    """μ ∝ T^(-3/2)"""
    return mu0 * (T0 / T)**(3/2)

# Ionized impurity scattering model
def ionized_impurity_mobility(T, mu1, T0=300):
    """μ ∝ T^(3/2)"""
    return mu1 * (T / T0)**(3/2)

# Matthiessen's rule
def combined_mobility(T, mu0, mu1, T0=300):
    """1/μ_total = 1/μ_phonon + 1/μ_impurity"""
    mu_phonon = acoustic_phonon_mobility(T, mu0, T0)
    mu_impurity = ionized_impurity_mobility(T, mu1, T0)
    mu_total = 1 / (1/mu_phonon + 1/mu_impurity)
    return mu_total

# Generate simulated data
T_range = np.linspace(50, 400, 30)  # [K]
mu0_true = 8000  # Phonon-limited mobility (room temperature) [cm^2/(V·s)]
mu1_true = 2000  # Impurity-limited mobility (room temperature) [cm^2/(V·s)]

mu_data = combined_mobility(T_range, mu0_true, mu1_true)
mu_data_noise = mu_data * (1 + 0.05 * np.random.randn(len(T_range)))  # 5% noise

# Fitting
model = Model(combined_mobility)
params = model.make_params(mu0=5000, mu1=3000, T0=300)
params['T0'].vary = False  # Fix T0

result = model.fit(mu_data_noise, params, T=T_range)

print("Temperature-dependent Hall measurement fitting results:")
print(result.fit_report())

# Compute the contribution of each scattering mechanism
mu_phonon_fit = acoustic_phonon_mobility(T_range, result.params['mu0'].value)
mu_impurity_fit = ionized_impurity_mobility(T_range, result.params['mu1'].value)

# Plotting
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))

# Left panel: mobility vs temperature
ax1.scatter(T_range, mu_data_noise, s=80, alpha=0.7, edgecolors='black', linewidths=1.5, label='Measured data', color='#f093fb')
ax1.plot(T_range, result.best_fit, linewidth=2.5, label='Fit (Matthiessen)', color='#f5576c')
ax1.plot(T_range, mu_phonon_fit, linewidth=2, linestyle='--', label='Phonon scattering (T$^{-3/2}$)', color='#ffa500')
ax1.plot(T_range, mu_impurity_fit, linewidth=2, linestyle=':', label='Impurity scattering (T$^{3/2}$)', color='#99ccff')
ax1.set_xlabel('Temperature T [K]', fontsize=12)
ax1.set_ylabel('Mobility μ [cm$^2$/(V·s)]', fontsize=12)
ax1.set_title('Temperature-Dependent Hall Mobility', fontsize=14, fontweight='bold')
ax1.legend(fontsize=10)
ax1.grid(alpha=0.3)
ax1.set_yscale('log')

# Right panel: scattering rate (1/μ) vs temperature
ax2.scatter(T_range, 1/mu_data_noise, s=80, alpha=0.7, edgecolors='black', linewidths=1.5, label='Data (1/μ)', color='#f093fb')
ax2.plot(T_range, 1/mu_phonon_fit, linewidth=2.5, label='Phonon (1/μ$_{ph}$)', color='#ffa500')
ax2.plot(T_range, 1/mu_impurity_fit, linewidth=2.5, label='Impurity (1/μ$_{imp}$)', color='#99ccff')
ax2.plot(T_range, 1/result.best_fit, linewidth=2.5, label='Total (sum)', color='#f5576c', linestyle='--')
ax2.set_xlabel('Temperature T [K]', fontsize=12)
ax2.set_ylabel('Scattering Rate 1/μ [V·s/cm$^2$]', fontsize=12)
ax2.set_title('Matthiessen Rule: Scattering Rate Analysis', fontsize=14, fontweight='bold')
ax2.legend(fontsize=10)
ax2.grid(alpha=0.3)

plt.tight_layout()
plt.show()

# Interpreting the results
print(f"\nScattering mechanism analysis:")
print(f"  Phonon-limited mobility (room temperature): {result.params['mu0'].value:.1f} cm²/(V·s)")
print(f"  Impurity-limited mobility (room temperature): {result.params['mu1'].value:.1f} cm²/(V·s)")
print(f"\nDominant scattering mechanism:")
print(f"  Low temperature (< 150 K): impurity scattering (μ ∝ T^(3/2))")
print(f"  High temperature (> 250 K): phonon scattering (μ ∝ T^(-3/2))")

2.6 Complete Hall Data Processing Workflow

Code Example 2-6: Complete Analysis from V_H to n, μ

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

class HallDataProcessor:
    """Complete Hall data processing class"""

    def __init__(self, thickness):
        """
        Parameters
        ----------
        thickness : float
            Sample thickness [m]
        """
        self.t = thickness
        self.e = 1.60218e-19  # Elementary charge [C]
        self.data = {}

    def load_data(self, filename=None, mock_data=True):
        """
        Load the measurement data

        Parameters
        ----------
        filename : str or None
            CSV file name (if None, mock data is generated)
        mock_data : bool
            Whether to generate mock data
        """
        if mock_data:
            # Generate mock data (temperature dependence)
            T = np.array([77, 100, 150, 200, 250, 300, 350, 400])  # [K]
            I = 100e-6  # Current [A]
            B = 0.5  # Magnetic field [T]

            # van der Pauw resistances (temperature-dependent)
            R_AB_CD = 500 + 2.0 * T
            R_BC_DA = 480 + 1.8 * T

            # Hall voltage (temperature-dependent, includes carrier density changes)
            V_pos = -3e-3 * (1 + 0.002 * (T - 300))
            V_neg = +2.9e-3 * (1 + 0.002 * (T - 300))

            self.data = pd.DataFrame({
                'T': T,
                'I': I,
                'B': B,
                'R_AB_CD': R_AB_CD,
                'R_BC_DA': R_BC_DA,
                'V_pos_B': V_pos,
                'V_neg_B': V_neg
            })
        else:
            # Load real data from a CSV file
            self.data = pd.read_csv(filename)

        return self.data

    def calculate_sheet_resistance(self):
        """Calculate the sheet resistance"""
        from scipy.optimize import fsolve

        def vdp_eq(Rs, R1, R2):
            return np.exp(-np.pi * R1 / Rs) + np.exp(-np.pi * R2 / Rs) - 1

        R_s_list = []
        for _, row in self.data.iterrows():
            R1, R2 = row['R_AB_CD'], row['R_BC_DA']
            R_initial = (R1 + R2) / 2 * np.pi / np.log(2)
            R_s = fsolve(vdp_eq, R_initial, args=(R1, R2))[0]
            R_s_list.append(R_s)

        self.data['R_s'] = R_s_list
        self.data['sigma'] = 1 / (np.array(R_s_list) * self.t)
        self.data['rho'] = 1 / self.data['sigma']

    def calculate_hall_properties(self):
        """Calculate the Hall properties"""
        # Hall voltage (offset removed)
        self.data['V_H'] = 0.5 * (self.data['V_pos_B'] - self.data['V_neg_B'])

        # Hall coefficient
        self.data['R_H'] = (self.data['V_H'] * self.t) / (self.data['I'] * self.data['B'])

        # Carrier density
        self.data['n'] = 1 / (np.abs(self.data['R_H']) * self.e)

        # Mobility
        self.data['mu'] = self.data['sigma'] * np.abs(self.data['R_H'])

        # Carrier type
        self.data['carrier_type'] = ['electron' if rh < 0 else 'hole' for rh in self.data['R_H']]

    def plot_results(self):
        """Visualize the results"""
        fig, axes = plt.subplots(2, 3, figsize=(18, 10))

        T = self.data['T']

        # Sheet resistance
        axes[0, 0].plot(T, self.data['R_s'], 'o-', linewidth=2.5, markersize=8, color='#f093fb')
        axes[0, 0].set_xlabel('Temperature [K]', fontsize=11)
        axes[0, 0].set_ylabel('Sheet Resistance [Ω/sq]', fontsize=11)
        axes[0, 0].set_title('Sheet Resistance', fontsize=12, fontweight='bold')
        axes[0, 0].grid(alpha=0.3)

        # Electrical conductivity
        axes[0, 1].semilogy(T, self.data['sigma'], 'o-', linewidth=2.5, markersize=8, color='#f5576c')
        axes[0, 1].set_xlabel('Temperature [K]', fontsize=11)
        axes[0, 1].set_ylabel('Conductivity [S/m]', fontsize=11)
        axes[0, 1].set_title('Electrical Conductivity', fontsize=12, fontweight='bold')
        axes[0, 1].grid(alpha=0.3)

        # Hall voltage
        axes[0, 2].plot(T, self.data['V_H'] * 1e3, 'o-', linewidth=2.5, markersize=8, color='#ffa500')
        axes[0, 2].axhline(0, color='black', linestyle='--', linewidth=1.5)
        axes[0, 2].set_xlabel('Temperature [K]', fontsize=11)
        axes[0, 2].set_ylabel('Hall Voltage [mV]', fontsize=11)
        axes[0, 2].set_title('Hall Voltage', fontsize=12, fontweight='bold')
        axes[0, 2].grid(alpha=0.3)

        # Hall coefficient
        axes[1, 0].plot(T, self.data['R_H'], 'o-', linewidth=2.5, markersize=8, color='#99ccff')
        axes[1, 0].axhline(0, color='black', linestyle='--', linewidth=1.5)
        axes[1, 0].set_xlabel('Temperature [K]', fontsize=11)
        axes[1, 0].set_ylabel('Hall Coefficient [m³/C]', fontsize=11)
        axes[1, 0].set_title('Hall Coefficient', fontsize=12, fontweight='bold')
        axes[1, 0].grid(alpha=0.3)

        # Carrier density
        axes[1, 1].semilogy(T, self.data['n'] / 1e6, 'o-', linewidth=2.5, markersize=8, color='#99ff99')
        axes[1, 1].set_xlabel('Temperature [K]', fontsize=11)
        axes[1, 1].set_ylabel('Carrier Density [cm$^{-3}$]', fontsize=11)
        axes[1, 1].set_title('Carrier Density', fontsize=12, fontweight='bold')
        axes[1, 1].grid(alpha=0.3)

        # Mobility
        axes[1, 2].semilogy(T, self.data['mu'] * 1e4, 'o-', linewidth=2.5, markersize=8, color='#ff9999')
        axes[1, 2].set_xlabel('Temperature [K]', fontsize=11)
        axes[1, 2].set_ylabel('Mobility [cm$^2$/(V·s)]', fontsize=11)
        axes[1, 2].set_title('Hall Mobility', fontsize=12, fontweight='bold')
        axes[1, 2].grid(alpha=0.3)

        plt.tight_layout()
        plt.show()

    def save_results(self, filename='hall_results.csv'):
        """Save the results to a CSV file"""
        self.data.to_csv(filename, index=False)
        print(f"Results saved to {filename}")

# Example usage
processor = HallDataProcessor(thickness=200e-9)  # 200 nm
processor.load_data(mock_data=True)
processor.calculate_sheet_resistance()
processor.calculate_hall_properties()

print("Hall measurement data processing results:")
print(processor.data[['T', 'R_s', 'sigma', 'n', 'mu']].to_string(index=False))

processor.plot_results()
processor.save_results('hall_analysis_output.csv')

Code Example 2-7: Evaluating the Uncertainty of a Hall Measurement

import numpy as np
import matplotlib.pyplot as plt

def hall_measurement_uncertainty(V_H, delta_V_H, I, delta_I, B, delta_B, t, delta_t):
    """
    Propagate uncertainty in a Hall measurement

    Parameters
    ----------
    V_H, delta_V_H : float
        Hall voltage and its uncertainty [V]
    I, delta_I : float
        Current and its uncertainty [A]
    B, delta_B : float
        Magnetic field and its uncertainty [T]
    t, delta_t : float
        Thickness and its uncertainty [m]

    Returns
    -------
    R_H, delta_R_H : float
        Hall coefficient and its uncertainty
    n, delta_n : float
        Carrier density and its uncertainty
    """
    e = 1.60218e-19

    # Hall coefficient: R_H = V_H * t / (I * B)
    R_H = V_H * t / (I * B)

    # Uncertainty propagation (partial derivatives)
    # δR_H/R_H = sqrt((δV_H/V_H)^2 + (δt/t)^2 + (δI/I)^2 + (δB/B)^2)
    rel_unc_V_H = delta_V_H / np.abs(V_H)
    rel_unc_t = delta_t / t
    rel_unc_I = delta_I / I
    rel_unc_B = delta_B / B

    rel_unc_R_H = np.sqrt(rel_unc_V_H**2 + rel_unc_t**2 + rel_unc_I**2 + rel_unc_B**2)
    delta_R_H = np.abs(R_H) * rel_unc_R_H

    # Carrier density: n = 1 / (e * R_H)
    n = 1 / (e * np.abs(R_H))

    # δn/n = δR_H/R_H
    delta_n = n * rel_unc_R_H

    return R_H, delta_R_H, n, delta_n, rel_unc_R_H

# Measurement example
V_H = -5.0e-3  # [V]
delta_V_H = 0.1e-3  # Voltmeter precision [V]
I = 100e-6  # [A]
delta_I = 0.5e-6  # Current-source precision [A]
B = 0.5  # [T]
delta_B = 0.01  # Magnetic-field precision [T]
t = 200e-9  # [m]
delta_t = 5e-9  # Thickness measurement precision [m]

R_H, delta_R_H, n, delta_n, rel_unc = hall_measurement_uncertainty(
    V_H, delta_V_H, I, delta_I, B, delta_B, t, delta_t
)

print("Hall measurement uncertainty evaluation:")
print("=" * 60)
print("Measured values:")
print(f"  Hall voltage: ({V_H * 1e3:.2f} ± {delta_V_H * 1e3:.2f}) mV")
print(f"  Current: ({I * 1e6:.1f} ± {delta_I * 1e6:.2f}) μA")
print(f"  Magnetic field: ({B:.2f} ± {delta_B:.3f}) T")
print(f"  Thickness: ({t * 1e9:.1f} ± {delta_t * 1e9:.1f}) nm")
print("\nResults:")
print(f"  Hall coefficient: ({R_H:.3e} ± {delta_R_H:.3e}) m³/C")
print(f"  Relative uncertainty: {rel_unc * 100:.2f}%")
print(f"  Carrier density: ({n:.3e} ± {delta_n:.3e}) m⁻³")
print(f"                = ({n / 1e6:.3e} ± {delta_n / 1e6:.3e}) cm⁻³")

# Visualize the uncertainty contributions
contributions = {
    'V_H': (delta_V_H / np.abs(V_H))**2,
    't': (delta_t / t)**2,
    'I': (delta_I / I)**2,
    'B': (delta_B / B)**2
}

fig, ax = plt.subplots(figsize=(10, 6))

labels = list(contributions.keys())
values = [np.sqrt(v) * 100 for v in contributions.values()]

bars = ax.bar(labels, values, color=['#f093fb', '#f5576c', '#ffa500', '#99ccff'], edgecolor='black', linewidth=1.5)
ax.set_ylabel('Relative Uncertainty Contribution [%]', fontsize=12)
ax.set_title('Uncertainty Budget for Hall Measurement', fontsize=14, fontweight='bold')
ax.grid(alpha=0.3, axis='y')

# Display the values above each bar
for bar, val in zip(bars, values):
    height = bar.get_height()
    ax.text(bar.get_x() + bar.get_width()/2., height,
            f'{val:.2f}%', ha='center', va='bottom', fontsize=11, fontweight='bold')

# Add the total uncertainty
ax.axhline(rel_unc * 100, color='red', linestyle='--', linewidth=2, label=f'Total: {rel_unc * 100:.2f}%')
ax.legend(fontsize=11)

plt.tight_layout()
plt.show()

2.7 Exercises

Exercise 2-1: Calculating the Hall Voltage (Easy)

Easy Problem: For a carrier density $n = 1 \times 10^{22}$ m$^{-3}$, thickness $t = 100$ nm, current $I = 1$ mA, and magnetic field $B = 0.5$ T, calculate the Hall voltage $V_H$.

Show sample solution
e = 1.60218e-19  # [C]
n = 1e22  # [m^-3]
t = 100e-9  # [m]
I = 1e-3  # [A]
B = 0.5  # [T]

V_H = I * B / (n * e * t)
print(f"Hall voltage V_H = {V_H:.3e} V = {V_H * 1e3:.2f} mV")

Answer: V$_H$ = 3.12 × 10$^{-3}$ V = 3.12 mV

Exercise 2-2: Calculating the Carrier Density (Easy)

Easy Problem: A Hall coefficient of $R_H = -1.5 \times 10^{-3}$ m$^3$/C was measured. Determine the carrier type and carrier density.

Show sample solution
import numpy as np

e = 1.60218e-19  # [C]
R_H = -1.5e-3  # [m^3/C]

carrier_type = 'electron' if R_H < 0 else 'hole'
n = 1 / (np.abs(R_H) * e)

print(f"Carrier type: {carrier_type}")
print(f"Carrier density n = {n:.3e} m⁻³ = {n / 1e6:.3e} cm⁻³")

Answer: Electron (n-type), n = 4.16 × 10$^{21}$ m$^{-3}$ = 4.16 × 10$^{15}$ cm$^{-3}$

Exercise 2-3: Calculating the Mobility (Easy)

Easy Problem: For an electrical conductivity $\sigma = 1 \times 10^4$ S/m and Hall coefficient $R_H = -2 \times 10^{-3}$ m$^3$/C, calculate the mobility $\mu$.

Show sample solution
import numpy as np

sigma = 1e4  # [S/m]
R_H = -2e-3  # [m^3/C]

mu = sigma * np.abs(R_H)
print(f"Mobility μ = {mu:.2f} m²/(V·s) = {mu * 1e4:.1f} cm²/(V·s)")

Answer: μ = 20 m$^2$/(V·s) = 200,000 cm$^2$/(V·s) (unrealistically high → the measured values should be reviewed)

Exercise 2-4: Analyzing a van der Pauw Hall Configuration (Medium)

Medium Problem: A van der Pauw measurement gave $R_{\text{AB,CD}} = 950$ Ω, $R_{\text{BC,DA}} = 1050$ Ω, $V_{24}^{+B} = -4.5$ mV, $V_{24}^{-B} = +4.3$ mV, $I = 100$ μA, $B = 0.5$ T, and $t = 300$ nm. Calculate $\sigma$, $R_H$, $n$, and $\mu$.

Show sample solution
import numpy as np
from scipy.optimize import fsolve

def van_der_pauw_Rs(R1, R2):
    def eq(Rs):
        return np.exp(-np.pi * R1 / Rs) + np.exp(-np.pi * R2 / Rs) - 1
    R_init = (R1 + R2) / 2 * np.pi / np.log(2)
    return fsolve(eq, R_init)[0]

# Parameters
R1, R2 = 950, 1050  # [Ω]
V_pos, V_neg = -4.5e-3, 4.3e-3  # [V]
I = 100e-6  # [A]
B = 0.5  # [T]
t = 300e-9  # [m]
e = 1.60218e-19  # [C]

# Sheet resistance
R_s = van_der_pauw_Rs(R1, R2)
sigma = 1 / (R_s * t)

# Hall analysis
V_H = 0.5 * (V_pos - V_neg)
R_H = V_H * t / (I * B)
n = 1 / (np.abs(R_H) * e)
mu = sigma * np.abs(R_H)

print(f"Sheet resistance R_s = {R_s:.2f} Ω/sq")
print(f"Electrical conductivity σ = {sigma:.2e} S/m")
print(f"Hall coefficient R_H = {R_H:.3e} m³/C")
print(f"Carrier density n = {n:.2e} m⁻³ = {n / 1e6:.2e} cm⁻³")
print(f"Mobility μ = {mu:.2e} m²/(V·s) = {mu * 1e4:.1f} cm²/(V·s)")

Answer: R$_s$ ≈ 1370 Ω/sq, σ ≈ 2.43 × 10$^3$ S/m, R$_H$ ≈ -2.64 × 10$^{-2}$ m$^3$/C, n ≈ 2.36 × 10$^{20}$ m$^{-3}$, μ ≈ 0.064 m$^2$/(V·s) = 640 cm$^2$/(V·s)

Exercise 2-5: Analyzing the Two-Band Model (Medium)

Medium Problem: For $n_e = 1 \times 10^{22}$ m$^{-3}$, $\mu_e = 0.5$ m$^2$/(V·s), $n_h = 5 \times 10^{21}$ m$^{-3}$, and $\mu_h = 0.05$ m$^2$/(V·s), calculate the electrical conductivity $\sigma$ and the Hall coefficient $R_H$.

Show sample solution
e = 1.60218e-19  # [C]
n_e = 1e22  # [m^-3]
mu_e = 0.5  # [m^2/(V·s)]
n_h = 5e21  # [m^-3]
mu_h = 0.05  # [m^2/(V·s)]

# Electrical conductivity
sigma = n_e * e * mu_e + n_h * e * mu_h
print(f"Electrical conductivity σ = {sigma:.2e} S/m")

# Hall coefficient
numerator = n_h * mu_h**2 - n_e * mu_e**2
denominator = (n_h * mu_h + n_e * mu_e)**2
R_H = numerator / (e * denominator)
print(f"Hall coefficient R_H = {R_H:.3e} m³/C")

# Apparent carrier density
n_apparent = 1 / (abs(R_H) * e)
print(f"Apparent carrier density: {n_apparent:.2e} m⁻³ = {n_apparent / 1e6:.2e} cm⁻³")
print(f"  (differs from the true electron density of {n_e / 1e6:.2e} cm⁻³)")

Answer: σ ≈ 8.41 × 10$^2$ S/m, R$_H$ ≈ -1.37 × 10$^{-3}$ m$^3$/C, apparent n ≈ 4.56 × 10$^{21}$ m$^{-3}$ (differs from the true value)

Exercise 2-6: Fitting Temperature Dependence (Medium)

Medium Problem: The mobility was measured to be 5000 cm$^2$/(V·s) at T = 100 K and 1500 cm$^2$/(V·s) at 300 K. Using the model $\mu \propto T^{-\alpha}$, find the exponent $\alpha$.

Show sample solution
import numpy as np

T1, mu1 = 100, 5000  # [K], [cm^2/(V·s)]
T2, mu2 = 300, 1500  # [K], [cm^2/(V·s)]

# From μ ∝ T^(-α), log(μ) = -α log(T) + const
# log(mu1/mu2) = -α log(T1/T2)
# α = -log(mu1/mu2) / log(T1/T2)

alpha = -np.log(mu1 / mu2) / np.log(T1 / T2)
print(f"Exponent α = {alpha:.2f}")
print(f"Model: μ ∝ T^(-{alpha:.2f})")
print(f"\nInterpretation: α ≈ 1.5 → acoustic phonon scattering dominates")

Answer: α ≈ 1.10 (close to the theoretical value of 3/2, but multiple scattering mechanisms may be contributing)

Exercise 2-7: Analyzing the Magnetic-Field Dependence (Hard)

Hard Problem: The Hall voltage was measured as V$_H$ = 0, 1.0, 2.1, 3.0, 4.1, 5.0 mV at magnetic fields B = 0, 0.2, 0.4, 0.6, 0.8, 1.0 T (current I = 100 μA, thickness t = 200 nm). Determine the Hall coefficient with a linear fit and evaluate the nonlinearity.

Show sample solution
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import linregress

B = np.array([0, 0.2, 0.4, 0.6, 0.8, 1.0])  # [T]
V_H = np.array([0, 1.0, 2.1, 3.0, 4.1, 5.0]) * 1e-3  # [V]
I = 100e-6  # [A]
t = 200e-9  # [m]

# Linear fit
slope, intercept, r_value, _, std_err = linregress(B, V_H)

# Hall coefficient
R_H = slope * t / I
print(f"Linear fit: V_H = {slope * 1e3:.3f} mV/T × B + {intercept * 1e3:.3f} mV")
print(f"Hall coefficient R_H = {R_H:.3e} m³/C")
print(f"Coefficient of determination R² = {r_value**2:.4f}")

# Evaluate nonlinearity
V_H_fit = slope * B + intercept
residuals = V_H - V_H_fit
rel_residuals = residuals / V_H_fit[1:] * 100  # Exclude the first point (B=0)

print(f"\nNonlinearity evaluation:")
print(f"  Maximum residual: {np.max(np.abs(residuals[1:])) * 1e6:.2f} μV")
print(f"  Mean relative residual: {np.mean(np.abs(rel_residuals)):.2f}%")

# Plotting
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 5))

ax1.scatter(B, V_H * 1e3, s=100, edgecolors='black', linewidths=2, label='Measured', color='#f093fb', zorder=5)
ax1.plot(B, V_H_fit * 1e3, linewidth=2.5, label=f'Fit: {slope * 1e3:.3f} mV/T', color='#f5576c', linestyle='--')
ax1.set_xlabel('Magnetic Field B [T]', fontsize=12)
ax1.set_ylabel('Hall Voltage V$_H$ [mV]', fontsize=12)
ax1.set_title('Hall Voltage vs Magnetic Field', fontsize=14, fontweight='bold')
ax1.legend(fontsize=11)
ax1.grid(alpha=0.3)

ax2.scatter(B[1:], residuals[1:] * 1e6, s=100, edgecolors='black', linewidths=2, color='#ffa500')
ax2.axhline(0, color='black', linestyle='--', linewidth=1.5)
ax2.set_xlabel('Magnetic Field B [T]', fontsize=12)
ax2.set_ylabel('Residuals [μV]', fontsize=12)
ax2.set_title('Fit Residuals', fontsize=14, fontweight='bold')
ax2.grid(alpha=0.3)

plt.tight_layout()
plt.show()

Answer: R$_H$ ≈ 1.00 × 10$^{-2}$ m$^3$/C, R$^2$ ≈ 0.9996 (good linearity), maximum residual < 50 μV (within measurement precision)

Exercise 2-8: Uncertainty Propagation (Hard)

Hard Problem: For a Hall voltage $V_H = (5.0 \pm 0.2)$ mV, current $I = (100 \pm 1)$ μA, magnetic field $B = (0.50 \pm 0.02)$ T, and thickness $t = (200 \pm 10)$ nm, calculate the uncertainty $\Delta n$ of the carrier density $n$. Evaluate which parameter has the largest effect.

Show sample solution
import numpy as np

V_H, dV_H = 5.0e-3, 0.2e-3  # [V]
I, dI = 100e-6, 1e-6  # [A]
B, dB = 0.50, 0.02  # [T]
t, dt = 200e-9, 10e-9  # [m]
e = 1.60218e-19  # [C]

# n = 1 / (e * R_H) = I * B / (e * V_H * t)
n = I * B / (e * V_H * t)

# Relative-uncertainty contributions
rel_V_H = (dV_H / V_H)**2
rel_I = (dI / I)**2
rel_B = (dB / B)**2
rel_t = (dt / t)**2

rel_unc_total = np.sqrt(rel_V_H + rel_I + rel_B + rel_t)
dn = n * rel_unc_total

print(f"Carrier density: n = {n:.3e} m⁻³ = {n / 1e6:.3e} cm⁻³")
print(f"Uncertainty: Δn = {dn:.3e} m⁻³ = {dn / 1e6:.3e} cm⁻³")
print(f"Relative uncertainty: {rel_unc_total * 100:.2f}%")
print(f"\nUncertainty contributions:")
print(f"  V_H: {np.sqrt(rel_V_H) * 100:.2f}%")
print(f"  I:   {np.sqrt(rel_I) * 100:.2f}%")
print(f"  B:   {np.sqrt(rel_B) * 100:.2f}%")
print(f"  t:   {np.sqrt(rel_t) * 100:.2f}%")
print(f"\nConclusion: uncertainty in the thickness t has the largest effect ({np.sqrt(rel_t) * 100:.1f}%)")

Answer: n = (6.24 ± 0.42) × 10$^{21}$ m$^{-3}$, relative uncertainty 6.7%, the thickness measurement is the most important contributor (5.0% contribution)

Exercise 2-9: Designing an Experiment (Hard)

Hard Problem: Design an experimental plan to determine the carrier type, density, and mobility of an unknown thin-film semiconductor (thickness 100 nm). Give specific details on the required measurements, temperature range, magnetic-field range, and data-analysis methods.

Show sample solution

Experimental plan:

  1. Sample preparation:
    • van der Pauw configuration: 8 contacts at the 4 corners (4 for current, 4 for voltage)
    • Contact size < 0.5 mm, confirm ohmic contact (linear I-V characteristics)
  2. Room-temperature measurement (T = 300 K):
    • Sheet resistance measurement (B = 0): compute $R_s$ and $\sigma$ from $R_{\text{AB,CD}}$ and $R_{\text{BC,DA}}$
    • Hall measurement: measure $V_H$ at B = ±0.5 T (offset removed)
    • → Determine the carrier type (sign of $R_H$), carrier density $n$, and mobility $\mu$
  3. Magnetic-field-dependence measurement (room temperature):
    • Measure the Hall voltage from B = 0 to 1 T in 0.1 T steps
    • Check linearity (nonlinearity may indicate a multi-carrier system)
  4. Temperature-dependence measurement:
    • Temperature range: 77 K (liquid nitrogen) to 400 K
    • Measurement points: 20-25 K intervals, allowing thermal equilibration at each temperature (10-15 minutes)
    • At each temperature: sheet resistance + Hall measurement (B = ±0.5 T)
  5. Data analysis:
    • Plot $n(T)$ and $\mu(T)$
    • Determine whether the material is a semiconductor or a metal (from the temperature dependence of $\rho$)
    • For semiconductors: Arrhenius plot ($\ln n$ vs $1/T$) → activation energy
    • Fit the temperature dependence of the mobility (Matthiessen's rule, $\mu \propto T^{-\alpha}$)
    • Identify the scattering mechanism (acoustic phonon, impurity, grain boundary, etc.)

Expected results:

2.8 Checking Your Understanding

Use the checklist below to check your understanding:

Basic Understanding

Practical Skills

Applied Skills

2.9 References

  1. Hall, E. H. (1879). On a New Action of the Magnet on Electric Currents. American Journal of Mathematics, 2(3), 287-292. - The paper that discovered the Hall effect
  2. van der Pauw, L. J. (1958). A method of measuring the resistivity and Hall coefficient on lamellae of arbitrary shape. Philips Technical Review, 20(8), 220-224. - The original paper describing the van der Pauw Hall measurement method
  3. Look, D. C. (1989). Electrical Characterization of GaAs Materials and Devices. Wiley. - A practical text on Hall measurements in semiconductors
  4. Putley, E. H. (1960). The Hall Effect and Related Phenomena. Butterworths. - A comprehensive treatment of the Hall effect
  5. Ashcroft, N. W., & Mermin, N. D. (1976). Solid State Physics (Chapter 2: The Sommerfeld Theory of Metals). Holt, Rinehart and Winston. - The Drude model and carrier transport theory
  6. Schroder, D. K. (2006). Semiconductor Material and Device Characterization (3rd ed., Chapter 2: Resistivity). Wiley-Interscience. - Details of Hall measurement techniques
  7. Popović, R. S. (2004). Hall Effect Devices (2nd ed.). Institute of Physics Publishing. - Hall effect devices and measurement techniques

2.10 Next Chapter

In the next chapter, you will learn the principles and practice of magnetic measurements. You will master magnetization measurements using a VSM (Vibrating Sample Magnetometer) and a SQUID (Superconducting Quantum Interference Device), M-H curve analysis, evaluation of magnetic anisotropy, and integrated measurement techniques using a PPMS (Physical Property Measurement System).

Disclaimer