RIO CAÍ / NOTA TÉCNICA v5.8
● SISTEMA ONLINE
DOCUMENTAÇÃO DO SISTEMA

Como o Rio Caí é analisado e como as ondas são estimadas

A Central de Previsões do Rio Caí não procura simplesmente “qual será o próximo nível do rio”. O objetivo é identificar uma onda hidrológica em andamento, acompanhar sua evolução, medir sua velocidade, comparar seu comportamento com ondas históricas e estimar onde ela poderá atingir seu pico (máximo) ou seu fundo (mínimo).

Ideia central:
o nível atual é apenas uma fotografia. A previsão tenta interpretar o movimento que está acontecendo entre uma medição e outra — e atualiza essa interpretação a cada novo dado recebido.

1. O problema que o sistema precisa resolver

Um rio não sobe e desce de forma perfeitamente regular. Uma sequência de medições pode conter pequenas oscilações, ruído dos sensores, alterações locais, contribuição de afluentes e ondas de cheia que chegam de regiões situadas mais acima da bacia.

Por isso, simplesmente utilizar o último valor registrado não é suficiente para estimar um pico ou um fundo.

O nível atual

Informa quanto o rio está medindo neste momento, mas não explica sozinho se a água continuará subindo, estabilizará ou começará a baixar.

A evolução

Mostra a velocidade e a direção da mudança. É essa evolução que permite reconhecer uma onda em formação.

2. O que é uma onda hidrológica?

Para este sistema, uma onda é uma sequência organizada de variação do nível do rio: normalmente uma fase de subida, seguida de um ponto de máximo (pico) e posteriormente uma fase de descida até um ponto de mínimo (fundo).

PICO INÍCIO SUBIDA DESCIDA FUNDO
Evolução do nível Pico Fase de descida

3. Como o sistema encontra uma onda

Recebimento das medições

O sistema recebe uma série temporal de níveis observados nas estações. Cada medição tem um timestamp e um nível em metros.

tempo → nível → tempo → nível → tempo → nível

Cálculo de variações

Em vez de olhar apenas para o último valor, o sistema calcula quanto o nível mudou em janelas de 1h, 3h, 6h e 24h.

v1h = (nível_atual − nível_1h_atrás) × 100 v3h = (nível_atual − nível_3h_atrás) × 100 / 3 v6h = (nível_atual − nível_6h_atrás) × 100 / 6 v24h = (nível_atual − nível_24h_atrás) × 100 unidades: v1h em cm; v3h/v6h em cm/h; v24h em cm

Determinação da tendência real

A tendência é calculada exclusivamente pelas medições (não depende do estado da onda). A partir da v5.6, os limiares foram suavizados para captar movimentos mais lentos.

SE v1h ≤ −0.8 E v3h ≤ −0.4 → descendo SE v1h ≥ +0.8 E v3h ≥ +0.4 → subindo SE v1h ≤ −0.5 OU v3h ≤ −0.25 → descendo SE v1h ≥ +0.5 OU v3h ≥ +0.25 → subindo caso contrário → estavel

Detecção de tendência lenta (v5.6)

Além da tendência real, o sistema conta quantos sinais de subida e descida aparecem em 1h, 3h, 6h e 24h. Se houver 3 ou mais sinais consistentes, a tendência é classificada como lenta.

sinaisSubida = 0 SE v1h > 0.3 → +1 SE v3h > 0.2 → +1 SE v6h > 0.1 → +1 SE v24h > 5.0 → +1 sinaisDescida = 0 SE v1h < −0.3 → +1 SE v3h < −0.2 → +1 SE v6h < −0.1 → +1 SE v24h < −5.0 → +1 SE sinaisSubida ≥ 3 → tendenciaLenta = "subindo_lento" SE sinaisDescida ≥ 3 → tendenciaLenta = "descendo_lento" caso contrário → tendenciaLenta = "estavel"

Identificação do início da onda

O sistema procura o último ponto em que o nível deixou de cair e passou a subir de forma consistente.

A partir desse ponto, o pico candidato é o maior nível observado desde o início.

Confirmação do pico

Uma única oscilação não confirma o pico. É preciso observar uma queda consistente. O limiar de queda mínima é definido por rio (v5.6).

Pico confirmado apenas se: • queda total ≥ queda_minima_pico (parâmetro do rio) • pelo menos 3 quedas consecutivas ≥ 2 cm

Classificação do estado da onda

Com base no pico e nas quedas recentes, o sistema classifica a onda em um dos estados possíveis.

