power_mismatch_deline docstring: the rear-to-total RMAD conversion has an extra bifaciality factor
Les mainteneurs répondent en général sous 1 jour
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 1/5
- Temps estimé
- Moins d'une heure
- Accessibilité débutants
- 85/100
- Type d'issue
- Bug
- Clarté
- Clairement spécifiée
- Activité
- Active
- Stack technique
- python
- Domaine
- documentation
Piste de recherche
Modifiez la section Notes du docstring de pvlib.bifacial.power_mismatch_deline dans pvlib/bifacial/loss_models.py, lignes 118-132, en supprimant le facteur de bifacialité superflu de la formule de conversion RMAD comme le montre la dérivation de l'issue. Le code de la fonction n'est pas concerné ; vérifiez la formule corrigée avec l'extrait de reproduction de l'issue, puis compilez la documentation pour vérifier le rendu des mathématiques.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Describe the bug
The Notes of pvlib.bifacial.power_mismatch_deline convert the RMAD of the rear irradiance to the RMAD of the total irradiance with one bifaciality factor too many. The docstring says
$$RMAD(k \cdot X + c) = RMAD(X) \cdot k \frac{k \bar{X}}{k \bar{X} + c} = RMAD(X) \cdot \frac{k}{1 + \frac{c}{k \bar{X}}}$$
and so
$$RMAD_{total} = RMAD_{rear} \frac{\phi_{Bifi}}{1 + \frac{G_{front}}{\phi_{Bifi} \bar{G}_{rear}}}$$
RMAD doesn't change with scale, though. For $Y = kX + c$, each $|Y_i - Y_j| = k |X_i - X_j|$ and $\bar{Y} = k\bar{X} + c$, so
$$RMAD(k \cdot X + c) = \frac{k \sum_i \sum_j |X_i - X_j|}{n^2 (k \bar{X} + c)} = RMAD(X) \cdot \frac{k \bar{X}}{k \bar{X} + c} = \frac{RMAD(X)}{1 + \frac{c}{k \bar{X}}}$$
which gives
$$RMAD_{total} = \frac{RMAD_{rear}}{1 + \frac{G_{front}}{\phi_{Bifi} \bar{G}_{rear}}}$$
Following the docstring understates the total RMAD by the factor $\phi_{Bifi}$, about 30 % for a bifaciality of 0.7, and so the mismatch loss as well. The function's code isn't affected: it takes the total RMAD as given. Only the formula in the Notes is.
To Reproduce
import numpy as np
rng = np.random.default_rng(0)
g_rear = rng.uniform(80, 160, 72) # W/m2, one value per cell
g_front = 900.0 # W/m2, uniform front
phi = 0.7 # bifaciality
g_total = g_front + phi * g_rear # Eq. (2) of Deline et al. (2020)
def rmad(x):
x = np.asarray(x, dtype=float)
return np.abs(x[:, None] - x[None, :]).sum() / (x.size**2 * x.mean())
rmad_rear = rmad(g_rear)
print(rmad(g_total)) # 0.0193862763
print(rmad_rear / (1 + g_front / (phi * g_rear.mean()))) # 0.0193862763
print(rmad_rear * phi / (1 + g_front / (phi * g_rear.mean()))) # 0.0135703934, the docstring's form
Expected behavior
The Notes would read $RMAD(k \cdot X + c) = RMAD(X) \cdot \frac{k \bar{X}}{k \bar{X} + c} = \frac{RMAD(X)}{1 + \frac{c}{k \bar{X}}}$, and $RMAD_{total} = \frac{RMAD_{rear}}{1 + \frac{G_{front}}{\phi_{Bifi} \bar{G}_{rear}}}$. The text is in pvlib/bifacial/loss_models.py, lines 118–132 on main today.
Versions:
pvlib.__version__: 0.16.1 (the same text is onmain)pandas.__version__: 3.0.6- python: 3.12.15
- Langage dominant
- Python
- Étoiles
- 1.7k
- Forks
- 1.2k
- Merge moyen
- 3 j 10 h
- PR mergées (30 j)
- 12
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Propose un modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de pvlib/pvlib-python
-
documentation
Difficulté 1/5 Moins d'une heure Accessibilité débutants 72/100
pvlib/pvlib-python#2921 · 2 commentaires · 2 réactions ·
Les mainteneurs répondent en général sous 1 jour
-
Possibility of beam irradiance from behind plane of arrayPeut-être à nouveau libre Une pull request pour cette issue a été fermée sans être fusionnée. Ouvertebug
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
pvlib/pvlib-python#2903 · 5 commentaires · 2 réactions ·
Les mainteneurs répondent en général sous 1 jour
-
use offset parameter instead of calculating bday in cdromPeut-être pris @chenyi6758-source l’a pris il y a 12 jours. Ouverte
Difficulté 1/5 Moins d'une heure Accessibilité débutants 92/100
pvlib/pvlib-python#2902 ·
Les mainteneurs répondent en général sous 1 jour
-
Add an example or documentation on using 'bhi' from ERA5Peut-être à nouveau libre @anshurajbisoyi98-ctrl l’a pris il y a 27 jours, et aucune pull request n’est ouverte. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 66/100
pvlib/pvlib-python#2880 · 2 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
Use "long-wave" rather than "infra-red" to refer to thermal radiation.Peut-être à nouveau libre @Rahi-padwal l’a pris il y a 265 jours, et aucune pull request n’est ouverte. Ouverteapi easy
Difficulté 2/5 1-3 heures Accessibilité débutants 62/100
pvlib/pvlib-python#2653 · 6 commentaires ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de pvlib/pvlib-python
Issues similaires
-
Keybind quest outdatedOuverteStatus: Triage Type: Quest
Difficulté 2/5 1-3 heures Accessibilité débutants 66/100
GTNewHorizons/GT-New-Horizons-Modpack#27490 ·
Les mainteneurs répondent en général sous 1 jour
-
Bug
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
Les mainteneurs répondent en général sous 1 jour
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
retentioneering/retentioneering-tools#231 ·
Les mainteneurs répondent en général sous 1 jour
-
backend bug documentation
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
geolens-io/geolens#3568 ·
Les mainteneurs répondent en général sous 1 jour
-
enhancement
Difficulté 1/5 Moins d'une heure Accessibilité débutants 88/100
mprov-ng/mprov_control_center#450 ·
Les mainteneurs répondent en général sous 1 jour