Learning Session #03: Butler-Volmer Kinetics
Read this file to seamlessly continue learning in a new conversation
This file follows thenote_specification.mdspecification
Teaching approach: Zero-prerequisite friendly, all figures generated as PNG with matplotlib
1. Review of Previously Learned Material
1.1 Chapter 1: Electrochemistry Fundamentals & OCV
The three core assumptions of SPM (Single Particle Model), parameter naming conventions, lithium conservation via SOC and N/P ratio, OCV curves (Nernst equation + graphite tanh fit + NMC polynomial).
1.2 Chapter 2: Diffusion Equation (Fick’s Second Law) — Just Completed
| Knowledge Point | Key Takeaway |
|---|---|
| Fick’s First Law | J = −D·∂c/∂r, diffusion driven by concentration gradient |
| Fick’s Second Law (spherical) | ∂c/∂t = D·[∂²c/∂r² + (2/r)·∂c/∂r] |
| Center boundary condition | ∂c/∂r|₀ = 0 → L’Hôpital → ∇²c|₀ = 6(c₁−c₀)/dr² |
| Surface boundary condition | D·∂c/∂r|_R = j, during discharge j<0 → surface concentration drops |
| Implicit Euler | (I − DΔt·L)·c_new = c_old, unconditionally stable |
| CFL condition | Δt < dr²/(2D) ≈ 0.13s → explains why implicit is necessary |
| Tridiagonal matrix | scipy solve_banded((1,1), ab, rhs), banded storage 3×Nr |
| Independent implementation | diffusion_solver_my.py, matrix difference vs model.py = 0 |
1.3 Key Formula Recap
Diffusion equation (Chapter 2 core):
$$
\frac{\partial c}{\partial t} = D \cdot \left[ \frac{\partial^2 c}{\partial r^2} + \frac{2}{r} \cdot \frac{\partial c}{\partial r} \right]
$$
Diffusion–electrochemistry interface — surface flux j determined by current:
$$
j_n = -\frac{i_{\mathrm{app}}}{a_{s,n} \cdot L_n \cdot F} \qquad
j_p = \frac{i_{\mathrm{app}}}{a_{s,p} \cdot L_p \cdot F}
$$
2. Current Code Status
2.1 File Inventory
| File | Purpose | Status |
|---|---|---|
spm/parameters.py |
Battery physical parameters + automatic SOC conversion | Done |
spm/model.py |
SPM core engine (four master equations) | OCV+Diffusion learned, BV pending |
learning/learning_notes_02_diffusion/diffusion_solver_my.py |
Independent diffusion solver | Done |
requirements.txt |
numpy, scipy, matplotlib | Done |
2.2 Code Directly Relevant to This Chapter
model.py butler_volmer_overpotential() function:
1 | Function: butler_volmer_overpotential(j, k, c_e, c_s_surf, c_s_max, alpha, T) |
model.py step() Step 2 (BV portion):
1 | Function: step() |
2.3 Key Parameters (Used in This Chapter)
| Parameter | Value | Meaning |
|---|---|---|
k_n, k_p |
2.0e-11 | Reaction rate constants (“entry barrier” height) |
c_e |
1000 mol/m³ | Electrolyte concentration (constant in SPM) |
alpha |
0.5 | Charge transfer coefficient (symmetry factor) |
c_s_max_n |
31507 mol/m³ | Anode max concentration |
c_s_max_p |
51554 mol/m³ | Cathode max concentration |
T |
298.15 K | Temperature |
F |
96485 C/mol | Faraday constant |
R |
8.314 J/(mol·K) | Ideal gas constant |
2.4 Generated Figures Index
| Chapter | Figure File | Content |
|---|---|---|
| Ch 1 | ocv_comparison.png |
Nernst vs empirical OCV comparison |
| Ch 1 | nernst_breakdown.png |
Nernst formula breakdown |
| Ch 1 | ocv_deep_dive.png |
OCV deep dive + discharge trajectory |
| Ch 2 | diffusion_concept.png |
Diffusion physical concept (gradient+onion+discharge) |
| Ch 2 | diffusion_discretization.png |
Discretization (grid+matrix+boundary) |
| Ch 2 | diffusion_simulation.png |
Simulation results (profile+D sensitivity+SOC timeline) |
3. This Session’s Learning Topic
Butler-Volmer Kinetics — The “Customs” of Electrochemical Reactions
Among the four SPM master equations, the BV equation describes the reaction rate of lithium ions “entering/leaving” at the particle surface.
Position in the overall model:
1 | Current i_app |
Diffusion (Ch 2) answers “how lithium distributes inside particles”, BV (this chapter) answers “how difficult the surface reaction is”. Together → compute overpotential → voltage deviates from ideal OCV.
4. This Session’s Learning Plan
4.1 Learning Objectives
- Understand the physical meaning of “overpotential” — why reactions need extra driving force
- Master the BV equation in both forward (j ← η) and inverse (η ← j) forms
- Understand the dependence of exchange current density j₀ (k, c_e, c_s, c_max)
- Hand-derive the arcsinh analytic inversion for α=0.5
- Understand the implementation of
butler_volmer_overpotential()in the code
4.2 Learning Path
1 | graph TD |
4.3 Detailed Content
Part A: Physical Foundations — Overpotential
Overpotential η = the extra voltage needed to “push” the reaction.
Equilibrium (η=0): Forward reaction (oxidation) and reverse reaction (reduction) rates are equal, net current is zero.
Away from equilibrium (η≠0): Forward and reverse rates are no longer equal → net current flows.
| η Sign | Meaning | Physical Process |
|---|---|---|
| η > 0 | Oxidation overpotential | Drives deintercalation (anode during discharge) |
| η < 0 | Reduction overpotential | Drives intercalation (cathode during discharge) |
| η = 0 | Equilibrium | No net reaction, j=0 |
Part B: The BV Equation
Forward — overpotential → net reaction flux:
$$
j = j_0 \cdot \left[ \exp!\left(\frac{\alpha F \eta}{RT}\right) - \exp!\left(-\frac{(1-\alpha)F \eta}{RT}\right) \right]
$$
| Term | Physical Meaning |
|---|---|
| exp(αFη/RT) | Oxidation driving force (grows exponentially with η) |
| exp(−(1−α)Fη/RT) | Reduction driving force (decays exponentially with η) |
| Difference | Net reaction rate = oxidation − reduction |
Key insight: When η is small (|η| ≪ RT/F ≈ 0.026V), the two exponentials are approximately linear: j ≈ j₀·Fη/(RT). At small overpotentials, the reaction is linearly related to voltage.
When η is large, the dominant direction’s exponential term explodes, the other term becomes negligible.
Exchange current density j₀:
$$
j_0 = k \cdot c_e^{1-\alpha} \cdot c_s^{\alpha} \cdot (c_{\mathrm{max}} - c_s)^{1-\alpha}
$$
When α=0.5 this simplifies to:
$$
j_0 = k \cdot \sqrt{c_e} \cdot \sqrt{c_s} \cdot \sqrt{c_{\mathrm{max}} - c_s}
$$
| Factor | Meaning | Intuition |
|---|---|---|
| k | Reaction rate constant | “Entry barrier” height |
| √c_e | Electrolyte lithium concentration | “Supply” from this side |
| √c_s | Surface solid-phase concentration | “Inventory” on this side |
| √(c_max−c_s) | Available vacancies | “Empty slots” on the other side |
Key insight: Larger j₀ → larger current at the same η → easier reaction → smaller overpotential. j₀ large = good battery.
Part C: BV Inversion (α=0.5)
Let x = j/2j₀. At α=0.5, the BV equation simplifies to:
$$
j = j_0 \cdot [\exp(F\eta/2RT) - \exp(-F\eta/2RT)] = 2j_0 \cdot \sinh(F\eta/2RT)
$$
Inversion:
$$
\eta = \frac{2RT}{F} \cdot \mathrm{arcsinh}!\left(\frac{j}{2j_0}\right)
$$
Exercise: Verify the expansion of sinh(x+y) and sinh(x−y), understand why α=0.5 makes the two exponentials form exactly a hyperbolic sine.
Part D: Code Implementation
model.py butler_volmer_overpotential() implementation:
- Compute j₀
- α=0.5 → direct arcsinh inversion (analytic solution)
- α≠0.5 → Newton-Raphson iteration (numerical solution)
4.4 Hands-On Tasks
| # | Task | Related Code |
|---|---|---|
| 1 | Hand-derive the sinh form for α=0.5 | — |
| 2 | Independently implement bv_overpotential() |
model.py#butler_volmer_overpotential |
| 3 | Plot η-j curves (at different SOC) | Visualization |
| 4 | Plot j₀ dependence curves (varying c_s) | Visualization |
| 5 | Compare independent implementation vs model.py | Code comparison |
4.5 Generated Figure: bv_overpotential.png
Use matplotlib to generate PNG, style following
visualize_ocv.py
Subplot 1: BV Forward Curve η → j
- x-axis: η (V), y-axis: j (mol/(m²·s))
- Plot η-j curves at different c_s (confirm S-shaped characteristic)
- Annotate linear region (small η) and exponential region (large η)
Subplot 2: BV Inverse Curve j → η
- x-axis: j, y-axis: η
- arcsinh curves at different SOC
- Annotation: higher SOC → smaller η at same j (easier reaction)
Subplot 3: j₀ Dependence
- x-axis: c_s/c_max (SOC), y-axis: j₀
- At α=0.5: “∩” shaped curve (√(c_s)·√(c_max−c_s) peaks at 0.5)
- Annotation: SOC=0.5 yields maximum j₀ (half-full = most active)
4.6 Preview Questions
- Why is j₀ maximum at SOC=0.5? (Hint: where does √x·√(1−x) peak?)
- If k increases 10×, how does η change at the same j? Why is this beneficial for battery performance?
- Why can’t we use arcsinh inversion when α≠0.5? What is the Newton iteration approach?
5. Bridging Two Chapters: Diffusion → BV Data Flow
1 | ┌─────────────┐ c_s_surf ┌─────────────┐ |
Diffusion provides surface concentration c_s_surf → BV computes overpotential η → Voltage formula: V_cell = OCV_p + η_p − OCV_n − η_n
6. Reference File Index
| Path | Description |
|---|---|
../learning_notes_02_diffusion/learning_notes_02_diffusion.md |
Chapter 2 full notes |
../learning_notes_02_diffusion/learning_plan_02-03.md |
Ch 2→3 plan snapshot |
../../spm/model.py |
BV function source (butler_volmer_overpotential) |
../../spm/parameters.py |
Battery parameters (k, alpha, c_e, T, etc.) |
../../note_specification.md |
Note writing specification |
Session background file · Version 1.0
Created: 2026-05-25
Corresponding study notes: learning_notes_03_kinetics.md
Next session tip: In a new conversation, say “Please read learning/learning_notes_03_kinetics/session_03_background.md to begin this session”