Skip to content

Commit 337d7b4

Browse files
committed
MAINT: use np.expm1(x) for exp(x) - 1 in bishop88 single diode method
* closes pvlib#500 * also add a comment that we are creating some temporary values to make calculations simpler * also use more descriptive names instead of a, b, c, use v_star, g_sh, and g_diode
1 parent 8d86560 commit 337d7b4

File tree

1 file changed

+8
-6
lines changed

1 file changed

+8
-6
lines changed

pvlib/singlediode_methods.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -97,19 +97,21 @@ def bishop88(diode_voltage, photocurrent, saturation_current, resistance_series,
9797
:math:`\\frac{dI}{dV}`, :math:`\\frac{dP}{dV}`, and
9898
:math:`\\frac{d^2 P}{dV dV_d}`
9999
"""
100-
a = np.exp(diode_voltage / nNsVth)
101-
b = 1.0 / resistance_shunt
102-
i = photocurrent - saturation_current * (a - 1.0) - diode_voltage * b
100+
# calculate temporary values to simplify calculations
101+
v_star = diode_voltage / nNsVth # non-dimensional diode voltage
102+
g_sh = 1.0 / resistance_shunt # conductance
103+
i = (photocurrent - saturation_current * np.expm1(v_star)
104+
- diode_voltage * g_sh)
103105
v = diode_voltage - i * resistance_series
104106
retval = (i, v, i*v)
105107
if gradients:
106-
c = saturation_current * a / nNsVth
107-
grad_i = - c - b # di/dvd
108+
g_diode = saturation_current * np.exp(v_star) / nNsVth # conductance
109+
grad_i = -g_diode - g_sh # di/dvd
108110
grad_v = 1.0 - grad_i * resistance_series # dv/dvd
109111
# dp/dv = d(iv)/dv = v * di/dv + i
110112
grad = grad_i / grad_v # di/dv
111113
grad_p = v * grad + i # dp/dv
112-
grad2i = -c / nNsVth # d2i/dvd
114+
grad2i = -g_diode / nNsVth # d2i/dvd
113115
grad2v = -grad2i * resistance_series # d2v/dvd
114116
grad2p = (
115117
grad_v * grad + v * (grad2i/grad_v - grad_i*grad2v/grad_v**2)

0 commit comments

Comments
 (0)