onda_em_construcao → pico ainda não confirmado onda_em_queda → pico confirmado + queda consistente onda_estabilizando → pico confirmado + queda fraca onda_terminada → fundo já ocorreu e nova subida iniciou

4. Por que a velocidade é importante?

Considere duas situações:

Situação Nível Variação Interpretação
A 3,20 m +1 cm/h Subida lenta — provavelmente próxima do pico
B 3,20 m +15 cm/h Subida rápida — onda ainda em desenvolvimento

O nível é exatamente o mesmo nos dois casos, mas o estado da onda é completamente diferente. Uma previsão baseada somente no nível atual perde essa informação.

Regra do modelo:
a velocidade limita a projeção. Nenhuma previsão pode variar mais do que a velocidade observada permite em um horizonte temporal plausível.

5. As métricas extraídas do histórico

As ondas históricas vêm de ondas_rio.php. Para cada onda, o sistema extrai:

nivel_inicio_m
Nível em que a subida começou (m)
nivel_pico_m
Nível máximo atingido (m)
nivel_fim_m / fundo_m
Nível mínimo após o pico (m)
subida_m
Amplitude da subida (pico − início)
queda_m
Amplitude da queda (pico − fundo)
duracao_subida_h
Tempo entre início e pico (h)
duracao_descida_h
Tempo entre pico e fundo (h)
velocidade_media_subida_cm_h
Velocidade média da subida (cm/h)
velocidade_media_descida_cm_h
Velocidade média da descida (cm/h)
inicio / pico / fim
Timestamps ISO

A partir dessas métricas, o sistema calcula as medianas:

subida_mediana_m queda_mediana_m duracao_subida_mediana_h velocidade_subida_mediana_cm_h velocidade_descida_mediana_cm_h

As medianas são usadas como referência e como fallback quando não há velocidade específica disponível.

Fallback de velocidade de descida:
quando o campo velocidade_media_descida_cm_h não está disponível, o sistema calcula:
velocidade_descida = |nível_pico_m − fundo| × 100 / duracao_descida_h

6. Como a onda atual é comparada com ondas históricas

Cada onda histórica recebe um peso de similaridade com a onda atual. Ondas mais parecidas pesam mais na média.

6.1 Filtros de elegibilidade

• precisa ter nivel_inicio_m, nivel_pico_m e subida_m • subida_histórica ≥ subida_minima_historica (0.10 m) • pico_histórico ≥ nível_atual • proporcao = subida_atual / max(0.10, subida_histórica) deve estar entre 0.55 e 1.80

6.2 Cálculo dos pesos

dif_inicio = |inicio_histórico − inicio_atual| dif_subida = |subida_histórica − subida_atual| dif_fase = |1 − proporcao| dist_pico = |pico_histórico − nível_atual| peso_inicio = 1 / (0.50 + dif_inicio) peso_subida = 1 / (1.00 + dif_subida) peso_fase = 1 / (0.25 + dif_fase) peso_pico = 1 / (0.50 + dist_pico) peso = peso_inicio × peso_subida × peso_fase × peso_pico peso = min(100.0, max(0.0001, peso))

As 15 ondas com maior peso formam o conjunto ondasAnalise.

Exemplo de comparação

Característica Onda atual Evento A Evento B
Nível no início2,10 m2,08 m2,15 m
Velocidade inicial4 cm/h5 cm/h3 cm/h
Velocidade máxima15 cm/h14 cm/h17 cm/h
Duração da subidaem andamento18 h21 h
Picoestimado4,82 m5,10 m

O objetivo não é afirmar que a onda atual será idêntica a uma onda antiga. O histórico funciona como referência para estimar a continuação mais compatível com o comportamento observado.

6.3 Análise específica de fundos históricos

Para projetar o fundo, o sistema monta um conjunto separado (fundosAnalise) contendo apenas ondas cujo fundo é mais profundo que a queda já realizada.

Filtros: • fundo_histórico < pico_histórico • queda_histórica ≥ 0.10 • queda_histórica > quedaDesdePico + 0.05 • queda_restante = queda_histórica − quedaDesdePico ≥ 0.05 Pesos: peso_inicio = 1 / (0.75 + |início_h − início_atual|) peso_pico = 1 / (0.75 + |pico_h − pico_atual|) peso_subida = 1 / (1.00 + |subida_h − subida_atual|) peso_queda = 1 / (0.75 + |queda_h − queda_mediana|) fase_queda = quedaDesdePico / max(0.10, queda_h) peso_fase = 1 / (0.50 + |0.70 − fase_queda|) peso = produto dos cinco pesos, limitado a [0.0001, 100]

