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

Aperta Adatta ai principianti
#2,929 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

@echedey-ls ci sta già lavorando.

Dal 1/11/2026.

  • #2930 di @echedey-ls — aperta

Valutazione

Difficoltà
1/5
Tempo stimato
Meno di un'ora
Idoneità per principianti
85/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
python
Ambito
documentation

Direzione di ricerca

Modifica la sezione Notes del docstring di pvlib.bifacial.power_mismatch_deline in pvlib/bifacial/loss_models.py, righe 118-132, rimuovendo il fattore di bifacialità extra dalla formula di conversione RMAD come mostra la derivazione nell'issue. Il codice della funzione non è interessato; verifica la formula corretta con lo snippet di riproduzione nell'issue, poi compila la documentazione per controllare che la matematica venga renderizzata.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

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
Lingua principale
Python
Stelle
1.7k
Fork
1.2k
Merge medio
3g 10h
PR unite (30g)
12

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di pvlib/pvlib-python

Tutte le issue di pvlib/pvlib-python

Issue simili

Altre issue su Python

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.