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

Cerrado Apto para principiantes
#2,929 2 comentarios 1 reacción 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

Ya se ha fusionado un pull request relacionado.

  • #2930 de @echedey-ls — fusionado

Evaluación

Dificultad
1/5
Tiempo estimado
Menos de una hora
Aptitud para principiantes
85/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
python

Línea de trabajo

Edita la sección Notes del docstring de pvlib.bifacial.power_mismatch_deline en pvlib/bifacial/loss_models.py, líneas 118-132, eliminando el factor de bifacialidad adicional de la fórmula de conversión RMAD como muestra la derivación del issue. El código de la función no se ve afectado; verifica la fórmula corregida con el fragmento de reproducción del issue y luego compila la documentación para comprobar que la fórmula matemática se renderiza correctamente.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

bug documentation

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
Lenguaje dominante
Python
Estrellas
1.7k
Forks
1.2k
Merge medio
3 d 6 h
PR fusionados (30 d)
12

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de pvlib/pvlib-python

Todos los issues de pvlib/pvlib-python

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.