7. Limitação por velocidade e horizonte temporal (v5.4)

Uma das principais fontes de erro era permitir que a média histórica projetasse valores absurdos. Exemplo: prever fundo de 3,53 m quando o rio está em 5,58 m caindo a 5 cm/h.

Problema original:
a média dos fundos históricos podia ser muito mais baixa que o plausível. O horizonte temporal não era limitado.
Solução (v5.4):
a previsão é limitada pela velocidade real × horizonte máximo.

7.1 Horizonte por rio (v5.6)

Rio Horas máx. pico Horas máx. fundo
Nova Palmira36 h18 h
Vale Real48 h24 h
Feliz48 h24 h
Bom Princípio60 h30 h
Montenegro72 h36 h
São Sebastião do Caí96 h48 h

8. Direção obrigatória e pico já ocorrido (v5.5)

A v5.5 corrige dois problemas que restavam:

8.1 — Onda em construção mas já caindo

Se o estado é onda_em_construcao (pico ainda não confirmado formalmente), mas a tendência real já é de queda — v3h e v6h negativas — o pico é tratado como provavelmente ocorrido.

picoJaOcorrido = estado == "onda_em_construcao" E tendência == "descendo" E v1h < 0 E v3h < 0 E v6h < 0 SE picoJaOcorrido: previsaoPico = null previsaoStatus = "pico_provavelmente_ocorrido" passa a projetar o FUNDO

8.2 — Direção obrigatória do fundo

Se o rio está descendo, o fundo projetado tem que ser abaixo do menor nível já observado desde o pico. Nunca pode “voltar para cima”.

menorNivelDesdePico = menor valor observado após o pico baseCalculo = min(nível_atual, menorNivelDesdePico) previsaoFundo = baseCalculo − queda_final SE previsaoFundo ≥ baseCalculo → previsaoFundo = null SE previsaoFundo < 0 → previsaoFundo = 0.01
Efeito prático:
em São Sebastião do Caí, quando o rio já estava caindo (v5.4), o modelo projetava pico de 12,00 m. Com a v5.5, o modelo entende que o pico já ocorreu e projeta o fundo — coerente com a realidade.

9. Parâmetros por rio (v5.6)

Até a v5.5, todos os rios usavam o mesmo limiar de movimento, a mesma queda mínima para confirmar pico e o mesmo horizonte temporal. Isso gerava erro sistemático: o modelo superestimava rios grandes (Montenegro) e subestimava rios pequenos (Nova Palmira). A v5.6 introduz parâmetros específicos por estação.

Rio limiar_movimento queda_minima_pico horas_max_pico horas_max_fundo fator_velocidade
Nova Palmira 0.0150.0836181.00
Vale Real 0.020.1048240.95
Feliz 0.020.1048240.95
Bom Princípio 0.030.1560300.90
Montenegro 0.030.2072360.85
São Sebastião do Caí 0.050.2596480.80

9.1 Como cada parâmetro é usado

limiar_movimento
Define o que conta como “movimento real” ao comparar medições consecutivas. Rios maiores precisam de variações maiores para não confundir ruído com sinal.
queda_minima_pico
Queda total mínima (em metros) desde o candidato a pico até o menor nível subsequente, para confirmar que o pico realmente ocorreu.
horas_max_pico
Horizonte temporal máximo, em horas, para projetar o pico. Limita o deslocamento máximo que a velocidade permite.
horas_max_fundo
Horizonte temporal máximo, em horas, para projetar o fundo.
fator_velocidade
Peso relativo da velocidade atual (1h/3h/6h) versus a velocidade histórica. Rios pequenos respondem rápido — peso alto no atual. Rios grandes respondem devagar — peso maior no histórico.

10. Tendência lenta (v5.6)

O modelo original só reconhecia movimento quando a variação ultrapassava limites fixos. Isso fazia com que rios em subida ou descida lentas fossem classificados como “estáveis” — e a previsão ficava travada enquanto o real continuava a evoluir.

Correção:
a v5.6 conta sinais consistentes em quatro janelas temporais. Se houver 3 ou mais sinais na mesma direção, a tendência é tratada como lenta (subindo_lento ou descendo_lento) — mesmo que a tendência real (calculada por limiares rígidos) diga “estável”.

10.1 Regra de sinais

