Polarisation curve fitter
What does your polarisation curve say about kinetics, resistance and mass transport?
Method, assumptions and limits
This tool fits a two-electrode, lumped Butler-Volmer model to your data using Levenberg-Marquardt nonlinear least squares — the same class of algorithm behind commercial electrochemistry fitting software, implemented here in about 150 lines of dependency-free JavaScript so it runs entirely in your browser. Nothing you paste in is uploaded anywhere.
The model
Cathode kinetics (hydrogen evolution) are fixed at a fast default (j0,cat = 0.1 A/cm², α = 0.5) rather than fit — HER is fast enough on typical cathode catalysts that the anode (oxygen evolution) dominates the activation loss, and fitting both simultaneously with only a total-voltage measurement is not identifiable from most test datasets. If your cathode is known to be limiting, treat the fitted ASR as absorbing some of that loss.
Why asinh, not the textbook Tafel equation
The Tafel form, η = (RT/αF)·ln(j/j0), is undefined at j=0 and diverges as current approaches zero — exactly where your test bench's minimum-stable-load points live. The full Butler-Volmer asinh form used here stays finite through j=0 and converges to identical Tafel behavior at high current. It isn't a different model, it's the same model without the part that breaks on the data you actually have.
Confidence intervals and identifiability
Parameters are optimized in a transformed space (log for j0/ASR, logit for α, and j_lim is parameterized as "above your highest tested current density plus a free positive offset" so the solver can never collapse it inside your data range) — this is what keeps the fit from wandering into a false local minimum on noisy data. The covariance matrix (and from it, the 95% confidence intervals shown) comes from σ²·(JᵀJ)⁻¹ at the converged solution, propagated from the fit's own residual scatter — not assumed.
j0 and α are only separately identifiable when your data includes low-current points (below roughly 0.05 A/cm²). Without them, the fit still finds a good Tafel slope, but reports a warning rather than a falsely precise j0.
Sources
- E_rev0 = 1.2291 V — standard reversible cell voltage at 25°C, 1 atm, liquid water reference; equals ΔG°_f(H₂O,l)/(n·F) using the standard Gibbs free energy of formation of liquid water.
- −8.5×10⁻⁴ V/K temperature coefficient — dE_rev/dT = −ΔS°_f(H₂O,l)/(n·F), derived from standard molar entropies (S°: H₂O(l)=70.0, H₂(g)=130.7, O₂(g)=205.2 J/(mol·K)), which gives −8.46×10⁻⁴ V/K — reproducible from any standard thermochemistry reference, not one paper.
- Cathode defaults (j0,cat = 0.1 A/cm², α = 0.5) — a representative mid-range geometric exchange current density reflecting hydrogen evolution's well-known kinetic advantage over oxygen evolution on any practical PEM anode catalyst, not a specific measurement; see "The model" above for why this isn't fit.
What this tool deliberately does not do
- It does not distinguish anode vs. cathode contribution to ASR — the fitted ASR is the total ohmic + any lumped cathode loss.
- It does not fit crossover or hydrogen-in-oxygen behavior — use the turndown tool for that, with this fit's parameters as an input if you want them.
- Degradation rate from two curves assumes the whole curve shifted uniformly in voltage — a standard simplification for a screening tool, not a mechanism-resolved degradation model.
Worked example
The dataset this page loads with — fourteen I-V points from a 60-cell, 300 cm² PEM stack at 80 °C and ambient pressure on both electrodes. Press Fit curve and the tool returns exactly this.
Fitted parameters
- j₀ (anode)
- 3.36 × 10⁻⁵ A/cm²
- α (anode)
- 0.492
- ASR
- 177.4 mΩ·cm²
- j_lim
- 70 A/cm² (at bound)
- Tafel slope
- 142.4 mV/decade
95% confidence intervals
- j₀ (anode)
- −4.2 × 10⁻⁶ … 7.1 × 10⁻⁵
- α (anode)
- 0.426 … 0.558
- ASR
- 165.8 … 189.0 mΩ·cm²
- j_lim
- not identifiable
- RMSE
- 10.9 mV
- R²
- 0.9990
R² is 0.9990 and the fit is still not telling you what you think it is: the confidence interval on j₀ crosses zero, and j_lim sits at its bound with zero standard error. Only ASR is actually constrained by this data.
This is the failure mode the tool exists to catch. j₀ and α are correlated at −0.99 in this fit, meaning the data cannot separate them — a lower exchange current density and a higher transfer coefficient describe these fourteen points equally well. And because the measurements stop at 3.5 A/cm², nowhere near mass-transport limitation, j_lim is unconstrained and the optimizer parks it at the bound. Quoting a j₀ from a dataset like this in a vendor comparison is quoting noise with four significant figures. To constrain j₀ and α separately you need low-current-density points below roughly 0.01 A/cm²; to constrain j_lim you need to drive the stack into the mass-transport regime.
References
The references for this tool are listed in the method above.
Engine v0.3.0Last reviewed 27 September 2026 Changelog Report an error
Cite this tool
Polestar Technology (2026). Polarisation curve fitter. HYDRA engine v0.3.0. https://polestartech.co/tools/polarization-curve-fitter.htmlHYDRA Assess: Need this across a full test campaign, with scale-up to the full stack? That is HYDRA Assess.