1
resposta

[Previsão de clima] - privisão de clima Markov

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)
1 resposta

Olá, Marcelo! Como vai?

Parabéns pela resolução da atividade!

Observei que você explorou o uso de matrizes de transição para modelar probabilidades, utilizou muito bem a multiplicação de vetores para calcular distribuições futuras e ainda compreendeu a importância das cadeias de Markov para prever estados ao longo do tempo.

Permaneça postando as suas soluções, com certeza isso ajudará outros estudantes e tem grande relevância para o fórum.

Fico à disposição! E se precisar, conte sempre com o apoio do fórum.

Abraço e bons estudos!

AluraConte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!