power_mismatch_deline docstring: the rear-to-total RMAD conversion has an extra bifaciality factor
I maintainer di solito rispondono entro 1 giorno
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 onmain)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
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di pvlib/pvlib-python
-
documentation
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 72/100
pvlib/pvlib-python#2921 · 2 commenti · 2 reazioni ·
I maintainer di solito rispondono entro 1 giorno
-
Possibility of beam irradiance from behind plane of arrayForse di nuovo libera Una pull request per questa issue è stata chiusa senza essere unita. Apertabug
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
pvlib/pvlib-python#2903 · 5 commenti · 2 reazioni ·
I maintainer di solito rispondono entro 1 giorno
-
use offset parameter instead of calculating bday in cdromForse già presa @chenyi6758-source l’ha presa 13 giorni fa. Aperta
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 92/100
pvlib/pvlib-python#2902 ·
I maintainer di solito rispondono entro 1 giorno
-
Add an example or documentation on using 'bhi' from ERA5Forse di nuovo libera @anshurajbisoyi98-ctrl l’ha presa 28 giorni fa e non c’è nessuna pull request aperta. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 66/100
pvlib/pvlib-python#2880 · 2 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
Use "long-wave" rather than "infra-red" to refer to thermal radiation.Forse di nuovo libera @Rahi-padwal l’ha presa 265 giorni fa e non c’è nessuna pull request aperta. Apertaapi easy
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
pvlib/pvlib-python#2653 · 6 commenti ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di pvlib/pvlib-python
Issue simili
-
PluginProvider.storeInstance races and clobbers the dedup cache for concurrent loadsForse già presa @Wilson0511 l’ha presa oggi. Apertaneeds-triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
I maintainer di solito rispondono entro 2 giorni
-
community documentation good first issue
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
-
bug(sdk): add_toleration_json silently drops camelCase tolerationSeconds for static dict/list inputForse già presa @ravikumar266 l’ha presa oggi. Apertaarea/sdk kind/bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
kubeflow/pipelines#15347 · 3 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
predict_file with crop_model duplicates predictions once per imageForse già presa Una pull request collegata a questa issue è aperta o già unita. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
weecology/DeepForest#1445 ·