Janela Sinal de subida Sinal de descida
1h> +0.3 cm/h< −0.3 cm/h
3h> +0.2 cm/h< −0.2 cm/h
6h> +0.1 cm/h< −0.1 cm/h
24h> +5 cm total< −5 cm total

10.2 Efeito no cálculo

SE tendenciaLenta == "subindo_lento" E velocidadeInstantanea > 0: velocidadeBase = max(velocidadeBase, velocidadeInstantanea) SE tendenciaLenta == "descendo_lento" E velocidadeInstantanea < 0: velocidadeFundo = max(velocidadeFundo, |velocidadeInstantanea|)

Ou seja: quando o rio está subindo ou descendo devagar mas de forma consistente, a previsão acompanha essa velocidade instantânea mínima, em vez de travar em uma velocidade histórica menor.

11. Ponderação de velocidade (v5.6)

Cada rio tem um fator_velocidade que define o quanto a velocidade atual pesa contra a velocidade histórica no cálculo da velocidade base.

pesoAtual = fator_velocidade pesoHistorico = 1 − fator_velocidade

11.1 Velocidade de subida usada no pico

velocidadeSubidaAtual = max(0, (v1h × 0.5) + (v3h × 0.3) + (v24h/24 × 0.2)) velocidadeBase = (velocidadeSubidaAtual × pesoAtual) + (velocidadeProjetada × pesoHistorico) velocidadeBase = max(0.5, min(100.0, velocidadeBase))

11.2 Velocidade de descida usada no fundo

velocidadeDescidaAtual = max(0, (-v1h × 0.5) + (-v3h × 0.3) + (-v24h/24 × 0.2)) velocidadeFundo = (velocidadeDescidaAtual × pesoAtual) + (velocidadeDescidaHistorica × pesoHistorico) velocidadeFundo = max(0.5, min(100.0, velocidadeFundo))

11.3 Ajuste no cálculo de subida lenta

SE tendenciaLenta == "subindo_lento" E velocidadeSubidaAtual > 0: subidaPorVelocidade = (velocidadeSubidaAtual × horizonteAtual) / 100 subidaBruta = min(subidaBruta, max(subidaPorVelocidade, subidaBruta × 0.7))

Isso evita que o pico seja projetado muito acima do que a velocidade atual permitiria alcançar dentro do horizonte.

12. Nowcasting de curto prazo (v5.7)

Até a v5.6, o modelo projetava pico ou fundo para horizontes longos (24–96h), usando extrapolação linear da velocidade. Isso gerava previsões que “travavam” por horas seguidas: durante todo o horizonte, o valor previsto permanecia o mesmo, enquanto o rio real já havia mudado de fase.

Problema observado na v5.6:
Montenegro previsto em 7,49 m por mais de 10 horas, enquanto o real caía de 6,39 para 6,24 m. Erro médio absoluto acima de 1,2 m.
Solução (v5.7):
a previsão passa a ser de curto prazo. Em vez de “onde o rio estará em 48h”, o modelo estima onde o rio estará nas próximas horas (com teto por rio).

12.1 Fórmula da projeção de curto prazo

A projeção simula a evolução hora a hora, aplicando uma desaceleração progressiva à velocidade inicial. Rios desaceleram quando se aproximam de um extremo.

fatorDesaceleracao = 0.85 // 15% por hora deslocamento = 0 vel = velocidadeCmH PARA h = 1 ATÉ horas: deslocamento += vel vel *= fatorDesaceleracao retorno = deslocamento / 100 // metros

12.2 Interpretação do fator 0.85

Hora Velocidade relativa Exemplo (vel. inicial = 10 cm/h)
1ª100%10,0 cm
2ª85%8,5 cm
3ª72%7,2 cm
4ª61%6,1 cm
5ª52%5,2 cm
6ª44%4,4 cm

Isso significa que uma onda que começa subindo a 10 cm/h não sobe 60 cm em 6h — sobe aproximadamente 41 cm, porque a velocidade cai progressivamente.

12.3 Horizonte máximo por rio (v5.7)

Rio horizonte_nowcasting
Nova Palmira4 h
Vale Real5 h
Feliz5 h
Bom Princípio6 h
Montenegro8 h
São Sebastião do Caí10 h

13. Horizonte adaptativo à velocidade (v5.8)

A v5.7 introduziu o nowcasting, mas com horizonte fixo por rio. Isso ainda causava um efeito colateral: quando o rio está em transição lenta (subindo ou descendo poucos centímetros por hora), projetar 6–10h à frente é arriscado — pequenas variações acumulam muito erro.

