Aluno: Luís Fernando Oliveira Guedes
Professor: Antonio Guilherme Garcia Lima, DSc.
2024-11-13
Localizada no Rio Iguaçu, no município de Saudade do Iguaçu, no Paraná, a Usina Hidrelétrica Salto Santiago está em operação desde 1980, com concessão válida até 2028. Este empreendimento utiliza um reservatório de acumulação com área de 208 km², que sustenta uma capacidade instalada de 1.420 MW, distribuída em quatro unidades geradoras de 355 MW cada, equipadas com turbinas verticais do tipo Francis. Essas turbinas passaram por um processo de modernização entre 2014 e 2017, garantindo uma operação eficiente. A usina possui uma garantia física de 733,3 MW médios para comercialização.
A Bacia do Iguaçu, localizada na região sul do Brasil, é uma das principais bacias hidrográficas do país e possui grande importância para a geração de energia elétrica. O Rio Iguaçu, que percorre mais de mil quilômetros, atravessa o estado do Paraná e conta com uma série de usinas hidrelétricas ao longo de seu curso. Essas usinas desempenham um papel essencial no suprimento energético regional e nacional, aproveitando o potencial hidráulico do rio para geração de eletricidade. Dentre as usinas situadas na bacia, destacam-se as de Baixo Iguaçu, Gov. José Richa, Salto Osório, Segredo, Foz do Areia e, especialmente, a Usina Hidrelétrica Salto Santiago.
A etapa inicial do trabalho consistiu em obter as bases de dados necessárias para a análise. Para isso, foram baixados os dados específicos da usina, disponíveis no site do ONS, com registros diários desde 1º de janeiro de 2000 até a data inical do estudo (05/10/2024). As informações coletadas incluíram vazão afluente, vertida, defluente, transferida e de outras estruturas, todas em m³/s, além do nível de montante diário em metros, geração de energia horária em MWm, volume útil diário em porcentagem, energia natural afluente bruta e energia armazenada no subsistema da usina, e o custo marginal de operação semanal. Além desses dados, também foram baixados os arquivos Hidr.xls e as vazões naturais afluentes, diárias e mensais, contendo informações de todas as hidrelétricas do Sistema Interligado Nacional (SIN), disponíveis no portal SINtegre do ONS.
Abixo é possível analisar o gráfico Volume x Cota da UHE Salto Santiago. De acordo com o arquivo .Hidr desta usina, seu volume máximo é de cerca de 6775 hm³ e seu volume mínimo 2662 hm³. Além disso, a cota máxima é de 506 m e a cota mínima de 481 m.
setwd("C:/Trabalho_Geracao")
hidr <- read.csv2("Hidr.csv")
# Gráfico de Volume x Cota
volumes <- seq(hidr$Vol.Máx..hm3., hidr$Vol.min..hm3., length.out = 1000)
cotas <- (hidr$PCV.4.*volumes^4) + (hidr$PCV.3.*volumes^3) + (hidr$PCV.2.*volumes^2) +
(hidr$PCV.1.*volumes^1) + (hidr$PCV.0.)
plot(volumes, cotas, type = "o", col = "black",
xlab = "Volume (hm³)", ylab = "Cota (m)",
main = "Gráfico Volume x Cota",
pch = 20,
cex = 0.7,
lwd = 1)
grid()
setwd("C:/Trabalho_Geracao")
# Carregar o script que contém a leitura dos dados
# Gráfico de Cota x Área
area_max <- 208 # km²
area_min <- 122.91 # km²
areas <- seq(area_min, area_max, length.out = 1000)
cotas_2 <- (hidr$PAC.4.[1] * areas^4) + (hidr$PAC.3.[1] * areas^3) +
(hidr$PAC.2.[1] * areas^2) + (hidr$PAC.1.[1] * areas) + hidr$PAC.0.[1]
plot(cotas_2, areas, type = "o", col = "black",
xlab = "Cota (m)", ylab = "Área (km²)",
main = "Gráfico Cota x Área",
pch = 10,
cex = 0.7,
lwd = 2)
grid()
A precipitação é a entrada de água da atmosfera para o reservatório, enquanto a evaporação e a transpiração devolvem parte dessa água para a atmosfera, formando o processo de evapotranspiração. No solo, ocorre a infiltração, onde a água penetra e pode alimentar o sistema de águas subterrâneas, enquanto as nascentes contribuem com a vazão afluente para o reservatório. A água armazenada nos rios e reservatórios pode ser direcionada para o escoamento superficial ou para o escoamento defluente, demonstrando a complexa interação entre atmosfera, solo e corpos d’água que sustenta o ciclo hidrológico.
setwd("C:/Trabalho_Geracao")
hidr <- read.csv2("Hidr.csv")
# Determinar a Área do reservatório (em km²) - MÁX, MÍN E MÉDIA.
area_max <- 208 # km² (informado no site da ENGIE - SALTO SANTIAGO)
area_min <- 122.91 # km² (informado no site da ENGIE - SALTO SANTIAGO)
area_media <- (area_max + area_min) / 2
# Evaporação mensal - Dados de Evaporação mensal (Dado em mm)
evap_mensal_mm <- c(hidr$Evap.Men..1., hidr$Evap.Men..2., hidr$Evap.Men..3., hidr$Evap.Men..4.,
hidr$Evap.Men..5., hidr$Evap.Men..6., hidr$Evap.Men..7., hidr$Evap.Men..8.,
hidr$Evap.Men..9., hidr$Evap.Men..10., hidr$Evap.Men..11., hidr$Evap.Men..12.)
# Converter evaporação de mm para metros
evap_mensal_m3 <- evap_mensal_mm * 0.001
evap_m3_max <- evap_mensal_m3 * area_max * 1e6 # Para área máxima em metros quadrados
evap_m3_min <- evap_mensal_m3 * area_min * 1e6 # Para área mínima em metros quadrados
evap_m3_media <- evap_mensal_m3 * area_media * 1e6 # Para área média em metros quadradros
meses_de_analise <- 1:12
plot(meses_de_analise, evap_m3_max, type = "o", col = "blue",
ylim = c(min(evap_m3_min), max(evap_m3_max)),
xlab = "Meses", ylab = "Evaporação Líquida (m³)",
main = "Evaporação Líquida Mensal (m³) - Áreas Mín., Máx. e Média", xaxt = "n")
# Adicionar as outras áreas ao gráfico - Área mínima e média
lines(meses_de_analise, evap_m3_min, type = "o", col = "red")
lines(meses_de_analise, evap_m3_media, type = "o", col = "green")
axis(1, at = seq(1, 12, by = 1), labels = seq(1, 12, by = 1))
legend("topright", legend = c("Área Máxima", "Área Mínima", "Área Média"),
col = c("blue", "red", "green"), lty = 1, pch = 16)
grid()
Os valores do gráfico referente a Evaporação Líquida Mensal foram normalizados utilizando o volume máximo da Usina de Salto Santiago, cerca de 6775 hm³. Observa-se através do gráfico abaixo que a evaporação não se apresenta como uma perda tão significante para a usina, quando comparado a seu volume máximo.
## Plot normalizado
setwd("C:/Trabalho_Geracao")
# Definindo o volume máximo em m³
volume_max_m3 <- 6775 * 1e6 # 6775 hm³ em m³
# Normalizar os valores de evaporação dividindo pelo volume máximo
evap_m3_max_norm <- evap_m3_max / volume_max_m3
evap_m3_min_norm <- evap_m3_min / volume_max_m3
evap_m3_media_norm <- evap_m3_media / volume_max_m3
# Plotando os valores normalizados
plot(meses_de_analise, evap_m3_max_norm, type = "o", col = "blue",
ylim = c(min(evap_m3_min_norm), max(evap_m3_max_norm)),
xlab = "Meses", ylab = "Evaporação (p.u.)",
main = "Evaporação Mensal Normalizada- Áreas Mín., Máx. e Média", xaxt = "n")
# Adicionar as outras áreas normalizadas ao gráfico - Área mínima e média
lines(meses_de_analise, evap_m3_min_norm, type = "o", col = "red")
lines(meses_de_analise, evap_m3_media_norm, type = "o", col = "green")
axis(1, at = seq(1, 12, by = 1), labels = seq(1, 12, by = 1))
legend("topright", legend = c("Área Máxima", "Área Mínima", "Área Média"),
col = c("blue", "red", "green"), lty = 1, pch = 16)
grid()
Normalizar os dados é importante porque ajusta os valores para uma escala comum, facilitando a comparação entre diferentes conjuntos de dados ou variáveis que possam ter unidades ou magnitudes distintas. Em análises de séries temporais, por exemplo, a normalização ajuda a identificar padrões e anomalias sem que as flutuações de escala interfiram, o que é especialmente útil ao combinar dados de fontes diferentes ou ao observar mudanças ao longo do tempo. Além disso, a normalização melhora o desempenho de muitos métodos estatísticos e algoritmos de aprendizado de máquina, que funcionam melhor quando os dados estão dentro de uma faixa padronizada, evitando que valores maiores dominem a análise e distorçam os resultados. Abaixo está como cada conjunto de dados foi normalizado:
A vazão afluente é a quantidade de água que chega ao reservatório de uma usina hidrelétrica em um determinado ponto e momento. Essa vazão, medida geralmente em metros cúbicos por segundo (m³/s), representa o volume de água escoado superficialmente por unidade de tempo. Ela pode ser determinada através de medições diretas ou estimada por modelos hidrológicos que consideram fatores como precipitação, características do solo e relevo da região. A vazão afluente é uma variável essencial para o cálculo do potencial hidráulico disponível para a geração de energia, pois é a partir dela que a usina define a quantidade de água que movimentará suas turbinas.
No entanto, nem toda a vazão afluente é convertida em energia. Parte da água se perde por evapotranspiração, especialmente em áreas de reservatórios expostos, enquanto outra parte é vertida sem passar pelas turbinas, principalmente em períodos de cheia, quando o reservatório atinge sua capacidade máxima. Além disso, uma porção da vazão contribui para o volume útil do reservatório, garantindo a operação contínua da usina mesmo em épocas de menor afluência.
setwd("C:/Trabalho_Geracao")
# Carregar e preparar os dados
vazao_afluente_normalizado <- read.csv2("Vazao_afluente_normalizado.csv")
vazao_afluente_normalizado <- as.numeric(vazao_afluente_normalizado[1, ])
# Exibir o sumário estatístico
summary(vazao_afluente_normalizado)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -0.01461 0.55327 0.88011 1.00000 1.19418 14.05715
# HISTOGRAMA VAZÃO AFLUENTE - NORMALIZADO
vazao_afluente_normalizado <- read.csv2("Vazao_afluente_normalizado.csv")
vazao_afluente_normalizado <- as.numeric(vazao_afluente_normalizado[1, ])
total_dados <- length(vazao_afluente_normalizado)
# Gerar o histograma com frequência relativa em porcentagem
hist(vazao_afluente_normalizado,
main = "Histograma dos Valores de Vazão Afluente - Normalizado",
xlab = "Vazão (p.u.)",
ylab = "Porcentagem de Ocorrência (%)",
col = "lightgreen",
border = "black",
breaks = 300,
freq = FALSE)
grid()
# HISTOGRAMA VAZÃO AFLUENTE - LOGARITMO
vazao_afluente_log <- log(vazao_afluente_normalizado)
vazao_afluente_log <- vazao_afluente_log[!is.na(vazao_afluente_log)]
# Calcular o número total de dados após log
total_dados_log <- length(vazao_afluente_log)
# Gerar o histograma com frequência relativa em porcentagem para o log
hist(vazao_afluente_log,
main = "Histograma dos Valores de Vazão Afluente (Log)",
xlab = "Vazão (p.u.)",
ylab = "Frequência (%)",
col = "lightgreen",
border = "black",
breaks = 300,
freq = FALSE)
axis(2, at = seq(0, 0.3, by = 0.05), labels = round(seq(0, 0.3, by = 0.05) * 100, 1))
grid()
# BOXPLOT VAZÃO AFLUENTE - NORMALIZADO
# VAZÃO AFLUENTE
vazao_afluente_normalizado <- read.csv2("Vazao_afluente_normalizado.csv")
vazao_afluente_normalizado <- as.numeric(vazao_afluente_normalizado[1, ])
media_vazao <- mean(vazao_afluente_normalizado, na.rm = TRUE)
# Gerar o box plot dos dados de vazão
boxplot(vazao_afluente_normalizado,
main = "Box Plot dos Valores de Vazão Afluente - Normalizado",
ylab = "Vazão (p.u.)",
xlab = "Vazão Afluente",
col = "lightblue",
border = "black",
outline = TRUE,
notch = TRUE,
las = 1,
cex.axis = 0.8,
frame.plot = FALSE)
points(1, media_vazao, col = "red", pch = 19, cex = 1.5)
grid(nx = NULL, ny = NULL, col = "gray", lty = "dotted")
legend("topright", legend = paste("Média =", round(media_vazao, 2)), col = "red", pch = 19, bty = "n")
grid()
# BOXPLOT NORMALIZADO POR ANO
vazao_afluente_normalizado <- read.csv2("Vazao_afluente_normalizado.csv", encoding = "latin1", sep = ";")
nomes_colunas <- colnames(vazao_afluente_normalizado)
anos <- substr(nomes_colunas, nchar(nomes_colunas) - 1, nchar(nomes_colunas))
anos <- as.numeric(anos)
# Criar um data frame para armazenar os valores de vazão e seus respectivos anos
df_vazao_anos <- data.frame(
vazao_afluente_normalizado = as.numeric(vazao_afluente_normalizado[1, ]),
ano = anos
)
media_vazao <- 1
# Gerar o boxplot dos dados de vazão por ano
boxplot(vazao_afluente_normalizado ~ ano, data = df_vazao_anos,
main = "Boxplot Vazão Afluente por Ano - Normalizado",
xlab = "Ano",
ylab = "Vazão Afluente (p.u.)",
col = "lightgray",
border = "black",
outline = TRUE,
notch = FALSE,
las = 1,
cex.axis = 0.8)
abline(h = media_vazao, col = "red", lty = 2, lwd = 2)
grid(nx = NULL, ny = NULL, col = "gray", lty = "dotted")
legend("topright", legend = paste("Média =", media_vazao), col = "red", pch = 19, bty = "n")
# BOXPLOT NORMALIZADO POR ANO
vazao_afluente_normalizado <- read.csv2("Vazao_afluente_normalizado.csv", encoding = "latin1", sep = ";")
nomes_colunas <- colnames(vazao_afluente_normalizado)
anos <- substr(nomes_colunas, nchar(nomes_colunas) - 1, nchar(nomes_colunas))
anos <- as.numeric(anos)
# Criar um data frame para armazenar os valores de vazão (com log) e seus respectivos anos
df_vazao_anos <- data.frame(
vazao_afluente_log = log(as.numeric(vazao_afluente_normalizado[1, ])),
ano = anos
)
media_vazao_log <- log(1) # Aplicando log na média original
boxplot(vazao_afluente_log ~ ano, data = df_vazao_anos,
main = "Boxplot Vazão Afluente por Ano - Normalizado (Log)",
xlab = "Ano",
ylab = "Vazão Afluente (log(p.u.))",
col = "lightgray",
border = "black",
outline = TRUE,
notch = FALSE,
las = 1,
cex.axis = 0.8)
abline(h = media_vazao_log, col = "red", lty = 2, lwd = 2)
grid(nx = NULL, ny = NULL, col = "gray", lty = "dotted")
legend("topright", legend = paste("Média =", round(media_vazao_log, 2)), col = "red", pch = 19, bty = "n")
### Série da Vazão Afluente por Ano
#
library(dplyr)
library(lubridate)
vazao_data <- read.csv2("Vazao_afluente_normalizado.csv")
vazao_data <- as.data.frame(t(vazao_data))
colnames(vazao_data) <- "Vazao"
data_inicial <- as.Date("2000-01-01")
vazao_data$Data <- seq(data_inicial, by = "day", length.out = nrow(vazao_data))
vazao_annual_mean <- vazao_data %>%
group_by(Ano = year(Data)) %>%
summarize(Vazao_Media = mean(Vazao, na.rm = TRUE))
# Plotar a série temporal anual com marcações de ano
plot(vazao_annual_mean$Ano, vazao_annual_mean$Vazao_Media*10, type = "o",
xlab = "Período", ylab = "Vazão Afluente (p.u.)",
main = "Série Vazão Afluente por Ano - Normalizado", xaxt = "n")
# Adicionar os anos no eixo x
axis(1, at = vazao_annual_mean$Ano, labels = vazao_annual_mean$Ano)
grid()
#
vazao_data <- read.csv2("Vazao_afluente_normalizado.csv")
vazao_data <- as.data.frame(t(vazao_data))
colnames(vazao_data) <- "Vazao"
data_inicial <- as.Date("2000-01-01")
vazao_data$Data <- seq(data_inicial, by = "day", length.out = nrow(vazao_data))
# Plotar a série temporal diária
plot(vazao_data$Data, vazao_data$Vazao, type = "l",
xlab = "Período", ylab = "Vazão Afluente (p.u.)",
main = "Série Vazão Afluente Diária - Normalizado", xaxt = "n")
axis.Date(1, at = seq(min(vazao_data$Data), max(vazao_data$Data), by = "1 year"), format = "%Y")
grid()
#
vazao_data <- read.csv2("Vazao_afluente_normalizado.csv")
vazao_data <- as.data.frame(t(vazao_data))
colnames(vazao_data) <- "Vazao"
data_inicial <- as.Date("2000-01-01")
vazao_data$Data <- seq(data_inicial, by = "day", length.out = nrow(vazao_data))
# Dividir os dados em dois períodos (2000 - 2012) e (2013 - 2024)
vazao_periodo1 <- vazao_data %>% filter(Data >= as.Date("2000-01-01") & Data <= as.Date("2012-12-31"))
vazao_periodo2 <- vazao_data %>% filter(Data >= as.Date("2013-01-01") & Data <= as.Date("2024-12-31"))
par(mfrow = c(2, 1), mar = c(4, 4, 2, 1))
# Plotar o primeiro período (2000 - 2012)
plot(vazao_periodo1$Data, vazao_periodo1$Vazao, type = "l",
xlab = "Período", ylab = "Vazão Afluente (p.u.)",
main = "Série Vazão Afluente Diária (2000-2012)", xaxt = "n")
axis.Date(1, at = seq(min(vazao_periodo1$Data), max(vazao_periodo1$Data), by = "1 year"), format = "%Y")
grid()
# Plotar o segundo período (2013 - 2024)
plot(vazao_periodo2$Data, vazao_periodo2$Vazao, type = "l",
xlab = "Período", ylab = "Vazão Afluente (p.u.)",
main = "Série Vazão Afluente Diária (2013-2024)", xaxt = "n")
axis.Date(1, at = seq(min(vazao_periodo2$Data), max(vazao_periodo2$Data), by = "1 year"), format = "%Y")
grid()
par(mfrow = c(1, 1))
library(dplyr)
vazao_afluente_data <- read.csv2("Vazao_afluente_normalizado.csv")
vazao_afluente_data <- as.data.frame(t(vazao_afluente_data))
colnames(vazao_afluente_data) <- "Vazao"
media_vazao <- 1095
# Definir as vazões correspondentes para Q1, Q2, Q3 e Q4 em p.u.
Q1 <- 346 / media_vazao # Vazão para 1 turbina ligada em p.u.
Q2 <- 692 / media_vazao # Vazão para 2 turbinas ligadas em p.u.
Q3 <- 1038 / media_vazao # Vazão para 3 turbinas ligadas em p.u.
Q4 <- 1384 / media_vazao # Vazão para 4 turbinas ligadas em p.u.
vazao_ordenada <- sort(vazao_afluente_data$Vazao, decreasing = TRUE)
# Calcular a mediana, percentil 5% e percentil 95%
mediana_vazao <- median(vazao_afluente_data$Vazao, na.rm = TRUE)
percentil_5 <- quantile(vazao_afluente_data$Vazao, 0.05, na.rm = TRUE)
percentil_95 <- quantile(vazao_afluente_data$Vazao, 0.95, na.rm = TRUE)
# Calcular os percentis correspondentes aos valores específicos
indice_media <- which.min(abs(vazao_ordenada - 1)) # média normalizada é 1 em p.u.
indice_mediana <- which.min(abs(vazao_ordenada - mediana_vazao))
indice_5 <- which.min(abs(vazao_ordenada - percentil_5))
indice_95 <- which.min(abs(vazao_ordenada - percentil_95))
# Encontrar os índices mais próximos no vetor ordenado para cada Q1, Q2, Q3 e Q4
indice_Q1 <- which.min(abs(vazao_ordenada - Q1))
indice_Q2 <- which.min(abs(vazao_ordenada - Q2))
indice_Q3 <- which.min(abs(vazao_ordenada - Q3))
indice_Q4 <- which.min(abs(vazao_ordenada - Q4))
# Adicionar a Energia Assegurada
energia_assegurada <- 702.2 #(MWmed)
k <- 0.008829 #Prod.Esp
canal_de_fuga <- 397.46 #Canal Fuga Médio (m)
altura_max <- 506 - canal_de_fuga
altura_min <- 481 - canal_de_fuga
vazao_max <- 15397
energia_assegurada_pu_max <- energia_assegurada / (k * vazao_max * altura_max)
energia_assegurada_pu_min <- energia_assegurada / (k * vazao_max * altura_min)
# Criar o gráfico de persistência
plot(vazao_ordenada, type = "l",
xlab = "Tempo/Probabilidade (%)", ylab = "Vazão Afluente (p.u.)",
main = "Gráfico de Persistência da Vazão Afluente",
xaxt = "n", col = "blue")
axis(1, at = seq(1, length(vazao_ordenada), length.out = 11),
labels = seq(0, 100, by = 10))
# Adicionar pontos específicos para média, mediana, percentil 5%, percentil 95%, Q1, Q2, Q3 e Q4
points(c(indice_media, indice_mediana, indice_5, indice_95, indice_Q1, indice_Q2, indice_Q3, indice_Q4),
c(1, mediana_vazao, percentil_5, percentil_95, Q1, Q2, Q3, Q4),
col = "blue", pch = 16)
# Adicionar os rótulos aos pontos com ajuste de offset e cex
text(indice_media, 1, "Média: 1", pos = 3, col = "blue", offset = 0.7, cex = 0.8)
text(indice_mediana, mediana_vazao, paste("Mediana:", round(mediana_vazao, 2)), pos = 1, col = "blue", offset = 0.7, cex = 0.8)
text(indice_5, percentil_5, paste("5%:", round(percentil_5, 2)), pos = 3, col = "blue", offset = 0.7, cex = 0.8)
text(indice_95, percentil_95, paste("95%:", round(percentil_95, 2)), pos = 3, col = "blue", offset = 0.7, cex = 0.8)
# Adicionar rótulos para Q1, Q2, Q3 e Q4 com ajuste de offset e cex
text(indice_Q1, Q1, paste("Q1:", round(Q1, 2)), pos = 4, col = "red", offset = 0.7, cex = 0.8)
text(indice_Q2, Q2, paste("Q2:", round(Q2, 2)), pos = 4, col = "red", offset = 0.7, cex = 0.8)
text(indice_Q3, Q3, paste("Q3:", round(Q3, 2)), pos = 4, col = "red", offset = 0.7, cex = 0.8)
text(indice_Q4, Q4, paste("Q4:", round(Q4, 2)), pos = 4, col = "red", offset = 0.7, cex = 0.8)
# Adicionar linhas e rótulos para energia assegurada p.u. máx e mín
abline(h = energia_assegurada_pu_max, col = "darkgreen", lty = 2)
abline(h = energia_assegurada_pu_min, col = "darkgreen", lty = 2)
text(length(vazao_ordenada) * 0.05, energia_assegurada_pu_max,
paste("EA MAX:", round(energia_assegurada_pu_max, 3)), pos = 3, col = "darkgreen", offset = 0.7, cex = 0.8)
text(length(vazao_ordenada) * 0.05, energia_assegurada_pu_min + 0.1,
paste("EA MIN:", round(energia_assegurada_pu_min, 3)), pos = 1, col = "darkgreen", offset = 0.7, cex = 0.8)
grid()
library(dplyr)
# Carregar e organizar os dados
vazao_afluente_data <- read.csv2("Vazao_afluente.csv")
vazao_afluente_data <- as.data.frame(t(vazao_afluente_data))
colnames(vazao_afluente_data) <- "Vazao"
# Definir parâmetros
media_vazao <- 1095
vazao_ordenada <- sort(vazao_afluente_data$Vazao, decreasing = TRUE)
# Parâmetros da Energia Assegurada
energia_assegurada <- 702.2 #(MWmed)
k <- 0.008829 #Prod.Esp
canal_de_fuga <- 397.46 #Canal Fuga Médio (m)
altura_max <- 506 - canal_de_fuga
altura_min <- 481 - canal_de_fuga
altura_media <- (altura_max + altura_min) / 2 # Altura média
# Cálculo das curvas de energia com altura máxima, média e mínima
energia_max <- vazao_ordenada * k * altura_max
energia_media <- vazao_ordenada * k * altura_media
energia_min <- vazao_ordenada * k * altura_min
Q1 <- 346
Q2 <- 692
Q3 <- 1038
Q4 <- 1384
# Encontrar os índices das vazões em vazao_ordenada para plotar as linhas verticais e os rótulos
indice_Q1 <- which.min(abs(vazao_ordenada - Q1))
indice_Q2 <- which.min(abs(vazao_ordenada - Q2))
indice_Q3 <- which.min(abs(vazao_ordenada - Q3))
indice_Q4 <- which.min(abs(vazao_ordenada - Q4))
# Criar o gráfico de persistência com a primeira curva (altura máxima)
plot(energia_max, type = "l",
xlab = "Tempo/Probabilidade (%)", ylab = "Energia (MWmédio)",
main = "Gráfico de Persistência da Energia Assegurada a partir da Vazão",
xaxt = "n", col = "blue", lwd = 2)
# Adicionar eixos personalizados
axis(1, at = seq(1, length(energia_max), length.out = 11),
labels = seq(0, 100, by = 10))
# Adicionar as outras curvas ao gráfico
lines(energia_media, col = "green", lwd = 2, lty = 2) # Altura média
lines(energia_min, col = "red", lwd = 2, lty = 3) # Altura mínima
# Adicionar linhas verticais para as vazões de Q1, Q2, Q3 e Q4 com rótulos
abline(v = indice_Q1, col = "purple", lty = 2)
abline(v = indice_Q2, col = "purple", lty = 2)
abline(v = indice_Q3, col = "purple", lty = 2)
abline(v = indice_Q4, col = "purple", lty = 2)
# Adicionar rótulos para Q1, Q2, Q3 e Q4 próximos das linhas verticais
text(indice_Q1, max(energia_max) * 0.9, "Q1", pos = 4, col = "purple")
text(indice_Q2, max(energia_max) * 0.9, "Q2", pos = 4, col = "purple")
text(indice_Q3, max(energia_max) * 0.9, "Q3", pos = 4, col = "purple")
text(indice_Q4, max(energia_max) * 0.9, "Q4", pos = 4, col = "purple")
legend("topright", legend = c("Altura Máxima", "Altura Média", "Altura Mínima", "Turbinas Q1-Q4"),
col = c("blue", "green", "red", "purple"), lty = c(1, 2, 3, 2), lwd = 2, cex = 0.8,
inset = c(0.01, 0.2), x.intersp = 0.5, y.intersp = 0.6)
grid()
# Carregar os dados do arquivo CSV
geracao_real <- read.csv2("Geracao_real.csv")
qmax <- 15397
# Transformar os dados em uma série unidimensional e dividir pela média
energia_real_gerada <- as.numeric(as.vector(t(geracao_real)))
energia_real_gerada_pu <- energia_real_gerada
# Ordenar os valores em ordem decrescente para o gráfico de persistência
energia_real_ordenada <- quantile((energia_real_gerada_pu), probs = seq(0, 1, 0.01))
plot(seq(100, 0, -1),energia_real_ordenada , type = "l",
xlab = "Percentil", ylab = "Energia Gerada (MWm)",
main = "Gráfico de Persistência da Energia Realmente Gerada",
col = "blue", lwd = 2)
grid()
A vazão natural afluente é uma estimativa das vazões de um rio ou curso d’água que considera o fluxo como ele seria em condições naturais, sem intervenções humanas. Essa medida é obtida a partir do processamento de dados de vazão observada, ajustando-os para remover os efeitos artificiais causados por atividades humanas, como a construção de represas e desvios de água. A vazão natural afluente permite uma análise mais precisa do comportamento hidrológico da bacia, refletindo o regime hídrico que existiria se não houvesse alterações antropogênicas, como se o rio estivesse em seu estado natural ao longo do tempo.
# Definir o diretório de trabalho
vazao_natural_afluente <- read.csv2("Vazao_Natural_Afluente.csv")
vazao_natural_afluente <- as.numeric(vazao_natural_afluente[,2])
# Fazer o sumário estatístico dos valores de vazão natural afluente
summary(vazao_natural_afluente)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.09 0.42 0.72 1.00 1.25 16.38
# Carregar os dados
vazao_natural_afluente <- read.csv2("Vazao_Natural_Afluente.csv")
vazao_natural_afluente <- as.numeric(vazao_natural_afluente[,2])
media_total <- 1019.28148148148
vazao_afluente_normalizado <- vazao_natural_afluente
total_dados <- length(vazao_afluente_normalizado)
# Gerar o histograma com frequência relativa em porcentagem
hist(vazao_afluente_normalizado,
main = "Histograma dos Valores de Vazão Natural Afluente - Normalizado",
xlab = "Vazão (p.u.)",
ylab = "Porcentagem de Ocorrência (%)",
col = "lightgreen",
border = "black",
breaks = 300,
freq = FALSE)
# Ajustar a densidade do histograma para representar porcentagem
counts <- hist(vazao_afluente_normalizado, breaks=800, plot=FALSE)$counts
relative_counts <- (counts / total_dados) * 100 # Dividir pelo total e multiplicar por 100 para porcentagem
# Ajustar o eixo y com porcentagem
axis(2, at = seq(0, max(relative_counts), by = 5), labels = round(seq(0, max(relative_counts), by = 5), 1))
grid()
# HISTOGRAMA VAZÃO AFLUENTE - LOGARITMO
# Aplicar o logaritmo aos valores de vazão natural afluente, removendo NA
vazao_natural_afluente_log <- log(vazao_natural_afluente)
vazao_natural_afluente_log <- vazao_natural_afluente_log[!is.na(vazao_natural_afluente_log)]
# Calcular o número total de dados após o log
total_dados_log <- length(vazao_natural_afluente_log)
# Gerar o histograma com frequência relativa em porcentagem para o log
hist(vazao_natural_afluente_log,
main = "Histograma dos Valores de Vazão Natural Afluente - Normalizado (Log)",
xlab = "Vazão (p.u.)",
ylab = "Porcentagem de Ocorrência (%)",
col = "lightgreen",
border = "black",
breaks = 300,
freq = FALSE)
# Ajustar o eixo Y para porcentagem de forma correta
axis(2, at = seq(0, 0.006, by = 0.001), labels = seq(0, 0.6, by = 0.1), las = 2)
grid()
# BOXPLOT VAZÃO NATURAL AFLUENTE - NORMALIZADO
# VAZÃO AFLUENTE
vazao_natural_afluente <- read.csv2("Vazao_Natural_Afluente.csv")
vazao_natural_afluente <- as.numeric(vazao_natural_afluente[,2])
media_vazao <- mean(vazao_natural_afluente, na.rm = TRUE)
# Gerar o box plot dos dados de vazão
boxplot(vazao_natural_afluente,
main = "Box Plot dos Valores de Vazão Natural Afluente - Normalizado",
ylab = "Vazão (p.u.)",
xlab = "Vazão Natural Afluente",
col = "lightblue",
border = "black",
outline = TRUE,
notch = TRUE,
las = 1,
cex.axis = 0.8,
frame.plot = FALSE)
points(1, media_vazao, col = "red", pch = 19, cex = 1.5)
grid()
legend("topright", legend = paste("Média =", round(media_vazao, 2)), col = "red", pch = 19, bty = "n")
data <- read.csv2("Natural_Afluente.csv")
colnames(data)[1] <- "Ano"
data <- subset(data, Ano >= 1940)
media_total <- mean(unlist(data[,-1]), na.rm = TRUE)
data_norm <- data
data_norm[,-1] <- data[,-1] / media_total
# Dividir os dados em períodos de 30 anos, excluindo o primeiro período se necessário
periodos <- split(data_norm, ceiling((data_norm$Ano - min(data_norm$Ano)) / 30))
periodos <- periodos[-1] # Excluir o primeiro período, se aplicável
# Gerar o boxplot para cada período separadamente
for (i in seq_along(periodos)) {
periodo <- periodos[[i]]
library(reshape2)
data_long <- melt(periodo, id.vars = "Ano", variable.name = "Mes", value.name = "Vazao")
boxplot(Vazao ~ Ano, data = data_long, main = paste("Boxplot Vazão Natural Afluente por Ano - Período", i),
ylab = "Vazão Natural Afluente (p.u.)", xlab = "Ano", las=2, cex.axis=0.7)
abline(h = 1, col = "red", lty = 2)
x_pos <- length(unique(data_long$Ano)) * 0.95 # Ajusta para o ano final
y_pos <- max(data_long$Vazao, na.rm = TRUE) * 0.9 # Ajusta a altura
points(x = x_pos, y = y_pos, col = "red", pch = 19)
text(x = x_pos, y = y_pos, "Média = 1", pos = 3, col = "red", cex = 0.8)
grid()
}
data <- read.csv2("Natural_Afluente.csv")
colnames(data)[1] <- "Ano"
data <- subset(data, Ano >= 1940)
# Calcular a média total e normalizar os dados
media_total <- mean(unlist(data[,-1]), na.rm = TRUE)
data_norm <- data
data_norm[,-1] <- data[,-1] / media_total
# Aplicar o log nos valores normalizados (evitar log(0) adicionando uma pequena constante, se necessário)
data_norm[,-1] <- log(data_norm[,-1] + 1e-10)
# Dividir os dados em períodos de 30 anos, excluindo o primeiro período se necessário
periodos <- split(data_norm, ceiling((data_norm$Ano - min(data_norm$Ano)) / 30))
periodos <- periodos[-1] # Excluir o primeiro período, se aplicável
# Gerar o boxplot para cada período separadamente
for (i in seq_along(periodos)) {
periodo <- periodos[[i]]
library(reshape2)
data_long <- melt(periodo, id.vars = "Ano", variable.name = "Mes", value.name = "Vazao")
boxplot(Vazao ~ Ano, data = data_long, main = paste("Boxplot Vazão Natural Afluente (Log) por Ano - Período", i),
ylab = "Log(Vazão Natural Afluente) (p.u.)", xlab = "Ano", las=2, cex.axis=0.7)
abline(h = log(1), col = "red", lty = 2)
x_pos <- length(unique(data_long$Ano)) * 0.95 # Ajusta para o ano final
y_pos <- max(data_long$Vazao, na.rm = TRUE) * 0.9 # Ajusta a altura
points(x = x_pos, y = y_pos, col = "red", pch = 19)
text(x = x_pos, y = y_pos, "Média", pos = 2, col = "red", cex = 0.8)
grid()
}
# Carregar pacotes necessários
library(dplyr)
library(tidyr)
# Carregar o arquivo CSV
data <- read.csv2("Natural_Afluente.csv")
# Transformar os dados de formato wide (ano-mês) para formato longo
data_long <- data %>%
pivot_longer(-1, names_to = "mes", values_to = "vazao") %>%
rename(ano = 1)
# Converter o nome do mês para o número correspondente e criar uma coluna de data
data_long <- data_long %>%
mutate(
mes = match(mes, tolower(month.abb)), # Converte o nome do mês para número
data = as.Date(paste(ano, mes, "01", sep = "-"))
) %>%
select(data, vazao)
# Calcular a média global
media_global <- mean(data_long$vazao, na.rm = TRUE)
# Normalizar pela média global
data_long <- data_long %>%
mutate(vazao_normalizada = vazao / media_global)
# Filtrar dados a partir de 1940 e definir os períodos de 30 anos
data_long <- data_long %>%
mutate(ano = as.numeric(format(data, "%Y"))) %>% # Extrair ano da data
filter(ano >= 1940) %>% # Filtrar apenas a partir de 1940
mutate(periodo = case_when(
ano >= 1940 & ano < 1970 ~ "1940-1969",
ano >= 1970 & ano < 2000 ~ "1970-1999",
ano >= 2000 & ano <= 2020 ~ "2000-2020"
))
# Função para criar gráfico com a formatação solicitada
plot_series <- function(data, periodo) {
plot(data$data, data$vazao_normalizada, type = "l", col = "black", lwd = 1.5,
main = paste("Série da Vazão Natural Afluente por Ano Normalizado -", periodo),
xlab = "Data", ylab = "Vazão (p.u.)")
}
# Criar gráficos separados para cada período
# Gráfico para 1940-1969
data_1940_1969 <- data_long %>% filter(periodo == "1940-1969")
plot_series(data_1940_1969, "1940 a 1969")
grid()
# Gráfico para 1970-1999
data_1970_1999 <- data_long %>% filter(periodo == "1970-1999")
plot_series(data_1970_1999, "1970 a 1999")
grid()
# Gráfico para 2000-2020
data_2000_2020 <- data_long %>% filter(periodo == "2000-2020")
plot_series(data_2000_2020, "2000 a 2020")
grid()
data <- read.csv2("Vazoes_Diarias_1931_2020.csv")
data$Data <- as.Date(data$Data, format = "%d/%b/%Y")
colnames(data)[which(names(data) == "SLT.SANTIAGO..77.")] <- "Vazao"
data <- na.omit(data)
media_total <- 1019.28148148148
data$Vazao <- data$Vazao / media_total
# Filtrar os dados para o intervalo desejado (1940 a 2020)
data_filtrada <- subset(data, format(Data, "%Y") >= 1940 & format(Data, "%Y") <= 2020)
# Dividir o intervalo total em três períodos
periodo1 <- subset(data_filtrada, format(Data, "%Y") >= 1940 & format(Data, "%Y") <= 1960)
periodo2 <- subset(data_filtrada, format(Data, "%Y") >= 1961 & format(Data, "%Y") <= 1980)
periodo3 <- subset(data_filtrada, format(Data, "%Y") >= 1981 & format(Data, "%Y") <= 2020)
# Função auxiliar para plotar cada período
plot_periodo <- function(periodo, titulo, intervalo) {
if (nrow(periodo) > 0) {
plot(periodo$Data, periodo$Vazao, type = "l", col = "blue",
xlab = "Data", ylab = "Vazão Diária Normalizada (p.u.)", main = titulo, xaxt = "n") # Remover o eixo x padrão
axis(1, at = seq(min(periodo$Data), max(periodo$Data), by = intervalo),
labels = format(seq(min(periodo$Data), max(periodo$Data), by = intervalo), "%Y"), las = 1, cex.axis = 1)
} else {
plot(1, type = "n", xlab = "", ylab = "", main = titulo)
text(1, 1, "Sem dados disponíveis para este período", cex = 1.2)
}
}
# Gerar gráficos separadamente para cada período com intervalos de 2 anos no eixo x
plot_periodo(periodo1, "Série da Vazão Natural Afluente Diária Normalizada - 1940 a 1960", "2 years")
grid()
plot_periodo(periodo2, "Série da Vazão Natural Afluente Diária Normalizada - 1961 a 1980", "2 years")
grid()
plot_periodo(periodo3, "Série da Vazão Natural Afluente Diária Normalizada - 1981 a 2020", "2 years")
grid()