diff --git a/docs/sphinx/source/whatsnew/v0.13.3.rst b/docs/sphinx/source/whatsnew/v0.13.3.rst index 1df727e708..d6b619ca81 100644 --- a/docs/sphinx/source/whatsnew/v0.13.3.rst +++ b/docs/sphinx/source/whatsnew/v0.13.3.rst @@ -14,6 +14,9 @@ Deprecations Bug fixes ~~~~~~~~~ +* Fix a division-by-zero condition in + :py:func:`pvlib.transformer.simple_efficiency` + when ``load_loss = 0``. (:pull:`2646`) Enhancements diff --git a/pvlib/transformer.py b/pvlib/transformer.py index 3b66b0beb3..3fea282e2b 100644 --- a/pvlib/transformer.py +++ b/pvlib/transformer.py @@ -111,7 +111,8 @@ def simple_efficiency( b = 1 c = no_load_loss - input_power_normalized - output_power_normalized = (-b + (b**2 - 4*a*c)**0.5) / (2 * a) + disc = (b*b - 4*a*c)**0.5 + output_power_normalized = 2*c / (-b - disc) output_power = output_power_normalized * transformer_rating return output_power diff --git a/tests/test_transformer.py b/tests/test_transformer.py index 0739a9e95a..51d4e3c32e 100644 --- a/tests/test_transformer.py +++ b/tests/test_transformer.py @@ -1,7 +1,7 @@ import pandas as pd +import pytest from numpy.testing import assert_allclose - from pvlib import transformer @@ -58,3 +58,24 @@ def test_simple_efficiency_known_values(): *args), rating, ) + + +@pytest.mark.parametrize( + "input_power, no_load_loss, load_loss, transformer_rating, expected", + [ + (1000.0, 0.01, 0.0, 1000.0, 990.0), + ], +) +def test_simple_efficiency_zero_load_loss( + input_power, no_load_loss, load_loss, transformer_rating, expected +): + # for load_loss = 0, the model reduces to: + # P_out = P_in - L_no_load * P_nom + result = transformer.simple_efficiency( + input_power=input_power, + no_load_loss=no_load_loss, + load_loss=load_loss, + transformer_rating=transformer_rating, + ) + + assert_allclose(result, expected)