A v5.8 torna o horizonte adaptativo à velocidade instantânea do rio:

13.1 Novo parâmetro por rio

Rio horizonte_min horizonte_nowcasting (máx)
Nova Palmira1,0 h4,0 h
Vale Real1,0 h5,0 h
Feliz1,0 h5,0 h
Bom Princípio1,5 h6,0 h
Montenegro2,0 h8,0 h
São Sebastião do Caí2,0 h10,0 h

13.2 Velocidade absoluta usada

Para escolher o horizonte, o modelo calcula a velocidade absoluta como o maior valor entre as variações de 1h, 3h e 6h:

velocidadeAbsoluta = max(|v1h|, |v3h|, |v6h|)

13.3 Interpolação do horizonte

O horizonte efetivo é interpolado linearmente entre o mínimo e o máximo do rio:

velMin = 0.5 cm/h // abaixo: muito lento velMax = 10.0 cm/h // acima: muito rápido SE velocidadeAbsoluta ≤ velMin: horizonte = horizonte_min SENÃO SE velocidadeAbsoluta ≥ velMax: horizonte = horizonte_nowcasting SENÃO: fator = (velocidadeAbsoluta − velMin) / (velMax − velMin) horizonte = horizonte_min + fator × (horizonte_nowcasting − horizonte_min) // Sanidade horizonte = min(horizonte, 12.0) horizonte = max(horizonte, 0.5) // Arredonda para múltiplos de 0,5h (30 min) horizonte = round(horizonte × 2) / 2

13.4 Efeito prático por rio

Rio Lento (0,5 cm/h) Médio (5 cm/h) Rápido (10+ cm/h)
Nova Palmira 1,0 h 2,5 h 4,0 h
Vale Real 1,0 h 3,0 h 5,0 h
Feliz 1,0 h 3,0 h 5,0 h
Bom Princípio 1,5 h 3,8 h 6,0 h
Montenegro 2,0 h 5,0 h 8,0 h
São Sebastião do Caí 2,0 h 6,0 h 10,0 h
Exemplo real:
Montenegro descendo a 1 cm/h → horizonte ≈ 2,5h. O modelo não fica 8h “chutando” o fundo; concentra-se em prever as próximas 2–3 horas, onde a confiança é maior.

13.5 Campos novos no JSON

previsao.horizonte_horas
Horizonte efetivamente usado (após interpolação)
previsao.horizonte_min_horas
Piso do rio (parâmetro horizonte_min)
previsao.horizonte_max_horas
Teto do rio (parâmetro horizonte_nowcasting)
previsao.velocidade_absoluta
Velocidade que disparou o horizonte (max de |v1h|, |v3h|, |v6h|)

14. Os estados possíveis da onda

Estado Quando ocorre O que o modelo projeta
onda_em_construcao Pico ainda não confirmado e rio subindo/estável Pico (com horizonte adaptativo)
pico_provavelmente_ocorrido Estado de construção, mas rio já caindo consistentemente Fundo (obrigatoriamente abaixo do mínimo)
onda_em_queda Pico confirmado + queda consistente Fundo (com horizonte adaptativo)
onda_estabilizando Pico confirmado, mas queda fraca Fundo (peso maior no histórico)
onda_terminada Fundo já ocorreu e nova subida iniciou Pico da próxima onda

15. Todos os campos do JSON

A API previsao_rio.php?rio=… retorna um JSON com todos os blocos abaixo. Cada campo tem um papel específico na leitura da onda.

15.1 Bloco rio

codigo
Identificador curto (ex.: sao_sebastiao_cai)
nome
Nome exibido
tabela
Tabela no banco (ex.: nivel)

15.2 Bloco atual

nivel_m
Nível mais recente em metros
variacao_hora_cm_h
Variação em 1h (cm)
variacao_3h_cm_h
Média por hora nas últimas 3h
variacao_6h_cm_h
Média por hora nas últimas 6h
variacao_24h_cm
Diferença total em 24h (cm)
medicao
Timestamp da última medição
tendencia
subindo / descendo / estavel

15.3 Bloco onda_atual

