# Flujo de carga radial: cálculo y comprobación

Actualización: 20 octubre 2026. Disponible en **Evaluar zonas candidatas → Simular pérdidas y tensión de un alimentador**, en español e inglés. Importación y exportación locales; no requiere subir datos a un servidor.

## Qué mejora

Se añade un motor de flujo de carga que resuelve corriente y tensión conjuntamente a partir de conexiones, cargas P/Q e impedancias explícitas. No supone tensión uniforme en todos los nodos, factor de potencia 1 ni ocupación del 80%. Resuelve cada escenario temporal antes de integrar pérdidas; las pérdidas al promedio de la carga no equivalen al promedio de sus pérdidas.

Esto amplía el cálculo disponible: **no cambia los coeficientes del mapa ni convierte automáticamente el inventario CFE en una red operativa**. La comparación normativa de transformadores conserva su alcance parcial. El cálculo con RMS medido existente sigue siendo apropiado cuando se dispone de corrientes reales; no fue sustituido por este estimador.

## Método y unidades

- Red radial equilibrada, equivalente de secuencia positiva, un nivel de tensión. Cargas de potencia compleja constante por nodo; P/Q son totales trifásicos. Negativos representan generación neta, sin regulación automática de tensión.
- `sourceVoltageKv`: tensión de cabecera línea–línea; `nominalVoltageKv`: base para p.u. Ambos en kV, no kVA. Cada escenario declara tensión de cabecera.
- `rOhm` y `xOhm`: impedancia serie **por fase del tramo completo**, en ohms a condición de operación documentada; no ohm/km ni impedancia trifásica sumada. No se infieren desde códigos de calibre sin un diccionario y longitud comprobados.
- Por fase: `I_n = conj((P_n + j Q_n) / (3 V_n))`. Barrido hacia cabecera suma corrientes; barrido hacia las cargas calcula `V_hijo = V_padre − (R + j X) I_rama`.
- Por tramo: `P_pérdida = 3 |I|² R / 1000` en kW. Energía del escenario = pérdida × duración en horas. Q y X afectan corriente y caída de tensión; potencia reactiva no se interpreta como energía activa desperdiciada.
- Convergencia: cambio de tensión ≤ `1e-10 p.u.`, máximo 200 iteraciones. Se comprueban además residuo de ecuaciones de tensión y balance de potencia activa/reactiva. Casos no convergentes se rechazan; no se usa la última iteración como resultado válido.
- Importación/exportación se contabilizan por separado en la cabecera y por escenario, sin sumar generación dos veces.

Se rechazan nodos duplicados, cargas ausentes, ciclos, islas, impedancias inválidas, huecos temporales y solapamientos. Se admiten ramas en cualquier orden, dirigidas desde cabecera. Una malla requiere otro motor. Las restricciones térmicas sólo se evalúan donde existe ampacidad y fuente explícitas; los límites de tensión también requieren fuente, sin un umbral regulatorio supuesto. La exportación incluye todas las entradas para reproducir el resultado.

## Comprobación numérica ejecutada

