Free · Tool 02 Home / Tools / Curve Fitter

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.

See the Founding Pilot Cohort

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
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.

The model

V_cell(j) = E_rev(T,p) + η_act,anode(j) + η_act,cathode(j) + j·ASR + η_conc(j) E_rev(T,p) = 1.2291 − 8.5×10⁻⁴·(T−298.15) + (RT/2F)·ln(p_H2·√p_O2) η_act(j) = (RT/αF)·asinh( j / (2·j0) ) η_conc(j) = (RT/nF)·ln( 1 / (1 − j/j_lim) )

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

What this tool deliberately does not do