Nota
Go to the end to download the full example code.
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 numpy as np
import pandas as pd
import plotly.express as px
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.177 seconds)