Análise dos cortes de Benders e política operativa

O arquivo cortes.dat (binário) contém os cortes de Benders gerados durante o processo de otimização do NEWAVE. Estes cortes definem a política operativa do sistema hidrotérmico, representando o valor futuro da água em função do estado do sistema.

import plotly.io as pio

from inewave.newave import Cortes

pio.templates.default = "ggplot2"

Leitura dos cortes de Benders

IMPORTANTE: A leitura dos cortes requer configuração específica baseada nas dimensões do caso de estudo. Estes parâmetros devem corresponder exatamente às configurações utilizadas na execução do NEWAVE: IMPORTANTE: Foi gerado um arquivo cortes.dat reduzido utlizando o próprio módulo inewave para fins de demonstração com apenas 1 corte. Em um caso real, utilize o arquivo gerado pelo NEWAVE.

tamanho_registro = 17568
indice_ultimo_corte = 1
numero_total_cortes = 1
codigos_rees = [1, 6, 7, 5, 10, 12, 2, 11, 3, 4, 8, 9]
codigos_uhes = list(range(154))
codigos_submercados = [1, 2, 3, 4]
ordem_maxima_parp = 12
lag_maximo_gnl = 2

print("Configuração da leitura dos cortes:")
print(f"- Tamanho do registro: {tamanho_registro} bytes")
print(f"- Último corte válido: {indice_ultimo_corte}")
print(f"- Total de cortes: {numero_total_cortes}")
print(f"- REEs: {codigos_rees}")
print(f"- Submercados: {codigos_submercados}")

# Leitura do arquivo cortes.dat
arq_cortes = Cortes.read(
    "./newave/cortes.dat",
    tamanho_registro=tamanho_registro,
    indice_ultimo_corte=indice_ultimo_corte,
    numero_total_cortes=numero_total_cortes,
    codigos_rees=codigos_rees,
    codigos_uhes=codigos_uhes,
    codigos_submercados=codigos_submercados,
    ordem_maxima_parp=ordem_maxima_parp,
    lag_maximo_gnl=lag_maximo_gnl,
)
Configuração da leitura dos cortes:
- Tamanho do registro: 17568 bytes
- Último corte válido: 1
- Total de cortes: 1
- REEs: [1, 6, 7, 5, 10, 12, 2, 11, 3, 4, 8, 9]
- Submercados: [1, 2, 3, 4]

Estrutura dos cortes de Benders

Analisando a estrutura e conteúdo dos cortes:

cortes = arq_cortes.cortes
print(f"Total de cortes válidos: {len(cortes)}")
print(f"Colunas disponíveis: {len(cortes.columns)}")

print("\nPrimeiros registros:")
print(cortes.head())
Total de cortes válidos: 1
Colunas disponíveis: 185

Primeiros registros:
   indice_corte  ...  pi_gnl_sbm4_pat3_lag2
0             1  ...                 40.611

[1 rows x 185 columns]

Análise dos coeficientes dos cortes

Examinando os coeficientes que definem o valor da água:

print("Análise dos coeficientes dos cortes:")

# Identificando colunas de coeficientes (começam com "pi_")
colunas_pi = [col for col in cortes.columns if col.startswith("pi_")]
print(f"Número de coeficientes por corte: {len(colunas_pi)}")

if len(colunas_pi) > 0:
    # Estatísticas dos coeficientes
    coeficientes_stats = cortes[colunas_pi].describe()
    print("\nEstatísticas dos coeficientes:")
    print(f"- Valor médio: {coeficientes_stats.loc['mean'].mean():.6f}")
    print(f"- Mínimo global: {coeficientes_stats.loc['min'].min():.6f}")
    print(f"- Máximo global: {coeficientes_stats.loc['max'].max():.6f}")

    # Analisando coeficientes de EARM (valor da água armazenada)
    colunas_earm = [col for col in colunas_pi if "earm" in col.lower()]
    if len(colunas_earm) > 0:
        print(f"\nAnálise dos coeficientes de EARM ({len(colunas_earm)} REEs):")

        for col in colunas_earm[:5]:  # Primeiros 5 para não sobrecarregar
            ree_num = col.split("_")[-1] if "_" in col else "N/A"
            valores = cortes[col]
            print(f"- {col} (REE {ree_num}):")
            print(f"  Média: {valores.mean():.4f}")
            print(f"  Min: {valores.min():.4f}, Max: {valores.max():.4f}")

    # Analisando coeficientes de ENA (valor da energia afluente)
    colunas_ena = [col for col in colunas_pi if "ena" in col.lower()]
    if len(colunas_ena) > 0:
        print(f"\nAnálise dos coeficientes de ENA ({len(colunas_ena)} termos):")

        # Agrupando por lag
        ena_por_lag = {}
        for col in colunas_ena:
            if "lag" in col:
                lag = col.split("lag")[-1]
                if lag not in ena_por_lag:
                    ena_por_lag[lag] = []
                ena_por_lag[lag].append(col)

        for lag, cols in list(ena_por_lag.items())[:3]:  # Primeiros 3 lags
            valores_lag = cortes[cols].mean(
                axis=1
            )  # Média entre REEs para cada corte
            print(f"- Lag {lag}: Média: {valores_lag.mean():.6f}")
Análise dos coeficientes dos cortes:
Número de coeficientes por corte: 180

Estatísticas dos coeficientes:
- Valor médio: 276.059043
- Mínimo global: -174.659130
- Máximo global: 6772.083260

Análise dos coeficientes de EARM (12 REEs):
- pi_earm_ree1 (REE ree1):
  Média: -1.2185
  Min: -1.2185, Max: -1.2185
- pi_earm_ree6 (REE ree6):
  Média: -2.5457
  Min: -2.5457, Max: -2.5457
- pi_earm_ree7 (REE ree7):
  Média: -1.2185
  Min: -1.2185, Max: -1.2185
- pi_earm_ree5 (REE ree5):
  Média: -2.5420
  Min: -2.5420, Max: -2.5420
- pi_earm_ree10 (REE ree10):
  Média: -1.1970
  Min: -1.1970, Max: -1.1970

Análise dos coeficientes de ENA (144 termos):
- Lag 1: Média: 483.088869
- Lag 2: Média: 537.230787
- Lag 3: Média: 544.047427

Total running time of the script: (0 minutes 0.194 seconds)

Gallery generated by Sphinx-Gallery