estado
Estado da onda (ver seção 14)
pico_confirmado
true/false
pico_m
Maior nível desde o início
pico_em
Timestamp do pico
inicio_m
Menor nível antes do pico
inicio_em
Timestamp do início
subida_atual_m
pico − início
nivel_atual_m
Nível agora
queda_desde_pico_m
pico − nível atual
queda_desde_pico_cm
Mesmo, em cm
fundo_identificado
true se houve subida confirmada após o mínimo
fundo_m
Menor nível após o pico (se confirmado)
fundo_em
Timestamp do fundo
observacao
Texto humano do estado

15.4 Bloco historico

periodo_dias
365 ou 1100
ondas_historicas
Total no histórico
ondas_semelhantes
Ondas com fase similar
ondas_analisadas
min(15, ondas_semelhantes)
ondas_com_fundo_historico
Ondas com fundo utilizável
subida_mediana_m
Mediana das subidas
queda_mediana_m
Mediana das quedas
duracao_subida_mediana_h
Mediana da duração da subida
velocidade_subida_mediana_cm_h
Mediana da velocidade de subida
velocidade_descida_mediana_cm_h
Mediana da velocidade de descida

15.5 Bloco previsao

estado
Estado da previsão
horizonte_horas
Horizonte efetivo usado (v5.8)
horizonte_min_horas
Piso do rio (v5.8)
horizonte_max_horas
Teto do rio (v5.8)
velocidade_absoluta
Velocidade que disparou o horizonte (v5.8)
pico_estimado_m
Pico futuro (se tipo=pico)
subida_estimada_m
Quanto ainda falta subir
horas_estimadas
Tempo até o pico (h)
pico_estimado_em
Timestamp previsto do pico
confianca_historica
alta / media / baixa / muito_baixa
mostrar_pico
true/false
tipo
pico / fundo / null
fundo_estimado_m
Fundo futuro (se tipo=fundo)
fundo_estimado_em
Timestamp previsto do fundo
horas_ate_fundo
Tempo até o fundo (h)
mostrar_fundo
true/false
fundos_historicos_analisados
Quantos fundos entraram

15.6 Bloco confiabilidade_onda

nivel
alta / media / baixa / muito_baixa
percentual
0–100
base
Origem do cálculo
amostra
Quantas ondas entraram

15.7 Bloco confiabilidade_previsao

onda_atual.disponivel
true se há previsão
onda_atual.nivel
alta / media / baixa / muito_baixa
onda_atual.percentual
0–100
onda_atual.tipo
pico / fundo / null
proxima_onda.disponivel
true se há previsão da próxima onda
proxima_onda.nivel
Nível de confiança
proxima_onda.percentual
0–100
proxima_onda.tipo
pico / null

15.8 Bloco proxima_onda

disponivel
true se há fundo observado/projetado
fundo_base_m
Nível do fundo usado como base
fundo_observado
true se o fundo já ocorreu
pico_estimado_m
Pico da próxima onda
subida_estimada_m
Amplitude esperada
horas_ate_pico
Tempo até o pico da próxima onda
pico_estimado_em
Timestamp previsto
confianca
Nível de confiança
confianca_percentual
0–100
ondas_historicas_analisadas
Amostra
diferenca_media_fundo_m
Quão próximo o fundo está dos históricos

15.9 Bloco montante

tendencia
entrada_de_agua / perda_de_agua / indefinida_ou_estavel
estacoes_subindo
Contagem
estacoes_descendo
Contagem
sinais
Detalhes por estação

15.10 Bloco gravacao_previsao

executada
true/false
tendencia
Tendência no momento da gravação
tipo
pico / fundo
erro
Mensagem de erro, se houver
motivo
Motivo de não gravar (duplicado, sem tipo, etc.)
db_dados
Tabela do rio
metros
Valor gravado
data
Data prevista (arredondada para 15 min)
data_original
Data prevista sem arredondamento
criado_em
Momento da gravação

16. Análise de montante (propagação)

O sistema consulta as estações a montante da estação atual e calcula uma tendência agregada.

Alto Caí

Nova Palmira
Vale Real

Médio Caí

Feliz
Bom Princípio

Baixo Caí

São Sebastião do Caí
Montenegro

Para cada estação a montante: v3h = (nível_atual − nível_3h_atrás) × 100 / 3 v6h = (nível_atual − nível_6h_atrás) × 100 / 6 SE v3h ≥ +2 E v6h > 0 → subindo (+1.0) SE v3h ≤ −2 E v6h < 0 → descendo (−0.75) caso contrário → estável (0) forca = soma dos pesos SE forca > +0.5 → entrada_de_agua SE forca < −0.5 → perda_de_agua caso contrário → indefinida_ou_estavel

