-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Closed
Labels
Description
Describe the bug
the disc method has a lot of power and polynomials. IMO whenever possible, polynomials should use Horner's method which is already implemented in np.polyval
but is easy to reimplement if needed.
To Reproduce
pvlib-python/pvlib/irradiance.py
Lines 1405 to 1422 in 8b98768
# powers of kt will be used repeatedly, so compute only once | |
kt2 = kt * kt # about the same as kt ** 2 | |
kt3 = kt2 * kt # 5-10x faster than kt ** 3 | |
bools = (kt <= 0.6) | |
a = np.where(bools, | |
0.512 - 1.56*kt + 2.286*kt2 - 2.222*kt3, | |
-5.743 + 21.77*kt - 27.49*kt2 + 11.56*kt3) | |
b = np.where(bools, | |
0.37 + 0.962*kt, | |
41.4 - 118.5*kt + 66.05*kt2 + 31.9*kt3) | |
c = np.where(bools, | |
-0.28 + 0.932*kt - 2.048*kt2, | |
-47.01 + 184.2*kt - 222.0*kt2 + 73.81*kt3) | |
delta_kn = a + b * np.exp(c*am) | |
Knc = 0.866 - 0.122*am + 0.0121*am**2 - 0.000653*am**3 + 1.4e-05*am**4 |
0.512 - 1.56*kt + 2.286*kt2 - 2.222*kt3
becomes
0.512 - kt * (1.56 + kt * (2.286 - 2.222 * kt))
or
np.polyval([-2.222, 2.286, -1.56, 0.512], kt)
Expected behavior
a few math tricks like this (atan2, log1p, Horner's method, etc.) are musts for efficiency and numerical stability.
Versions:
pvlib.__version__
: 0.8.1