Zitao Ni

Ph.D. in Materials Science and Engineering

Learning Session #03: Butler-Volmer Kinetics

Learning Session #03: Butler-Volmer Kinetics

Read this file to seamlessly continue learning in a new conversation
This file follows the note_specification.md specification
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
2
3
4
5
6
7
8
9
10
11
12
Function: butler_volmer_overpotential(j, k, c_e, c_s_surf, c_s_max, alpha, T)
Purpose: Compute overpotential η from current density j via Butler-Volmer kinetics

Algorithm:
1. Compute exchange current density:
j₀ = k · c_e^(1−α) · c_s_surf^α · (c_max − c_s_surf)^(1−α)
2. If α = 0.5:
a. Compute x = clip(j / (2·j₀), −1e¹⁰, 1e¹⁰)
b. Return η = (2RT/F) · arcsinh(x)
3. Else (α ≠ 0.5):
Newton iteration (see detailed notes)
4. Return η

model.py step() Step 2 (BV portion):

1
2
3
4
5
6
7
8
Function: step()
Step 2 — BV Kinetics:
1. Compute anode surface concentration: c_s_surf_n from diffusion state
2. Compute cathode surface concentration: c_s_surf_p from diffusion state
3. Compute anode overpotential:
η_n = butler_volmer_overpotential(j_n, k_n, c_e, c_s_surf_n, c_s_max_n, α, T)
4. Compute cathode overpotential:
η_p = butler_volmer_overpotential(j_p, k_p, c_e, c_s_surf_p, c_s_max_p, α, T)

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
2
3
4
5
6
7
8
9
Current i_app

Flux j = i_app / (a_s·L·F) ← Chapter 1 knowledge

BV equation → Overpotential η ← This chapter
↓ ↑
c_s_surf (from diffusion equation) ← Chapter 2 completed

V_cell = OCV_p + η_p − OCV_n − η_n ← Chapter 4 implementation

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

  1. Understand the physical meaning of “overpotential” — why reactions need extra driving force
  2. Master the BV equation in both forward (j ← η) and inverse (η ← j) forms
  3. Understand the dependence of exchange current density j₀ (k, c_e, c_s, c_max)
  4. Hand-derive the arcsinh analytic inversion for α=0.5
  5. Understand the implementation of butler_volmer_overpotential() in the code

4.2 Learning Path

1
2
3
4
5
6
graph TD
A["Overpotential Concept<br/>Why is η needed?"] --> B["BV Forward Equation<br/>Physical meaning of j(η)"]
B --> C["Exchange Current Density j₀<br/>Dependence analysis"]
C --> D["BV Inversion<br/>α=0.5 arcsinh derivation"]
D --> E["Code Implementation<br/>Compare with model.py"]
E --> F["Visualization<br/>η-j curves, j₀ sensitivity"]

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

  1. Why is j₀ maximum at SOC=0.5? (Hint: where does √x·√(1−x) peak?)
  2. If k increases 10×, how does η change at the same j? Why is this beneficial for battery performance?
  3. 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
2
3
4
5
6
┌─────────────┐    c_s_surf    ┌─────────────┐
│ Diffusion │ ───────────→ │ BV │
│ (Ch 2) │ │ (Ch 3) │
│ │ ←─────────── │ │
│ Update c(r) │ j │ Compute η │
└─────────────┘ └─────────────┘

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”

0%