Your test bench made a curve. This is what's actually in it.
Paste the I-V data off your potentiostat. Get exchange current density, charge-transfer coefficient, ohmic resistance and mass-transport limit — each with a real 95% confidence interval, not just a solver's best guess.
Test data
Paste two tab/comma-separated columns from Excel or your test bench export. A header row is fine — it's auto-detected.
Optional: second curve for degradation rate
Paste a later-life curve (same format) to get a µV/h degradation rate you can carry straight into the LCOH and guarantee-correction tools.
Paste your data and click Fit curve.
One curve, once. HYDRA OS refits this continuously against live stack data, catches drift before it shows up in production, and feeds it straight into degradation-adjusted LCOH.
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.
Method & sources
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.
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.