Datos: [MATPOWER 6.0, case33bw](https://matpower.org/docs/ref/matpower6.0/case33bw.html), procedentes de Baran y Wu (1989), DOI [10.1109/61.25627](https://doi.org/10.1109/61.25627). Se transcriben los datos numéricos de 33 nodos, 32 ramas cerradas, 3,715 kW y 2,300 kvar, a 12.66 kV. Se excluyen las cinco conexiones normalmente abiertas. Es un sistema de prueba publicado, no una muestra de activos de Hermosillo. La fuente no proporciona ampacidades utilizables: se conservan desconocidas.

| Método                                                 |   Pérdidas kW | Tensión mínima p.u. |
| ------------------------------------------------------ | ------------: | ------------------: |
| Motor de IRVEN, barrido de corrientes                  | 202.677126453 |      0.913090479369 |
| Comprobador separado, Newton–Raphson nodal rectangular | 202.677126456 |      0.913090479361 |
| Resultado publicado redondeado, Badran et al. (2018)   |       202.677 |               0.913 |

El comprobador separado usa ecuaciones nodales y Jacobiano por diferencias finitas, sin llamar al barrido para construir su referencia. La diferencia de pérdidas entre métodos es `2.49e-9 kW`; la diferencia máxima de tensión es `7.82e-12 p.u.`. Es consistencia numérica sobre los mismos datos, **no precisión frente a mediciones reales**. La referencia externa redondeada está en [Badran et al., DOI 10.1049/iet-gtd.2017.0595](https://doi.org/10.1049/iet-gtd.2017.0595).

Como comparación metodológica, una aproximación de cargas aguas abajo a tensión nominal fija estima 176.361797 kW: subestima 12.98% frente a la solución AC del caso. Esa aproximación ilustrativa **no es el calculador existente con RMS medido ni una medición del error anterior de IRVEN**. La mejora demostrada corresponde a resolver ese caso en lugar de simplificar su tensión.

Resultados completos y huellas de código/datos: [radial-power-flow-audit.json](radial-power-flow-audit.json). Pruebas adicionales: solución analítica de dos nodos, flujo inverso, reactiva, umbrales explícitos, integración con duración desigual, variación de carga, errores de topología y datos incompletos. Ningún parámetro se ajustó para forzar los valores publicados.

Verificación del proyecto: 159 pruebas unitarias, cuatro de exportación/SEO, TypeScript y lint aprobados. Exportación estática con webpack aprobada utilizando copias reales locales de Geist para evitar la descarga de Google Fonts bloqueada en este entorno; no se cambió la configuración de fuentes del proyecto. Se añadió prueba de navegador de importación/exportación para escritorio y móvil, pendiente de ejecución por bloqueo `listen EPERM` del servidor local y fallo de inicio de Chrome. No hay revisión visual aprobada ni despliegue en esta iteración.

```sh
node scripts/energy/audit_radial_power_flow.mjs
node --test tests/radial-power-flow.test.mjs
```

## Formato de entrada

Ejemplo **sintético exclusivamente para probar el formato**, sin datos de CFE ni precisión local. Puede copiarse a un archivo `.json`. El sistema no lo precarga como medición.

```json
{
  "circuit": {
    "schemaVersion": 1,
    "phaseModel": "balanced-positive-sequence",
    "source": "Ejemplo sintético, no mediciones",
    "boundary": "Circuito sintético de dos nodos",
    "topologyReference": "Una rama cerrada, sin derivaciones externas",
    "impedanceSource": "Parámetros sintéticos R/X por fase del tramo completo",
    "loadSource": "Escenario sintético PQ constante",
    "inputOrigin": "scenario",
    "limitations": ["Ejemplo QA, no representa una instalación real"],
    "sourceBus": "cabecera",
    "sourceVoltageKv": 13.8,
    "nominalVoltageKv": 13.8,
    "buses": [
      { "id": "cabecera", "pKw": 0, "qKvar": 0 },
      { "id": "carga", "pKw": 100, "qKvar": 40 }
    ],
    "branches": [{ "id": "tramo-1", "from": "cabecera", "to": "carga", "rOhm": 0.2, "xOhm": 0.1 }]
  },
  "startedAt": "2026-10-01T00:00:00-07:00",
  "endedAt": "2026-10-01T00:15:00-07:00",
  "samples": [
    {
      "startedAt": "2026-10-01T00:00:00-07:00",
      "endedAt": "2026-10-01T00:15:00-07:00",
      "sourceVoltageKv": 13.8,
      "loads": [
        { "id": "cabecera", "pKw": 0, "qKvar": 0 },
        { "id": "carga", "pKw": 100, "qKvar": 40 }
      ]
    }
  ]
}
```

`inputOrigin` admite `measured` o `scenario`, una declaración del proveedor, no una certificación de IRVEN. Las cargas de `circuit.buses` describen el circuito base; cada escenario debe aportar todos los nodos, incluidos ceros explícitos de cabecera. Las cargas de cada escenario sustituyen las de base. Los intervalos representan puntos de operación constantes por tramos: aplicar promedios de P/Q no resuelve su variación interna. Una curva más fina debe proceder de datos o escenarios documentados, no de interpolaciones presentadas como mediciones.

Opcionales: por rama, `ampacityA` junto con `ampacitySource`; por circuito, `voltageLimits: {"minPu": 0.95, "maxPu": 1.05, "source": "Criterio específico documentado"}`. Los números son un ejemplo, no límites normativos verificados de México. Máximos: 10 MB en interfaz, 500 nodos, 672 escenarios y 100,000 combinaciones nodo/escenario.

## Datos y técnicas investigados

- [EPRI/OpenDSS, Power Flow](https://opendss.epri.com/PowerFlow.html) y [LoadShape](https://opendss.epri.com/LoadShape.html): referencia para resolver condiciones temporales y separar potencia de energía. OpenDSS soporta análisis multifásico mucho más amplio; el motor de esta iteración es propio y de alcance equilibrado, no una ejecución de OpenDSS.
- [EPRI/OpenDSS, State Estimation](https://opendss.epri.com/OpenDSSandStateEstimation.html): ajustar cargas con mediciones de cabecera/sensores y comprobar condiciones de operación. Técnica apropiada para la siguiente calibración, pendiente de datos locales; no se repartió una demanda total arbitrariamente entre bancos.
- [OEDI/NREL, SMART-DS](https://data.openei.org/submissions/2981): redes sintéticas y curvas P/Q de 15 minutos para pruebas de algoritmos. No se incorporaron como cargas mexicanas. La búsqueda permitió identificar el conjunto; la descarga del portal no se completó (HTTP 429).
- [CFE, PAM RGD 2025–2039](https://www.cfe.gob.mx/distribucion/cumplimiento/Documents/Programa%20de%20Ampliaci%C3%B3n%20y%20Modernizaci%C3%B3n%20de%20las%20Redes%20Generales%20de%20Distribuci%C3%B3n%202025-2039.pdf): planificación y referencias agregadas. No identifica por sí solo margen operativo para un terreno. El intento de recuperar la edición `V20251210 VP` falló (HTTP 502); no se declara una actualización de datos del mapa.

## Para medir precisión local

Obtener de un alimentador documentado conexiones/interruptores, P/Q sincronizados por nodo o cargas asignadas con evidencia, tensión de cabecera, impedancias por fase, temperatura de operación y generación. Reservar fechas y, después, otros circuitos para evaluación fuera del ajuste. Comparar tensión por nodo y potencia de cabecera con mediciones independientes; reportar MAE/sesgo, peores errores y cobertura por temporada. Para pérdidas se necesita frontera y metrología compatibles: la resta de dos medidores puede tener incertidumbre relevante respecto a una pérdida pequeña. Un ajuste a potencia de cabecera no valida automáticamente cada nodo o pérdidas internas.

Se excluyen pérdidas de transformadores, desbalance/neutro, reguladores, bancos de capacitores con control, shunts, armónicos, mallas y eventos de protección. Usar OpenDSS u otro motor multifásico contrastado cuando importen estos efectos. El inventario cartográfico no basta para asegurar el estado real de interruptores ni qué usuarios abastece cada banco. No se calcula capacidad disponible de nueva demanda, N−1 ni dictamen de conexión.
