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:
- ✅ Derive the Hall effect equation from the Lorentz force and calculate the Hall voltage
- ✅ Understand the relationship between the Hall coefficient $R_H = 1/(ne)$ and carrier density
- ✅ Explain the van der Pauw Hall measurement configuration and measurement procedure
- ✅ Calculate the mobility $\mu = \sigma R_H$ and understand its physical meaning
- ✅ Analyze multi-carrier systems (two-band model)
- ✅ Analyze carrier scattering mechanisms from temperature dependence
- ✅ Build a complete Hall data processing workflow in Python
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.
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:
- When a current $I$ flows through the conductor, the carriers (electrons) move in the x direction with drift velocity $v_x$
- 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
- The electrons ($q = -e$) are deflected in the y direction and accumulate on one side of the sample
- This charge accumulation produces a Hall electric field $E_y$
- 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:
- $\sigma$ reflects how easily current flows (it depends on both the carrier density $n$ and the mobility $\mu$)
- $R_H$ depends only on the carrier density $n$
- Combining the two lets us isolate the mobility $\mu$
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:
- Silicon mobility: ~1000 cm²/(V·s) (typical value)
- GaAs is a high-mobility material (~5000 cm²/(V·s))
- InSb has an ultra-high mobility (~77,000 cm²/(V·s))
- Graphene has an extremely high mobility (~10,000-100,000 cm²/(V·s))
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$.
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:
- 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
- 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}$
- 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:
- When $\mu_h \gg \mu_e$, holes dominate the Hall effect ($R_H > 0$)
- When $\mu_e \gg \mu_h$, electrons dominate the Hall effect ($R_H < 0$)
- When the mobilities are comparable, the sign of $R_H$ depends on the ratio of carrier densities $n_h/n_e$
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:
- 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)
- 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$
- 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)
- 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)
- 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:
- n-type semiconductor: $R_H < 0$, $n \sim 10^{15}$-10$^{18}$ cm$^{-3}$, $\mu \sim 100$-5000 cm$^2$/(V·s), $n$ increases with temperature (thermal excitation)
- p-type semiconductor: $R_H > 0$, similar ranges of density and mobility
- Metallic material: $n \sim 10^{21}$-10$^{23}$ cm$^{-3}$, $\mu$ decreases with increasing temperature (phonon scattering)
2.8 Checking Your Understanding
Use the checklist below to check your understanding:
Basic Understanding
- I can derive the Hall voltage equation from the Lorentz force
- I understand the relationship between the Hall coefficient $R_H = 1/(ne)$ and carrier density
- I can explain the physical meaning of the mobility $\mu = \sigma R_H$
- I understand the measurement procedure for the van der Pauw Hall configuration
- I can explain the purpose of reversing the magnetic field during measurement (offset removal)
Practical Skills
- I can calculate the carrier density from the Hall voltage
- I can fully analyze van der Pauw Hall measurement data (obtaining $\sigma$, $R_H$, $n$, and $\mu$)
- I can implement a complete Hall data processing workflow in Python
- I can compute uncertainty propagation and evaluate measurement precision
- I can estimate the scattering mechanism from temperature-dependent data
Applied Skills
- I can analyze multi-carrier systems using the two-band model
- I can identify the scattering mechanism from the temperature dependence of the mobility
- I can evaluate the nonlinearity of a measurement and estimate its cause
- I can design an experimental plan and determine appropriate measurement conditions
2.9 References
- 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
- 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
- Look, D. C. (1989). Electrical Characterization of GaAs Materials and Devices. Wiley. - A practical text on Hall measurements in semiconductors
- Putley, E. H. (1960). The Hall Effect and Related Phenomena. Butterworths. - A comprehensive treatment of the Hall effect
- 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
- Schroder, D. K. (2006). Semiconductor Material and Device Characterization (3rd ed., Chapter 2: Resistivity). Wiley-Interscience. - Details of Hall measurement techniques
- 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).