pvlib / pvlib-python

A set of documented functions for simulating the performance of photovoltaic energy systems.
https://pvlib-python.readthedocs.io
BSD 3-Clause "New" or "Revised" License
1.19k stars 997 forks source link

Single Diode Model error when low effective irradiance (pvlib==0.10.2) #1993

Open OnairSandra opened 7 months ago

OnairSandra commented 7 months ago

pvlib usage questions can be asked on Stack Overflow and tagged with the pvlib tag.

The pvlib-python google group is used for discussing various topics of interest to the pvlib-python community. We also make new version announcements on the google group.

I get a ValueError when using single diode model with lambertw method. p_mp, v_mp = _golden_sect_DataFrame(params, 0., v_oc * 1.14, _pwr_optfcn) raise ValueError('upper >= lower is required')

I've seen some issues that may be related, because newton method doesn't raise any error, and I've some very low irradiance values: https://github.com/pvlib/pvlib-python/issues/1673 https://github.com/pvlib/pvlib-python/issues/1843

Debugging lambertw method, I found the following:

Set small elements <0 in v_oc to 0

if isinstance(v_oc, np.ndarray):
    v_oc[(v_oc < 0) & (v_oc > -1e-12)] = 0.

In my case, there are some v_oc values under 0, but no so close to zero as -1e-12 v_oc[(v_oc < 0)] = array([-0.00024414, -0.00097656, -0.00195312, -0.00390625, -0.00390625])

Questions:

Is there any reason to not filter every negative value in v_oc? May I use newton method to avoid this error?

Environment:

Python version: 3.10 pvlib version: 0.10.2

cwhanse commented 7 months ago

@OnairSandra when we've looked at similar reports, the root cause has been very low (e.g. 1e-9) values for effective irradiance. The solution has been to filter the effective irradiance before calling the calc_params and singlediode functions.

To know for certain you would need to provide code and some data.

Or you can try singlediode(...., method='newton'...) which finds the maximum power point with a different method.

OnairSandra commented 7 months ago

Thanks for answering, @cwhanse! By the moment I'll use newton method. So, can I assume that there is a reason for not filtering every negative value in v_oc estimation before using golden_sect_DataFrame?

cwhanse commented 7 months ago

If we have a reason to not filter, it's to avoid covering up numerical bugs by replacing bad values with 0.