PV I-V Curve Calculator
PV I-V Curve Calculator
The single-diode model, with its parameters extracted from a module’s data sheet rather than asked for: the I-V and power curves, the maximum power point and its voltage and current, the fill factor and the module’s efficiency — all recomputed at your own irradiance and cell temperature, because the data sheet is at STC and a roof in May is not.
The I-V curve, the maximum power point and the efficiency at your conditions
a 550 W module — I_sc 13.90 A, V_oc 49.90 V, I_mp 13.19 A, V_mp 41.70 V, 72 cells in series, 2.584 m² — with an ideality factor of 1.15 and 400 Ω of shunt resistance assumed, running at 800 W/m² and 50 °C cell temperature
Implicit in V, explicit in V_j
put Vj = V + I·Rs and both coordinates become explicit:
I(Vj) = Iph − I₀·(exp(Vj/a) − 1) − Vj/Rsh, V(Vj) = Vj − I(Vj)·Rs
dP/dVj = 0 ⇔ I + I′·(Vj − 2·I·Rs) = 0
FF = Pmp ÷ (Voc·Isc), η = Pmp ÷ (G·A)
- V_j
- the junction voltage: the voltage across the diode and the shunt resistance, which is the terminal voltage plus the drop in the series resistance. Sweeping it traces the whole curve with no iteration at all
- I_ph, I₀, R_s
- extracted from the data sheet’s own three points, not asked for. Nobody has I₀ to hand
- n, R_sh
- the two the data sheet does not give, which have to be assumed. They are also the two the answer is least sensitive to near the maximum power point and most sensitive to at the two ends of the curve
- FF
- fill factor: how square the curve is. It is the fraction of the V_oc × I_sc rectangle the maximum power point actually reaches, and series resistance is what takes it away
Worked example
a 550 W module — I_sc 13.90 A, V_oc 49.90 V, I_mp 13.19 A, V_mp 41.70 V, 72 cells in series, 2.584 m² — with an ideality factor of 1.15 and 400 Ω of shunt resistance assumed, running at 800 W/m² and 50 °C cell temperature
The string's thermal voltage at 25 °C is n·N_s·kT/q = 1.15 × 72 × 25.693 mV = 2.127 V. With that and the shunt resistance fixed, the open-circuit and short-circuit conditions give I₀ and I_ph as functions of R_s alone, and forcing the curve through the data sheet's maximum power point leaves one equation in R_s. Twenty bisections give R_s = 117.8 mΩ, that is 1.64 mΩ per cell, and then I₀ = 896 pA and I_ph = 13.9 A
At 50 °C the thermal voltage rises to 2.306 V and the saturation current rises to 24 nA — here back-calculated so that V_oc lands exactly where the data sheet's -0.27 %/°C says it should. At 800 W/m² the photocurrent is 11.26 A, so V_oc = 46.01 V and I_sc = 11.25 A
Sweeping the junction voltage traces the curve explicitly. Sixteen bisections on I + I′·(V_j − 2·I·R_s) find the peak of the power curve at V_j = 39.46 V, which is V_mp = 38.22 V at I_mp = 10.51 A — so P_mp = 401.7 W
That is a fill factor of 0.7757 (against 0.7930 on the data sheet) and a module efficiency of 19.43% on 2.584 m², down from 21.29% at STC. It is 73.02% of the nameplate — the honest answer to what a 550 W module does on a warm roof
Cross-check: the data sheet's own linear power coefficient of -0.34 %/°C predicts 402.6 W at this irradiance and temperature. The physical model and the linear derating differ by 0.24%, which is close agreement between two independent routes and the best available evidence that the assumed ideality factor and shunt resistance suit this module. Switching to the band-gap model instead would imply a V_oc coefficient of -0.381 %/°C — noticeably steeper than the -0.27 %/°C the data sheet claims, which is a known weakness of the plain band-gap translation for a modern cell
The three standard test conditions, and why none of them is your roof
| Condition | Irradiance | Cell or air temperature | Spectrum | What it is for |
|---|---|---|---|---|
| STC — standard test conditions | 1000 W/m² | 25 °C cell | AM1.5G | the nameplate. A cell at 25 °C in 1000 W/m² of sun essentially never happens outdoors; it is a flash-test condition |
| NOCT — nominal operating cell temperature | 800 W/m² | 20 °C air, 1 m/s wind, open rack | AM1.5G | the measured cell temperature under those conditions, typically 42 to 48 °C. It is the number to start from when estimating cell temperature from air temperature |
| NMOT / PTC-style ratings | 800 W/m² | 20 °C air | AM1.5G | a rating at conditions closer to reality, quoted by some manufacturers and required by some incentive programmes |
| Low-light point | 200 W/m² | 25 °C cell | AM1.5G | IEC 61853-1 requires efficiency to be reported here too, because a module that holds its efficiency at 200 W/m² makes real energy on a cloudy morning |
| Your roof, a clear afternoon in May | 600 to 900 W/m² | 45 to 65 °C cell | varies with air mass and cloud | what this page is for: the same model, evaluated where the module actually is |
Why the curve is the answer, and what the model cannot see
A photovoltaic module is not a voltage source and not a current source. It is a current source in parallel with a diode, and everything that makes a module interesting is in the shape that produces: nearly constant current up to a knee, then a collapse to open circuit. Somewhere on that knee is the one operating point that delivers the most power, and the whole job of an MPPT charge controller or a string inverter is to sit on it while it moves.
The equation, and why it looks unsolvable. The single-diode model says the terminal current is the photocurrent minus what the diode takes minus what the shunt resistance leaks, and the voltage that drives both of those is the terminal voltage PLUS the drop in the series resistance — which depends on the current. So I appears on both sides. There is no elementary closed form for I(V); the exact solution needs the Lambert W function. But the difficulty is entirely an artefact of insisting that V is the independent variable. Sweep the JUNCTION voltage instead — the voltage actually across the diode — and both the current and the terminal voltage fall out explicitly, with no iteration and no approximation. That is what this page does, and substituting the resulting pair back into the original implicit equation gives an identity, which is checked numerically to a picoamp at 41 points on every curve.
Where the parameters come from. A data sheet gives four numbers: I_sc, V_oc, I_mp and V_mp, plus the temperature coefficients. It does not give I₀, and nobody has I₀ to hand. So the page extracts it: with the ideality factor and the shunt resistance assumed, the open-circuit and short-circuit conditions pin I_ph and I₀ as functions of the series resistance, and forcing the curve through the stated maximum power point leaves a single equation in R_s alone, which is bisected. The model then passes through all three data sheet points exactly. Two parameters still have to be assumed, and the page is honest about that: the ideality factor and the shunt resistance are not on any data sheet, and raising one lowers the extracted series resistance because both bend the knee the same way. That degeneracy is intrinsic to fitting five parameters to four numbers.
Temperature is the whole story of a real array. Irradiance scales the current almost exactly linearly, which is easy. Temperature is not: it lifts I_sc very slightly and drops V_oc a great deal, because the diode’s saturation current rises steeply with temperature. A module at 65 °C loses about 14% of its nameplate power to temperature alone, before any consideration of soiling, mismatch or inverter efficiency. This page offers two ways to handle it: force the model to match your data sheet’s V_oc coefficient, or use the physical band-gap expression of De Soto, Klein and Beckman. For a modern module the two disagree — the band-gap expression typically predicts a steeper coefficient than the module actually has — and the page reports both so you can see by how much.
What it does not cover. One module at one uniform irradiance and one uniform temperature. It says nothing about partial shading, which is the single biggest real-world effect and is not a scaling of this curve at all — a shaded cell goes into reverse bias and the bypass diodes take over, producing a curve with several local maxima that can fool a poorly written MPPT algorithm. It says nothing about mismatch between modules in a string, about light-induced degradation, or about the cell cracks that show up as a collapsed shunt resistance.
For the system around the module: the array sizing calculator turns a daily energy requirement into kilowatts of panels, the string V_oc calculator checks the coldest-morning open-circuit voltage against an inverter’s DC limit and the hottest afternoon against the bottom of its MPPT window, and the charge controller calculator sizes the controller and quantifies what MPPT gains over PWM. None of them draws the device curve; this page is where that lives.
Frequently asked questions
Why does the page need an ideality factor and a shunt resistance when my data sheet has neither?
Because the model has five parameters — I_ph, I₀, n, R_s and R_sh — and the data sheet gives four numbers. Something has to be assumed. The convention is to assume n and R_sh, which are physically bounded (n between 1 and about 1.5, R_sh from a few hundred ohms upwards for a healthy module) and to extract the other three. The page then gives you a way to check the assumption: it compares the power its model predicts with the data sheet’s own linear power coefficient, and if those two agree the assumption is sound.
The model’s maximum power point is not exactly the one on my data sheet. Why?
Because the extraction forces the curve to PASS THROUGH the data sheet’s stated maximum power point, and the curve’s own maximum is then wherever it falls — usually a fraction of a percent away in power and a little further in voltage. That gap is information: it is the amount by which the data sheet’s own four numbers are internally inconsistent with a single-diode model at the assumed n and R_sh.
What cell temperature should I use?
Not the air temperature. A module in full sun runs 25 to 35 °C above ambient on an open rack and more when it is flush-mounted on a roof with poor airflow behind it. The data sheet’s NOCT figure — the cell temperature at 800 W/m², 20 °C air and 1 m/s wind, typically 42 to 48 °C — is the usual starting point: cell temperature ≈ air + (NOCT − 20) × irradiance ÷ 800.
Can I model a string or an array rather than one module?
For identical modules in series, multiply V_oc, V_mp and the cell count by the number of modules and leave the currents alone. For modules in parallel, multiply the currents and leave the voltages. That is exact only if every module sees the same irradiance and the same temperature, which in practice they do not — the difference is mismatch loss, and it is not something this page can see.
Why does the fill factor fall when the module gets hot?
Because V_oc falls while I_sc barely moves, so the V_oc × I_sc rectangle shrinks mostly in one direction, and the knee of the curve softens as the thermal voltage rises. Series resistance takes a bigger share of a smaller voltage. The fill factor is a good single number for how square the curve is, and watching it fall with temperature is watching the mechanism.
Does this handle partial shading?
No, and that matters. One shaded cell in a series string limits the whole string’s current and is pushed into reverse bias by the others; the bypass diode across its sub-string then conducts and the curve develops a step. The result is a curve with more than one local power maximum, which this single-diode model cannot produce and which a poorly written MPPT tracker can lock onto the wrong side of. Shading is a different calculation.
Related calculators
References
- W. De Soto, S. A. Klein and W. A. Beckman, “Improvement and validation of a model for photovoltaic array performance”, Solar Energy, vol. 80, no. 1, 2006, pp. 78–88, doi:10.1016/j.solener.2005.06.010. The source of this page’s temperature and irradiance translation. Verified against the published paper: equation 8 gives a/a_ref = T_c/T_c,ref, equation 9 gives I_o/I_o,ref = (T_c/T_c,ref)³·exp[(1/k)(E_g/T|_ref − E_g/T|_Tc)], equation 10 gives E_g/E_g,ref = 1 − 0.0002677(T − T_ref), and equation 11 gives I_L = (S/S_ref)(M/M_ref)[I_L,ref + α_Isc(T_c − T_c,ref)]. The air-mass modifier M/M_ref is taken as 1 here.
- M. G. Villalva, J. R. Gazoli and E. R. Filho, “Comprehensive approach to modeling and simulation of photovoltaic arrays”, IEEE Transactions on Power Electronics, vol. 24, no. 5, 2009, pp. 1198–1208. The standard reference for extracting the single-diode parameters from a data sheet by adjusting R_s and R_sh until the modelled maximum power matches the stated one. This page’s extraction is the closed-form variant of the same idea: n and R_sh assumed, and R_s found from the maximum-power condition by bisection.
- IEC 61215 (design qualification and type approval of terrestrial photovoltaic modules) and IEC 61853-1 (irradiance and temperature performance measurements) define standard test conditions, NOCT and the low-light points a data sheet quotes. Cited by number; both are copyrighted and no values from them are reproduced here.
- IEC 60891 (procedures for temperature and irradiance corrections to measured I-V characteristics of crystalline silicon photovoltaic devices) is the standard governing the translation this page performs. Cited by number and title; the method used here is De Soto’s, which is published openly.