Quando há entrada_de_agua, o modelo aplica um ajuste de até +5 cm na previsão de pico (na v5.7+, o ajuste foi reduzido para respeitar o nowcasting).

SE tendenciaMontante == "entrada_de_agua": ajuste = min(0.05, max(0.0, forcaMontante) × 0.01) previsaoPico += ajuste

17. Fórmulas completas do modelo (v5.8)

17.1 Variações

v1h = (nível_atual − nível_1h_atrás) × 100 v3h = (nível_atual − nível_3h_atrás) × 100 / 3 v6h = (nível_atual − nível_6h_atrás) × 100 / 6 v24h = (nível_atual − nível_24h_atrás) × 100

17.2 Tendência real

SE v1h ≤ −0.8 E v3h ≤ −0.4 → descendo SE v1h ≥ +0.8 E v3h ≥ +0.4 → subindo SE v1h ≤ −0.5 OU v3h ≤ −0.25 → descendo SE v1h ≥ +0.5 OU v3h ≥ +0.25 → subindo caso contrário → estavel

17.3 Tendência lenta

sinaisSubida = (v1h>0.3) + (v3h>0.2) + (v6h>0.1) + (v24h>5.0) sinaisDescida = (v1h<−0.3) + (v3h<−0.2) + (v6h<−0.1) + (v24h<−5.0) SE sinaisSubida ≥ 3 → subindo_lento SE sinaisDescida ≥ 3 → descendo_lento caso contrário → estavel

17.4 Confirmação do pico

pico_confirmado = (queda_depois_pico ≥ queda_minima_pico) E (maior_sequencia_quedas ≥ 3)

17.5 Pesos das ondas semelhantes

peso = peso_inicio × peso_subida × peso_fase × peso_pico peso_inicio = 1 / (0.50 + |inicio_h − inicio_atual|) peso_subida = 1 / (1.00 + |subida_h − subida_atual|) peso_fase = 1 / (0.25 + |1 − subida_atual/subida_h|) peso_pico = 1 / (0.50 + |pico_h − nível_atual|)

17.6 Velocidades ponderadas

pesoAtual = fator_velocidade pesoHistorico = 1 − fator_velocidade velocidadeSubidaAtual = max(0, v1h×0.5 + v3h×0.3 + (v24h/24)×0.2) velocidadeDescidaAtual = max(0, −v1h×0.5 − v3h×0.3 − (v24h/24)×0.2) velocidadeBase = velocidadeSubidaAtual × pesoAtual + velocidadeProjetada × pesoHistorico

17.7 Horizonte adaptativo (v5.8)

velocidadeAbsoluta = max(|v1h|, |v3h|, |v6h|) velMin = 0.5 cm/h velMax = 10.0 cm/h SE velocidadeAbsoluta ≤ velMin: horizonte = horizonte_min SENÃO SE velocidadeAbsoluta ≥ velMax: horizonte = horizonte_nowcasting SENÃO: fator = (velocidadeAbsoluta − velMin) / (velMax − velMin) horizonte = horizonte_min + fator × (max − min) horizonte = clamp(0.5, 12.0, horizonte) horizonte = round(horizonte × 2) / 2

17.8 Projeção de curto prazo

deslocamento = 0 vel = velocidadeCmH PARA h = 1 ATÉ horizonte: deslocamento += vel vel *= 0.85 // fatorDesaceleracao retorno = deslocamento / 100 // metros

17.9 Projeção de pico

SE tendenciaLenta == "subindo_lento" E velocidadeSubidaAtual > 0: velocidadeBase = max(velocidadeBase, v1h) velocidadeBase = max(0.3, min(80.0, velocidadeBase)) subidaCurto = projetarCurtoPrazo(velocidadeBase, horizonte) SE subidaCurto > 0.02: previsaoPico = nível_atual + subidaCurto previsaoSubida = subidaCurto horasAtePico = horizonte

17.10 Projeção de fundo

SE tendenciaLenta == "descendo_lento" E v1h < 0: velocidadeFundo = max(velocidadeFundo, |v1h|) velocidadeFundo = max(0.3, min(80.0, velocidadeFundo)) quedaCurto = projetarCurtoPrazo(velocidadeFundo, horizonte) SE quedaCurto > 0.02: baseCalculo = min(nível_atual, menorNivelDesdePico) previsaoFundo = baseCalculo − quedaCurto SE previsaoFundo ≥ baseCalculo → null SE previsaoFundo < 0 → 0.01 horasAteFundo = horizonte

