import numpy as np
# -------------------------------
# Definição dos estados
# -------------------------------
estados = ["Ensolarado", "Nublado", "Chuvoso"]
indice_estado = {nome: i for i, nome in enumerate(estados)}
# -------------------------------
# Matriz de transição (exemplo)
# Linhas: estado atual
# Colunas: próximo estado
# Cada linha deve somar 1
# -------------------------------
P = np.array([
[0.7, 0.2, 0.1], # De Ensolarado -> [Ensolarado, Nublado, Chuvoso]
[0.3, 0.4, 0.3], # De Nublado -> [Ensolarado, Nublado, Chuvoso]
[0.2, 0.3, 0.5] # De Chuvoso -> [Ensolarado, Nublado, Chuvoso]
])
def proxima_distribuicao(distribuicao_atual: np.ndarray) -> np.ndarray:
"""
Calcula a distribuição de probabilidade do clima no próximo dia:
π_(t+1) = π_t * P
"""
return distribuicao_atual @ P
def previsao_n_dias(estado_inicial: str, n_dias: int) -> np.ndarray:
"""
Recebe o estado inicial (por exemplo, "Ensolarado") e o número de dias.
Retorna a distribuição de probabilidade dos estados após n_dias.
"""
# Vetor de probabilidade inicial (one-hot)
pi = np.zeros(len(estados))
pi[indice_estado[estado_inicial]] = 1.0
# Aplica a cadeia de Markov n vezes
for _ in range(n_dias):
pi = proxima_distribuicao(pi)
return pi
def previsao_passo_a_passo(estado_inicial: str, n_dias: int):
"""
Mostra a evolução da distribuição dia a dia.
"""
pi = np.zeros(len(estados))
pi[indice_estado[estado_inicial]] = 1.0
print(f"Dia 0 (inicial: {estado_inicial})")
for i, e in enumerate(estados):
print(f" P({e}) = {pi[i]:.3f}")
print()
for dia in range(1, n_dias + 1):
pi = proxima_distribuicao(pi)
print(f"Dia {dia}:")
for i, e in enumerate(estados):
print(f" P({e}) = {pi[i]:.3f}")
print()
if __name__ == "__main__":
# Exemplo 1: distribuição depois de 5 dias
dist_5_dias = previsao_n_dias("Ensolarado", 5)
print("Distribuição após 5 dias (partindo de Ensolarado):")
for i, e in enumerate(estados):
print(f"P({e}) = {dist_5_dias[i]:.3f}")
print("-" * 40)
# Exemplo 2: mostrar dia a dia
previsao_passo_a_passo("Nublado", 7)