power_mismatch_deline docstring: the rear-to-total RMAD conversion has an extra bifaciality factor

Ouverte Adaptée aux débutants
#2,929 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

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 on main)
  • 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

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de pvlib/pvlib-python

Toutes les issues de pvlib/pvlib-python

Issues similaires

Plus d'issues Python

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.