17.11 Detecção de pico já ocorrido (v5.5)

picoJaOcorrido = estado == "onda_em_construcao" E tendencia == "descendo" E v1h < 0 E v3h < 0 E v6h < 0 SE picoJaOcorrido: → projeta fundo em vez de pico → previsaoStatus = "pico_provavelmente_ocorrido"

17.12 Ajuste de montante

SE tendenciaMontante == "entrada_de_agua": ajuste = min(0.05, max(0.0, forca) × 0.01) previsaoPico += ajuste

17.13 Arredondamento para 15 minutos

Toda data de previsão (pico_estimado_em, fundo_estimado_em, proxima_onda.pico_estimado_em) é arredondada para o múltiplo de 15 minutos mais próximo (00, 15, 30 ou 45). O campo gravacao_previsao.data_original preserva o timestamp bruto antes do arredondamento.

18. Como interpretar a previsão na prática

Informação O que significa
SUBINDO Tendência de elevação compatível com onda em desenvolvimento.
PICO PARA ONDA ATUAL Onda em desenvolvimento; máximo sendo projetado em horizonte curto.
PICO PROVAVELMENTE OCORRIDO Pico não confirmado formalmente, mas rio já caindo; passa-se a projetar o fundo.
DESCENDO Onda ultrapassou o máximo; projeta-se o fundo em horizonte curto.
PRÓXIMA ONDA Onda anterior terminou; projeta-se o pico da próxima em horizonte curto.

18.1 Lendo o horizonte

O campo previsao.horizonte_horas informa por quantas horas a previsão é válida. Esse valor varia a cada execução, em função da velocidade observada:

19. Ciclo de vida de uma previsão

1. Primeiras medições A onda começa a apresentar tendência.
2. Mais medições Velocidade e fase ficam mais conhecidas.
3. Projeção Sistema estima continuação com horizonte adaptativo.
4. Atualização Novos dados alteram a estimativa.
5. Confirmação Após inversão, extremo vira observação.

20. Limitações

Uma previsão hidrológica é uma estimativa, não uma garantia.

O comportamento real do rio pode se afastar da projeção quando ocorrerem situações diferentes daquelas observadas anteriormente.

Fatores que podem alterar o comportamento:

21. Resumo do processo

DADOS DAS ESTAÇÕES ↓ TRATAMENTO DA SÉRIE ↓ VARIAÇÃO DO NÍVEL (1h / 3h / 6h / 24h) ↓ TENDÊNCIA REAL + TENDÊNCIA LENTA ↓ VELOCIDADE PONDERADA POR RIO ↓ HORIZONTE ADAPTATIVO À VELOCIDADE ↓ DETECÇÃO DA ONDA (início, pico candidato) ↓ CONFIRMAÇÃO DO PICO (queda_minima_pico + 3 quedas) ↓ IDENTIFICAÇÃO DA FASE ↓ COMPARAÇÃO HISTÓRICA (pesos de similaridade) ↓ ANÁLISE DA PROPAGAÇÃO (estações a montante) ↓ DETECÇÃO DE PICO JÁ OCORRIDO ↓ PROJEÇÃO DE CURTO PRAZO (com desaceleração) ↓ DIREÇÃO OBRIGATÓRIA (fundo abaixo do mínimo) ↓ AJUSTE POR MONTANTE (máx +5 cm) ↓ ARREDONDAMENTO PARA 15 MINUTOS ↓ NOVAS MEDIÇÕES ↓ ATUALIZAÇÃO ↓ PICO / FUNDO OBSERVADO ↓ CONFIRMAÇÃO

22. Transparência sobre a previsão

As informações apresentadas pela Central de Previsões são derivadas das medições disponíveis para cada estação e dos cálculos realizados pelo sistema.

Uma estimativa pode ser revisada quando novos dados modificarem a interpretação da onda.

O valor observado posteriormente é a referência para avaliar se a projeção anterior se confirmou.

A versão documentada nesta página é a v5.8, que introduz horizonte adaptativo à velocidade, somando-se às melhorias das versões anteriores: parâmetros por rio (v5.6), detecção de tendência lenta (v5.6), nowcasting de curto prazo (v5.7) e detecção de pico já ocorrido (v5.5).

Sobre o sistema

Rio Caí — Central de Previsões

Sistema desenvolvido para análise automatizada do comportamento hidrológico e identificação de ondas, picos e fundos nas estações monitoradas.

Omeloton IA — omelhor.net